Отправить форму в другое действие с потоком typo3

У меня есть страница с формой для создания пользователей. У пользователя есть хобби, которое можно создать на этой же странице, нажав на вторую кнопку, открывающую страницу создания хобби. После создания хобби перед переходом на страницу хобби должна отображаться предыдущая пользовательская форма с введенными пользователем данными.

Есть ли способ сделать что-то вроде потока/жидкости typo3 без использования AJAX?

Я попытался отправить ввод в другое действие, нажав кнопку «СоздатьХобби» --> Действие перенаправляет на новую страницу хобби, где пользователь может создать хобби, и после создания оно должно перенаправить обратно в пользовательскую форму с уже заполненным поля ввода пользователем.

Я использовал...

<input type='submit' value='Create' formaction='/hobby/create' />`

чтобы добиться этого, но, похоже, есть некоторые проблемы с uris... Я получаю следующую ошибку:

#1301610453: Could not resolve a route and its corresponding URI for the given parameters.

person Tiero L.    schedule 29.09.2016    source источник


Ответы (3)


Я думаю, что использование атрибута formaction не является хорошим решением для каждого случая, так как он не поддерживается IE ‹ 10, как вы можете см. здесь. Я думаю, что следует также рассмотреть возможность поддержки JavaScript (динамическое изменение атрибута action формы при нажатии на вторую кнопку перед фактической отправкой формы).

Что касается вашей ошибки, вам не следует — и, вероятно, никогда — не использовать прямой ввод HTML, вместо этого постарайтесь сосредоточиться на Fluid ViewHelpers, которые позволяют TYPO3 создавать правильный ввод HTML.

Попробуйте это вместо этого:

<f:form.submit value="Create" additionalAttributes="{formaction: '{f:uri.action(controller: \'hobby\', action: \'create\')}'}" />
person Romain Canon    schedule 29.09.2016
comment
Спасибо за ваш ответ. Я все еще получаю сообщение об ошибке при отправке действия public function createAction(Hobby $newHobby, User $user){ --› На мой взгляд, я пытался отправить параметры в виде скрытых полей, таких как this <f:form.hidden name="user" value="{user}"/> , а затем как AdditionalParams={user: '{user}'} --› для обоих я получаю вышеуказанная ошибка. Только вызов $this-›request-›getArgument('user'); кажется, работает... удаление скрытых полей и дополнительных параметров, но я получаю не весь проект... только идентификатор. - person Tiero L.; 29.09.2016
comment
С $this->request->getArgument вы получаете только идентификатор, после initializeAction (или прямого действия) идентификатор преобразуется в объект. Ошибка выше говорит о том, что контроллер и действие в URL-адресе не могут быть разрешены. Как пишет @Romain Canon, URL-адрес должен быть сгенерирован с помощью Fluid ViewHelper, в противном случае вы не можете быть уверены, что получите правильный URL-адрес. Я рекомендую просмотреть ваш шаблон и использовать viewhelper для создания формы. - person René Pflamm; 29.09.2016
comment
Действительно, вы никогда не должны решать для платформы, какой URI следует использовать для данного контроллера/действия. Ошибка, которую вы получаете, является прекрасным примером того, почему вы не должны этого делать. Попробуйте использовать этот ViewHelper и сообщите нам, есть ли у вас еще проблема. - person Romain Canon; 30.09.2016
comment
Спасибо ребята. Кажется, это работает с помощником представления, но я все еще не могу получить параметры для действия. Я делаю это, на мой взгляд: <f:form id="createHobby" controller="hobby" action="create" class="form-horizontal" objectName="newHobby" method="POST" enctype="multipart/form-data" arguments="userInput: '{userInput}'}"> и это в контроллере /** * @param Hobby $newHobby * @param User|null $userInput */public function createAction(Hobby $newHobby, User $userInput = null){ var_dump $userInput возвращает null .... - person Tiero L.; 30.09.2016
comment
Хорошо, я думаю, я понял. Параметры необходимо передавать с помощью помощника представления, а не аргументов/дополнительных параметров в форме f:. Вот так: <f:form.submit value="Create" additionalAttributes="{formaction: '{f:uri.action(controller: \'hobby\', action: \'create\', additionalParams: {paramExample: \'HelloIamAString\'})}'}" /> - person Tiero L.; 30.09.2016
comment
Кажется, это работает для строк, но не в представлении: <f:form.submit value="Create" additionalAttributes="{formaction: '{f:uri.action(controller: \'hobby\', action: \'create\', additionalParams: {userInput: \'{userInput}\'})}'}" /> --> снова ведет к #1301610453: Could not resolve a route and its corresponding URI for the given parameters.... Есть идеи? - person Tiero L.; 30.09.2016

Вы можете сделать $this->forward(...) в initializeActionв зависимости от параметра вашего действия.

Давайте представим, что ваше действие формы по умолчанию — «создать». Итак, вам нужен initializeCreateAction:

public function initializeCreateAction()
{
  if ($this->arguments->hasArgument('createHobby')) {
    $createHobby = $this->request->getArgument('createHobby');
    if ($createHobby) {
      $this->forward('create', 'Hobby', NULL, $this->request->getArguments());
    }
  }
}

Теперь вы должны назвать свой вход createHobby и назначить свой createAction этот параметр:

В жидкости:

<f:form.button type="submit" name="createHobby" value="1">Create Hobby</f:form.button>

В вашем контроллере:

public function createAction($formData, $createHobby = false)
{
 ...
}
person René Pflamm    schedule 29.09.2016
comment
Спасибо за ваш ответ. Я смешал ваше решение с решением Romain Canon.... Я все еще получаю сообщение об ошибке при отправке действия public function createAction(Hobby $newHobby, User $user){ --> На мой взгляд, я пытался отправить параметры в виде скрытых полей, таких как это <f:form.hidden name="user" value="{user}"/>, а затем как AdditionalParams={ user: '{user}'} --› для обоих я получаю указанную выше ошибку. Только вызов $this-›request-›getArgument('user'); вроде работает... удаляю скрытые поля и дополнительные параметры, но получаю не весь проект... только id - person Tiero L.; 29.09.2016

можете ли вы объяснить кое-что еще ... то, что вы показываете, не имеет ничего общего с typo3, я не знаю, где вы это вставили, какую версию typo3, используя какое-либо дополнительное расширение?

person webMan    schedule 29.09.2016