我在TYPO3中创建了一个搜索表单。用户可以通过选择表单中的选项来过滤结果。使用FLUID表单行来处理表单,如下所示:
<f:form method="POST" action="list" name="eventsearch">
...这正常工作(提交时我注意到URL末尾的cHash)
当用户找到所需的项目时,可以单击该项目将其带到另一个页面。在该页面上,有一个后退按钮,可将它们引导回搜索页面,但是所有过滤后的变量都将丢失,并将它们发送回第一个搜索页面。这是可以预期的,但是有什么方法可以保留此信息?
我尝试通过url引用(带有has键),但这没有用。我还尝试了经典的window.history.back(),但由于搜索表单使用POST,因此它们将不得不再次刷新屏幕。我也尝试过将表单发布交换为GET,但是我收到有关不正确的cHash的错误。
我假设有一种方法,因为FLUID分页按钮可以保留信息,即使它们似乎正在使用GET。
答案 0 :(得分:0)
我会将表单数据存储到用户会话中。这样,无论用户从何处导航回表单,都可以从会话中还原它们。
这意味着,如果您有showFormAction
和showResultsAction
,则需要将表单数据存储在showResultsAction
中,如下所示:
public function showResultsAction(FormData $formData)
{
$this->storeInSession($formData);
// do something with the formData here
}
protected function storeInSession(FormData $formData)
{
if ($GLOBALS['TSFE']) {
$GLOBALS['TSFE']->setAndSaveSessionData('tx_myext_formdata',$formData);
} elseif($GLOBALS['BE_USER']) {
$GLOBALS['BE_USER']->setAndSaveSessionData('tx_myext_formdata',$formData);
}
}
您将像这样在showFormAction
用户下次访问时获取表单数据:
public function showFormAction(FormData $formData = NULL)
{
if ($formData === NULL) {
$formData = $this->getSessionData();
}
$this->view->assign('formData', $formData);
// do more stuff for the form here
}
protected function getSessionData()
{
$formData = NULL;
if ($GLOBALS['TSFE']) {
$formData = $GLOBALS['TSFE']->fe_user->getSessionData('tx_myext_formdata');
} elseif ($GLOBALS['BE_USER']) {
$formData = $GLOBALS['BE_USER']->getSessionData('tx_myext_formdata');
}
return $formData;
}
并将formData交给表单视图助手<f:form method="POST" action="list" name="formData" object="{formData}">
。
FormData是一个DTO,它会将表单的各个字段存储为属性,例如模型,但不持久存储在数据库表中,例如AbstractEntities。通过这种方式,将还原的值返回给表单更容易,因为表单会自动使用DTO中的值预填充其字段。
例如,如果您的表单中有一个字段<f:form.textfield name="somefield" />
,则为FormData DTO提供属性property $somefield = '';
,一个getter和一个setter并将视图帮助器更改为<f:form.textfield property="somefield" />
,该表单将自己处理预填充。
答案 1 :(得分:0)
正如@Kevin Ditscheid所指出的,我可以将表单数据另存为会话数据。使用8.7.10,我使用以下函数存储数据:
$GLOBALS['TSFE']->fe_user->setKey("ses","some_variable_name",$data);
...可以这样检索:
$GLOBALS["TSFE"]->fe_user->getKey("ses","some_variable_name");
当用户通过按钮从另一个页面返回时,我确保URL中包含变量“ returned = 1”。我的控制器类将查找此变量,如果找到该变量,则从我的会话数据中返回表单发布数据。