问:如何使用f:form操作和textflield将值传递给控制器​​操作

时间:2018-11-08 15:39:40

标签: typo3 fluid extbase typo3-8.x

我在Typo3 8.7中创建了一个扩展,我想在其中预订一些简短的浮动值。 我创建了一个Fluid表单,该表单应该将信息发送到Controller。但这对我不起作用。我敢肯定,我只是缺少一些基础知识。那么如何将浮点值从文本字段发送到控制器$ 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;
}

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

就像在回答中提到的rudy-gnodde一样,'property'属性只能在将对象传递给表单时使用。如果使用表单呈现模板的操作将“成员”对象传递给了模板,则可以这样绑定它

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

但是,由于您要将该金额添加到现有值而不是简单的值上,因此该解决方案不太适合您。 您应该提供“名称”属性而不是“属性”,而不要传递对象。

<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批注转换您的输入值,因此您需要正确设置。

答案 2 :(得分:0)

“魔术”在您的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

相关问题