Q: Как передать значение в действие контроллера с помощью f: form action & textflield - PullRequest
0 голосов
/ 08 ноября 2018

Я создал расширение в Typo3 8.7, где я хочу записать некоторое короткое плавающее значение. Я создал форму Fluid, которая должна отправить информацию контроллеру. Но это не работает для меня. Я почти уверен, что мне там не хватает некоторых основ. Так как же я могу отправить значение с плавающей точкой из текстового поля в переменную $ 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');
}

функция добавления книг

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

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

"Волшебство" в вашем документе 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);
  }
}

Но имейте в виду, что нужно делать больше проверок, потому что запятая используется как разделитель тысяч, и если ваш пользователь внешнего интерфейса использовал точку и запятую для разделения, это может снова разорвать поплавок.

Как пишет Руди в своем ответе, атрибут должен name, а не property.

0 голосов
/ 09 ноября 2018

Как и в своем ответе 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, поэтому вам нужно правильно их настроить.

0 голосов
/ 08 ноября 2018

Используйте 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 объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...