【问题标题】:Submit form to different action with typo3 flow使用typo3流程将表单提交到不同的操作
【发布时间】:2016-09-29 11:44:23
【问题描述】:

我有一个带有用于创建用户的表单的页面。用户有一个爱好,可以通过单击打开用于创建爱好的页面的第二个按钮在同一页面上创建该爱好。创建爱好后,应显示以前的用户表单,并在进入爱好页面之前插入用户输入。

有没有办法在不使用 AJAX 的情况下使用typo3 flow/fluid 做一些事情?

我尝试通过单击 createHobby 按钮将输入提交给不同的操作 --> 该操作重定向到新的爱好页面,用户可以在其中创建爱好,创建后它应该重定向回用户表单用户已填写的输入字段。

我用过……

<input type='submit' value='Create' formaction='/hobby/create' />`

要实现这一点,但似乎 uris 存在一些问题...我收到以下错误:

#1301610453: Could not resolve a route and its corresponding URI for the given parameters.

【问题讨论】:

    标签: php fluid typo3-flow


    【解决方案1】:

    我认为使用属性formaction 并不是适用于所有情况的好解决方案,因为IE 不支持see here。我认为还应该考虑 JavaScript 反向移植(在实际提交表单之前单击第二个按钮时动态更改表单的 action 属性)。

    关于您的错误,您应该不(可能永远)不使用直接 HTML 输入,而是尝试专注于 Fluid ViewHelpers,它允许 TYPO3 创建正确的 HTML 输入。

    试试这个:

    <f:form.submit value="Create" additionalAttributes="{formaction: '{f:uri.action(controller: \'hobby\', action: \'create\')}'}" />
    

    【讨论】:

    • 感谢您的回复。提交操作public function createAction(Hobby $newHobby, User $user){ 时仍然出现错误--> 在我看来,我尝试将参数作为隐藏字段发送,例如this &lt;f:form.hidden name="user" value="{user}"/&gt; ,然后作为additionalParams="{user: '{user}'} -- > 对于这两个我都收到上述错误。仅调用 $this->request->getArgument('user'); 似乎有效...删除隐藏字段和附加参数,但我没有完整的项目...只有身份证。
    • 使用$this-&gt;request-&gt;getArgument 你只会得到id,在initializeAction(或forward action)之后,id 会被转换为对象。上面的错误表示无法解析 url 中的控制器和操作。正如@Romain Canon 所写,URL 必须由流体查看器生成,否则您无法确保获得正确的 url。我建议查看您的模板并使用 viewhelper 来创建您的表单。
    • 确实,你永远不应该为框架决定哪个 URI 应该用于给定的控制器/动作。你得到的错误是你为什么不应该这样做的完美例子。请尝试使用this ViewHelper,如果您仍有问题,请告诉我们。
    • 谢谢大家。它似乎与视图助手一起工作,但我仍然无法获取操作的参数。在我看来,我正在这样做:&lt;f:form id="createHobby" controller="hobby" action="create" class="form-horizontal" objectName="newHobby" method="POST" enctype="multipart/form-data" arguments="userInput: '{userInput}'}"&gt; 而这在控制器 /** * @param Hobby $newHobby * @param User|null $userInput */public function createAction(Hobby $newHobby, User $userInput = null){ $userInput 的 var_dump 中返回 null ....
    • 好的,我想我明白了。参数需要使用视图助手而不是 f:form 中的参数/附加参数来传递。像这样:&lt;f:form.submit value="Create" additionalAttributes="{formaction: '{f:uri.action(controller: \'hobby\', action: \'create\', additionalParams: {paramExample: \'HelloIamAString\'})}'}" /&gt;
    【解决方案2】:

    您可以根据您的操作参数在initializeAction 中创建$this-&gt;forward(...)

    假设您的默认表单操作是“创建”。所以你需要一个initializeCreateAction:

    public function initializeCreateAction()
    {
      if ($this->arguments->hasArgument('createHobby')) {
        $createHobby = $this->request->getArgument('createHobby');
        if ($createHobby) {
          $this->forward('create', 'Hobby', NULL, $this->request->getArguments());
        }
      }
    }
    

    现在您必须将您的输入命名为 createHobby 并分配您的 createAction 这个参数:

    在流体中:

    <f:form.button type="submit" name="createHobby" value="1">Create Hobby</f:form.button>
    

    在您的控制器中:

    public function createAction($formData, $createHobby = false)
    {
     ...
    }
    

    【讨论】:

    • 感谢您的回复。我将您的解决方案与 Romain Canon 的解决方案混合在一起......我在提交操作时仍然遇到错误public function createAction(Hobby $newHobby, User $user){ --> 在我看来,我试图将参数作为隐藏字段发送,例如 &lt;f:form.hidden name="user" value="{user}"/&gt; 和更高版本as additionalParams="{user: '{user}'} --> 对于两者我都收到上述错误。仅调用 $this->request->getArgument('user'); 似乎有效...删除隐藏字段和addionalParmas,但我得到的不是完整的项目......只有id
    【解决方案3】:

    您能再解释一下吗...您显示的内容与typo3无关,我不知道您在哪里插入了它,是什么版本的typo3,使用了任何额外的扩展名?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多