问:如何使用 f:form 动作和文本字段将值传递给控制器​​动作

Q: How to pass an value to controller action with f:form action & textflield

我在 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;
}

使用 name 而不是 property,如 <f:form.textfield name="money" />。当您将对象添加到 f:form 并希望该字段成为其属性之一时,将使用 property。例如:

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

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

"magic" 在您的 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

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

<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>

请注意,这需要 'member' 实例更新传递给模板。

您的控制器应如下所示

/**
 * @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 注释转换您的输入值,因此您需要正确处理。