4

私は次のようにZend_Formを拡張するクラスを持っています(簡略化):

class Core_Form extends Zend_Form
{
    protected static $_elementDecorators = array(
        'ViewHelper',
        'Errors',
        array('Label'),
        array('HtmlTag', array('tag' => 'li')),
    );  

    public function loadDefaultDecorators()
    {
        $this->setElementDecorators(self::$_elementDecorators);
    }
}

次に、そのクラスを使用してすべてのフォームを作成します。

class ExampleForm extends Core_Form
{
    public function init()
    {
        // Example Field
        $example = new Zend_Form_Element_Hidden('example');
        $this->addElement($example);
    }
}

私の見解の1つでは、この1つのフィールドのみを表示する必要があります(Zend_Formによって生成されるものは他にありません)。だから私の見解では私はこれを持っています:

<?php echo $this->exampleForm->example; ?>

これは、次のようなフィールドを生成することを除いて、正常に機能します。

<li><input type="hidden" name="example" value=""></li>

これは明らかに、要素デコレータにHtmlTag:tag=>'li'を含めるように設定したためです。

私の質問は、この要素のすべてのデコレータを無効にするにはどうすればよいですか。非表示の入力要素にデコレータは必要ありません。

4

5 に答える 5

5

設定するのに最適な場所は public function loadDefaultDecorators() です

たとえば、次のようにします。

class ExampleForm extends Core_Form
    {
        public function init()
        {
            //Example Field
            $example = new Zend_Form_Element_Hidden('example');
            $this->addElement($example);
        }

        public function loadDefaultDecorators()
        {
            $this->example->setDecorators(array('ViewHelper'));
        }
    }
于 2008-12-18T11:21:53.833 に答える
3

非表示の要素でdd/dtデコレータを無効にすると、dlに有効なアイテムではないものが含まれるため、無効なXHTMLが作成されます。唯一の解決策は、非表示の要素だけでなく、すべてのフォーム要素でこれらのデコレータを無効にし、フォーム全体でも無効にすることです。一貫性を保つために、すべてのフォームでこれを実行することをお勧めします。

私見、これはZFの悪い設計上の決定です。つまり、入力の値が「用語」の「定義」であると言うことは、意味的にはかわいいアイデアですが、完全には考え抜かれていません。

ここで同じ質問:Zend Framework:Zend Form Hidden Elementのデコレータを削除するにはどうすればよいですか?

于 2009-06-28T17:10:36.070 に答える
3

フォーム要素のデコレーターをリセットして、'ViewHelper' のみを使用します。例えば:

<?php echo $this->exampleForm->example->setDecorators(array('ViewHelper')) ; ?>

明らかに、ビューはこれを行うのに理想的な場所ではありませんが、アイデアは得られます。setDecorator***s***() を呼び出すと、新しいデコレータを追加する代わりに、すべてのデコレータがリセットされることに注意してください。

于 2008-12-17T23:54:31.367 に答える
1

この方法で要素を追加する場合:

$this->addElement(
  'text',
  'a1',
  array('required' => true, 'validators' => array('Alpha'))
);

dd/dtこれを使用して、すべての要素のタグを取得できます。

$this->setElementDecorators(array('ViewHelper'));

または、この他の方法で要素を追加する場合:

$nombre1 = new Zend_Form_Element_Text(
          'n1', 
          array('id'=> 'Nombre1', 'validators' => array('Alpha') )
            );
//$nombre1->setDecorators(array('ViewHelper'));
$this->addElement($nombre1);

コメントを外す必要があります:

//$nombre1->setDecorators(array('ViewHelper'));

dd/dtタグを無効にするため。この最後の方法は、現在の要素を無効にするだけで、フォーム内の他の要素は<dd> <dt>通常どおりタグを保持します。

于 2011-05-11T03:09:00.490 に答える
0

これが私がすることです:

class M_Form_Element_Hidden extends Zend_Form_Element_Hidden {
   public function init() {
      $this->setDisableLoadDefaultDecorators(true);
      $this->addDecorator('ViewHelper');
      $this->removeDecorator('DtDdWrapper');
      $this->removeDecorator('HtmlTag');
      $this->removeDecorator('Label');
      return parent::init();
   }
}

次に、フォームで、

$element = new M_Form_Element_Hidden('myElement');
$this->addElement($element);

ソース

于 2011-01-08T18:13:08.517 に答える