TYPO3: имя кнопки отправки в extbase

У меня есть форма с кнопками отправки, чтобы сохранить, сохранить и закрыть, сохранить и просмотреть, а также сохранить и добавить, как обычно в TYPO3. Каждая кнопка представляет собой <input type='image'> элемент, и единственная разница - это name аргумент input. Как в моем контроллере определить, какая кнопка отправки была нажата, чтобы перенаправить на нужное действие?


person Charles Brunet    schedule 25.06.2013    source источник


Ответы (2)


Не следует перенаправлять на действия с контроллера. Лучше вызывать правильное действие при нажатии определенной кнопки. Чтобы не усложнять логику, вы можете, например, использовать f:link.action viewhelper. Вот хорошая документация о средствах просмотра: Справочник по ViewHelper. Вы можете установить действие и атрибут контроллера для этой viewhelper. Так что не нужно решать, какая кнопка была нажата в контроллере. Чтобы сохранить и передать данные формы, вы должны использовать f:form ViewHelpers и записать данные формы в объект.

person Wipster    schedule 26.06.2013
comment
Моя форма отправляется в действие «создать» или «обновить». Из этого действия мне нужно перенаправить на «список» или «новое» действие, в зависимости от того, какая кнопка отправки была нажата. - person Charles Brunet; 27.06.2013

Первой моей проблемой было неправильное имя <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');
    }
}
person Charles Brunet    schedule 27.06.2013