问:如何使用 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 注释转换您的输入值,因此您需要正确处理。
我在 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 注释转换您的输入值,因此您需要正确处理。