【问题标题】:Q: How to pass an value to controller action with f:form action & textflield问:如何使用 f:form 动作将值传递给控制器​​动作到文本字段
【发布时间】:2018-11-08 15:39:40
【问题描述】:

我在 Typo3 8.7 中创建了一个扩展,我想在其中预订一些短浮动值。 我创建了一个流体表单,它应该将信息发送给控制器。但这对我不起作用。我很确定我只是缺少一些基础知识。那么如何将文本字段中的浮点值发送到控制器 $money 变量?

流体形式看起来像这样

<f:form action="addbalance" >
    <f:form.textfield property="money"/>
    <f:form.submit value="send"/>
</f:form>

那是我的控制器

public function addBalanceAction(\Awesome\Creditext\Domain\Model\Member $Member, $money)
{
    $this->addFlashMessage('Updated assets', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::OK);
    $Member->addBooking($money);
    $this->MemberRepository->update($Member);
    $this->redirect('list');
}

addBooking 函数

public function addBooking($value)
{
    $this->ownbalance += $value;
}

【问题讨论】:

    标签: typo3 fluid extbase typo3-8.x


    【解决方案1】:

    使用name 代替property,例如&lt;f:form.textfield name="money" /&gt;。当您将对象添加到 f:form 并希望该字段显示/编辑其属性之一时,将使用 property。例如:

    <f:form action="edit" object="{person}">
        <f:form.textfield property="name" />
    </f:form>
    

    此字段将显示给定 person 对象的 name 属性。

    【讨论】:

      【解决方案2】:

      就像 rudy-gnodde 在他的回答中所说,“property”属性只能在将对象传递给表单时使用。如果使用表单渲染您的模板的操作将“成员”对象传递给模板,您可以像这样绑定它

      <f:form action="addBalance" object="{member}">
          <f:form.textfield property="ownbalance" />
      </f:form>

      但是,由于您将该数量添加到现有值而不是简单集合中,因此该解决方案对您来说不太适用。 您应该提供 'name' 属性而不是 'property',并且不要传递对象。

      <f:form action="addBalance">
          <f:form.hidden name="member" value="{member}" />
          <f:form.textfield name="balanceToAdd" />
          <f:form.submit value="send" />
      </f:form>

      请注意,这需要将“成员”实例更新传递给模板。

      你的控制器应该是这样的

      /**
       * @param \Awesome\Creditext\Domain\Model\Member $member
       * @param float $balanceToAdd
       */
      public function addBalanceAction(\Awesome\Creditext\Domain\Model\Member $member, $balanceToAdd){
          // code to add the balance goes here
      }
      

      Extbase 会根据 phpdoc 注释转换您的输入值,因此您需要正确处理这些值。

      【讨论】:

        【解决方案3】:

        “魔法”在您的 PHP 文档中...... Extbase 系统分析您的 php 文档并转换值:

        /**
         * @param \Awesome\Creditext\Domain\Model\Member $Member
         * @param float                                  $money
         */
        public function addBalanceAction(\Awesome\Creditext\Domain\Model\Member $Member, $money)
        {
          ...
        }
        

        但不要忘记:php 使用点作为小数分隔符。因此,如果您使用逗号分隔,建议在您的 initializeAction 中将逗号替换为点,如下所示:

        public function initializeAddBalanceAction()
        {
          if ($this->request->hasArgument('money')) {
            $money = str_replace(',', '.', $this->request->getArgument('money');
            $this->request->setArgument('money', $money);
          }
        }
        

        但请注意进行更多检查,因为逗号用作千位分隔符,如果您的前端用户使用点和逗号分隔,这可能会再次破坏浮点数。

        正如 Rudy 在他的回答中所写,属性应该是 name 而不是 property

        【讨论】:

        • 这对我有用,但我还需要在表单操作中添加一个对象。感谢大家的帮助
        • arguments="{Member:Member}" 添加到 FormViewHelper 以将 Member 对象添加到您的表单。我以为你只为这个问题留下了它
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多