Имам формуляр с бутони за изпращане, запазване, запазване и затваряне, запазване и преглед, запазване и добавяне, както обикновено в TYPO3. Всеки бутон е <input type='image'>
елемент и единствената разлика е аргументът name
на input
. В моя контролер как мога да определя кой бутон за изпращане е щракнат, за да пренасоча към правилното действие?
TYPO3: име на бутона за изпращане в extbase
Отговори (2)
Не трябва да пренасочвате към действия от контролера. По-добре е да извикате правилното действие, когато се щракне върху определен бутон. За да запазите логиката ясна, можете да използвате f:link.action
viewhelper например. Ето добра документация за viewhelpers: ViewHelper Reference. Можете да зададете действие и атрибут на контролер към този помощник за преглед. Така че няма нужда да решавате кой бутон е бил щракнат в контролера. За да запазите и предадете вашите данни от формуляра, трябва да използвате 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');
}
}