はじめに
Zend Frameworkは素晴らしいシステムです。 この意見は、このシステムとの密接な「コミュニケーション」の長年にわたって発展してきました。 驚くべきことではありませんが、プログラマーに与えられたいくつかの超大国のためではありませんが、このシステムはプログラマーを驚くほど自分自身のために、プログラマーのために、そして彼自身の開発のためのシンプルで同時に強力な基盤を提供するために改善するように誘うためです。
Zend Frameworkを使用してプロジェクトに取り組んで、私はその機能を最大限に活用することにし、すぐにZend_Formコンポーネントに注意を喚起することにしました(Zend_FormコンポーネントはZend_Formクラスと関連するクラスとインターフェースのセット全体で構成されるため、意図的にクラスではなくZend_Formコンポーネントを呼び出します)。 ドキュメントには、「Zend_Formを使用すると、簡単にフォームを作成してWebアプリケーションで管理できるようになります」と簡単に説明されています。 一般に、これは事実ですが、予備的な準備なしでは、1つの多かれ少なかれ複雑なフォームを作成して表示する前に、7つのポットが外れます。 概念的には、Zend Frameworkのフォームは次のもので構成されます。
- 要素
- デコレータ
- フィルター
- バリデーター
デコレータとは、フォーム要素に論理的に接続されている(それを囲む)レイアウト全体ですが、その一部ではありません。 簡単に言えば、デコレーターはフォーム要素のデザインです。
この記事では、グループデコレータの存在の必要性を証明し、そのコードを公開します。 著者の書癖の実を読むのが面倒な人は、すぐにコードに行くことができます。
それで問題は何ですか?
私の意見では、デコレータの使用は、フォームの実装に関する作業の中で最も困難で骨の折れる作業です。 ドキュメントに記載されている例では、1つのことを除いてすべてが問題ありません。これらはすべて非常に単純で、原始的な例ですらあります。
しかし、このようなものを表示する必要があるとすぐに
そこから問題がどのように始まるか。 主な問題は、Zend_Formコンポーネント内のデコレータのストアが単一レベルの構造を持っていることです。つまり、ネストされたデコレータを作成したり、デコレータのデコレータを作成したりできません。
たとえば、上記のフォームフラグメントは次のコードでエンコードされます。
ご覧のとおり、要素ツリーには2つの独立したブランチがあります。フォーム要素自体(入力)をフレーム化するテーブルセルと、ラベルをフレーム化するセルです。 問題は、ラベルがフォーム要素ではないことです(デコレータでもあります)。 そのため、このような構造を作成するには、ダーティハックの助けを借りて抜け出す必要があります。
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
$ this ->setElementDecorators(array( 'ViewHelper' , array( 'decorator' => array( 'br' => 'HtmlTag' ), 'options' => array( 'tag' => 'span' , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'tdOpen' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'openOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::PREPEND)), array( 'decorator' => array( 'tdClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'closeOnly' => true , 'placement' => Zend_Form_Decorator_Abstract::APPEND)), array( 'decorator' => array( 'label' => 'Label' ), 'options' => array( 'separator' => '*' )), 'Errors' , array( 'decorator' => array( 'mainCell' => 'HtmlTag' ), 'options' => array( 'tag' => 'td' , 'class' => 'tregleft' )), array( 'decorator' => array( 'mainRowClose' => 'HtmlTag' ), 'options' => array( 'tag' => 'tr' )) )); $usernameFieldLabel = $ this ->user_name->getDecorator( 'label' ); $defaultSeparator = $usernameFieldLabel->getOption( 'separator' ); $usernameFieldLabel->setOption( 'separator' , $defaultSeparator. '
"_".' ); * This source code was highlighted with Source Code Highlighter .
欠点の:
- tdの終了タグと開始タグの手動置換
- 分離オプションの誤用
問題解決
グーグル、私は普通の何かを見つけられなかったので、自分のグループデコレータを書くことにしました。
起こったことは次のとおりです。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- <?php
- require_once 'Zend / Form / Decorator / Abstract.php' ;
- class Zend_Form_Decorator_GroupDecorator extends Zend_Form_Decorator_Abstract {
- / **
- *グループ化するアイテム(デコレーター)
- * @var配列
- * /
- protected $ _items = null ;
- / **
- *デコレータ操作を実行するための一時フォーム
- * @var Zend_Form_Element
- * /
- private $ _temporaryDecoratorsContainer = null ;
- / **
- *コンストラクター
- *
- * @param array | Zend_Config $オプション
- * @return void
- * /
- パブリック関数__construct($ options = null ){
- 親:: __構成($オプション);
- $ this- > _ temporaryDecoratorsContainer = new Zend_Form_Element( '_temporaryDecoratorsContainer' 、配列( 'DisableLoadDefaultDecorators' => true ));
- $ this-> getItems();
- }
- / **
- *使用するアイテムを設定する
- *
- * @param array $ items
- * @return Zend_Form_Decorator_GroupDecorator
- * /
- パブリック関数setItems($アイテム){
- $ this-> _ items = $ this-> _ temporaryDecoratorsContainer-> clearDecorators()-> addDecorators($ items)-> getDecorators();
- $ thisを 返します。
- }
- / **
- *タグを取得
- *
- *アイテムが登録されていない場合、setItems()またはオプションとして、空の配列を使用します。
- *
- * @return配列
- * /
- パブリック関数getItems(){
- if ( null === $ this-> _ items){
- if ( null ===($ items = $ this-> getOption( 'items' ))){
- $ this-> setItems(array());
- } else {
- $ this-> setItems($ items);
- $ this-> removeOption( 'items' );
- }
- }
- $ this-> _ items;
- }
- パブリック関数addDecorator($デコレーター、$オプション= null ){
- $ this-> _ temporaryDecoratorsContainer-> addDecorator($デコレーター、$オプション);
- $ thisを 返します。
- }
- パブリック関数clearDecorators(){
- $ this-> _ temporaryDecoratorsContainer-> clearDecorators();
- $ this-> _ items = array();
- }
- パブリック関数getDecorator($ index = null ){
- if ( null === $ index){
- $ this-> _ items;
- }
- if (is_numeric($ index)){
- $ _items = array_values($ this-> _ items);
- return ($ index <count($ _ items))?$ _ items [$ index]: null ;
- }
- if (is_string($ index)){
- return (array_key_exists($ index、$ this-> _ items))?$ this-> _ items [$ index]: null ;
- }
- nullを 返し ます 。
- }
- パブリック関数insertDecoratorBefore($インデックス、$デコレーター、$オプション= null ){
- $ _decoratorsToAdd = $ this-> _ temporaryDecoratorsContainer-> clearDecorators()-> addDecorator($ decorator、$ options)-> getDecorators();
- if (is_string($ index)){
- $ index = array_search($ index、array_keys($ this-> _ items));
- }
- if ( false !== $ index){
- $ first =($ index> 0)?array_slice($ this-> _ items、0、$ index、 true ):array();
- $ last =($ index <count($ this-> _ items))?array_slice($ this-> _ items、$ index、 null 、 true ):array();
- $ this-> _ items = array_merge($ first、(array)$ _ decoratorsToAdd、$ last);
- }
- $ thisを 返します。
- }
- / **
- *デコレータのグループにラップされたコンテンツをレンダリングする
- *
- * @param string $ content
- * @return string
- * /
- public function render($ content){
- $プレースメント= $ this-> getPlacement();
- $ items = $ this-> getItems();
- $ _content = '' ;
- foreach ($アイテムを $ _decorator として ){
- if ($ _decorator instanceOf Zend_Form_Decorator_Interface){
- $ _decorator-> setElement($ this-> getElement());
- $ _content = $ _decorator-> render($ _ content);
- }
- その他 {
- require_once 'Zend / Form / Decorator / Exception.php' ;
- throw new Zend_Form_Decorator_Exception( 'Invalid decorator' 。$ _ decorator。 'provided; must be must string or Zend_Form_Decorator_Interface' );
- }
- }
- スイッチ ($配置){
- ケースの自己::追加:
- $コンテンツを返します。 $ _content;
- 休憩 ;
- ケース自己:: PREPEND:
- $ _contentを返します。 $コンテンツ;
- 休憩 ;
- デフォルト :
- return $ _content。$ content。$ _ content;
- 休憩 ;
- }
- }
- }
- ?>
このデコレータは次のことができます。
- 任意のネストのデコレーターを作成して表示します。したがって、任意の複雑さになります。
- デコレータを使用した操作(追加、削除、挿入)をその場で実行します。これにより、デフォルトのグループデコレータを編集できます。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- <?php
- クラス Form_MemberRegisterはZend_Formを拡張します{
- public function init(){
- $ this-> setDisableLoadDefaultDecorators( true );
- $ this-> addDecorator( 'FormElements' )
- -> addDecorator(array( 'table' => 'HtmlTag' )、array( 'tag' => 'table' 、 'class' => 'treg' ))
- -> addDecorator( 'フォーム' );
- $ this-> addElement( 'text' 、 'user_name' 、array( 'label' => 'Login:' ));
- $ this-> addElement( 'password' 、 'password' 、array( 'label' => 'Password:' ));
- $ this-> addElement( 'password' 、 'password2' 、array( 'label' => 'Repeat password:' ));
- $ this-> addElement( 'text' 、 'email' 、array( 'label' => 'E-mail:' ));
- $ this-> setElementDecorators(array(
- array( 'decorator' => array( 'labelGroup' => 'GroupDecorator' )、 'options' => array( 'items' => array(
- array( 'decorator' => 'Text' 、 'options' => array( 'text' => '*' ))、
- array( 'decorator' => array( 'span' => 'HtmlTag' )、 'options' => array( 'tag' => 'span' 、 'class' => 'red' ))、
- array( 'decorator' => 'Label' 、 'options' => array( 'placement' => Zend_Form_Decorator_Abstract :: PREPEND))、
- array( 'decorator' => array( 'labelCell' => 'HtmlTag' )、 'options' => array( 'tag' => 'td' 、 'class' => 'tregleft' ))
- )))、
- array( 'decorator' => array( 'elementGroup' => 'GroupDecorator' )、 'options' => array( 'items' => array(
- 'ViewHelper' 、
- array( 'decorator' => array( 'elementCell' => 'HtmlTag' )、 'options' => array( 'tag' => 'td' ))
- ))、 'placement' => Zend_Form_Decorator_Abstract :: APPEND)、
- 配列( 'decorator' =>配列( 'mainRowClose' => 'HtmlTag' )、 'オプション' =>配列( 'tag' => 'tr' ))
- ));
- / **
- * @var Zend_Form_Decorator_GroupDecorator
- * /
- $ usernameFieldLabel = $ this- > user_name-> getDecorator( 'labelGroup' );
- $ usernameFieldLabel-> insertDecoratorBefore( 'labelCell' 、array( 'usernameNotes' => $ this-> _ getNotesDecorator($ this-> user_name、 'ログインはラテン文字と記号 "_"のみで構成できます。 " ));
- / **
- * @var Zend_Form_Decorator_GroupDecorator
- * /
- $ emailFieldDecorator = $ this-> email-> getDecorator( 'elementGroup' );
- $ emailFieldDecorator-> insertDecoratorBefore( 'elementCell' 、array( 'emailNotes' => $ this-> _ getNotesDecorator($ this-> email、 '既存の有効なメールのみを入力してください。登録を確認するためにこのアドレスにリンクが送信されます。 ' )));
- }
- 保護された関数_getNotesDecorator($要素、$ notesText = '' ){
- $ _d = new Zend_Form_Decorator_GroupDecorator(array( 'items' => array(
- array( 'decorator' => array( 'notesText' => 'Text' )、 'options' => array( 'text' => $ notesText))、
- array( 'decorator' => array( 'notesTag' => 'HtmlTag' )、 'options' => array( 'tag' => 'small' ))、
- 配列(
- 'decorator' =>配列( 'br' => 'HtmlTag' )、
- 'options' =>配列( 'tag' => 'br' 、 'openOnly' => true 、 'placement' => Zend_Form_Decorator_Abstract :: PREPEND)
- )
- )));
- return $ _d-> setElement($要素);
- }
- }
- ?>
投稿が長すぎることが判明した場合は、事前に謝罪します。
提起された問題に対する別のよりエレガントな解決策があれば、私に知らせてください-私は私の頭に灰を振りかけます:)
PS:テーブルレイアウトの反対者のために、これはプログラミングに関する投稿であり、タイプセッターではないことに注意してください-与えられたテンプレートを表示する必要がありました。