0

TYPO3でいつものように、送信ボタンを保存、保存して閉じる、保存して表示、保存して追加するフォームがあります。各ボタンは<input type='image'>アイテムであり、唯一の違いnameinput. 私のコントローラーでは、正しいアクションにリダイレクトするために、どの送信ボタンがクリックされたかをどのように判断できますか?

4

2 に答える 2

0

コントローラーからアクションにリダイレクトしないでください。特定のボタンがクリックされたときに正しいアクションを呼び出す方がよいでしょう。ロジックを明確にするために、f:link.actionたとえばビューヘルパーを使用できます。ビューヘルパーに関する優れたドキュメントは次のとおりです: ViewHelper Reference。このビューヘルパーにアクションとコントローラー属性を設定できます。そのため、コントローラーでどのボタンがクリックされたかを判断する必要はありません。フォーム データを保持して渡すには、f:formViewHelpers を使用し、フォーム データをオブジェクトに書き込む必要があります。

于 2013-06-26T07:50:27.177 に答える
0

私が最初に抱えた問題は、名前が<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');
    }
}
于 2013-06-27T18:27:58.683 に答える