TYPO3: име на бутона за изпращане в extbase

Имам формуляр с бутони за изпращане, запазване, запазване и затваряне, запазване и преглед, запазване и добавяне, както обикновено в TYPO3. Всеки бутон е <input type='image'> елемент и единствената разлика е аргументът name на input. В моя контролер как мога да определя кой бутон за изпращане е щракнат, за да пренасоча към правилното действие?


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


Отговори (2)


Не трябва да пренасочвате към действия от контролера. По-добре е да извикате правилното действие, когато се щракне върху определен бутон. За да запазите логиката ясна, можете да използвате f:link.action viewhelper например. Ето добра документация за viewhelpers: ViewHelper Reference. Можете да зададете действие и атрибут на контролер към този помощник за преглед. Така че няма нужда да решавате кой бутон е бил щракнат в контролера. За да запазите и предадете вашите данни от формуляра, трябва да използвате 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