У меня есть форма с кнопками отправки, чтобы сохранить, сохранить и закрыть, сохранить и просмотреть, а также сохранить и добавить, как обычно в TYPO3. Каждая кнопка представляет собой <input type='image'>
элемент, и единственная разница - это name
аргумент input
. Как в моем контроллере определить, какая кнопка отправки была нажата, чтобы перенаправить на нужное действие?
TYPO3: имя кнопки отправки в extbase
Ответы (2)
Не следует перенаправлять на действия с контроллера. Лучше вызывать правильное действие при нажатии определенной кнопки. Чтобы не усложнять логику, вы можете, например, использовать f:link.action
viewhelper. Вот хорошая документация о средствах просмотра: Справочник по ViewHelper. Вы можете установить действие и атрибут контроллера для этой viewhelper. Так что не нужно решать, какая кнопка была нажата в контроллере. Чтобы сохранить и передать данные формы, вы должны использовать f:form
ViewHelpers и записать данные формы в объект.
Первой моей проблемой было неправильное имя <input>
. Чтобы получить правильное имя, мне нужно создать тег, используя ViewHelper, производный от AbstractFormFieldViewHelper
.
Теперь, когда тег <input>
отображается правильно, я могу видеть имя нажатого <input>
на $this->request->arguments
.
Для полноты, вот код ViewHelper, который я использовал:
class IconSubmitViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFieldViewHelper {
/**
* @var string
*/
protected $tagName = 'input';
/**
* Initialize the arguments.
*
* @return void
* @api
*/
public function initializeArguments() {
parent::initializeArguments();
$this->registerArgument('icon', 'string', 'Icon name', true, 'actions-document-close');
$this->registerTagAttribute('src', 'string', 'Image source', false, 'clear.gif');
$this->registerUniversalTagAttributes();
}
/**
* Renders an icon link as known from the TYPO3 backend
*
* @return string the rendered icon link
*/
public function render() {
$name = $this->getName();
$this->registerFieldNameForFormTokenGeneration($name);
$this->tag->addAttribute('type', 'image');
$this->tag->addAttribute('name', $name);
$this->tag->addAttribute('class', 'c-inputButton');
return \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon($this->arguments['icon'], array('title' => $this->arguments['title'], 'html' => $this->tag->render()));
}
}
А вот код в контроллере, который перенаправляет на нужную страницу:
private function submitRedirect($myobject) {
if ($this->request->hasArgument('_savedok')) {
$this->redirect('edit', NULL, NULL, array('myobject'=>$myobject));
}
if ($this->request->hasArgument('_savedokclose')) {
$this->redirect('list');
}
if ($this->request->hasArgument('_savedoknew')) {
$this->redirect('new');
}
}