TYPO3(8.7.10)导航回到上一页,记住发布的值

时间:2018-12-06 16:31:50

标签: php post search typo3 fluid

我在TYPO3中创建了一个搜索表单。用户可以通过选择表单中的选项来过滤结果。使用FLUID表单行来处理表单,如下所示:

<f:form method="POST" action="list" name="eventsearch">

...这正常工作(提交时我注意到URL末尾的cHash)

当用户找到所需的项目时,可以单击该项目将其带到另一个页面。在该页面上,有一个后退按钮,可将它们引导回搜索页面,但是所有过滤后的变量都将丢失,并将它们发送回第一个搜索页面。这是可以预期的,但是有什么方法可以保留此信息?

我尝试通过url引用(带有has键),但这没有用。我还尝试了经典的window.history.back(),但由于搜索表单使用POST,因此它们将不得不再次刷新屏幕。我也尝试过将表单发布交换为GET,但是我收到有关不正确的cHash的错误。

我假设有一种方法,因为FLUID分页按钮可以保留信息,即使它们似乎正在使用GET。

2 个答案:

答案 0 :(得分:0)

我会将表单数据存储到用户会话中。这样,无论用户从何处导航回表单,都可以从会话中还原它们。 这意味着,如果您有showFormActionshowResultsAction,则需要将表单数据存储在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”。我的控制器类将查找此变量,如果找到该变量,则从我的会话数据中返回表单发布数据。