5

私はこれができるはずだと思いますが、何と言えば、私はそれを理解できませ。私は目が揚げるまでrtfmをしました。私は、Zendのドキュメントが提供する詳細な説明や、このタイプの質問が通常生成する典型的な「デコレータの使用」の応答ではなく、例によって最もよく学びます。私が必要としているのは、次のようなマークアップです。

<dt>
    <label for="name">Name</label>
</dt>
<dd>
    <input type="text" name="name" id="name" value="">
    <a href="#">My Link</a>
</dd>

入力後の追加のLINKを除いて、すべてバニラです。はい、それはddの内側、リンクのすぐ隣にあり、それは私が起こらないことです。

上記のHTMLを作成するために使用した(わずかに変更された)コードは次のとおりです

$name = new Zend_Form_Element_Text( 'name' );
$name->setLabel( 'Name' );        
$this->addElements( $name );
$this->addDisplayGroup( array( 'name' ), 'people');

サンプルコードやより良い説明は、この初心者をとても幸せにするでしょう。

乾杯!

4

3 に答える 3

24

メーリング リストのこのスレッドへの返信と、これに関する私のブログ投稿を参照してください。基本的には、アーロンが説明したのと同じプロセスです。

description プロパティを使用してリンクを保持することもできます (テストされていません)。

<?php
$foo = new Zend_Form_Element_Text('name');
$foo->setLabel('Name')
    ->setDescription('<a href="#">Link</a>')
    ->setDecorators(array(
        'ViewHelper',
        array('Description', array('escape' => false, 'tag' => false)),
        array('HtmlTag', array('tag' => 'dd')),
        array('Label', array('tag' => 'dt')),
        'Errors',
      ));
$form->addElement($foo);

デコレータの が機能するかどうかはわかりません'tag'=>falseが、試してDescriptionみる価値はあります。申し訳ありませんが、現在これをテストできません。現在、開発ボックスが壊れています。失敗した場合は、これら 2 つのリンクで説明されている手動のデコレーター レンダリング方法を試してください。

于 2009-03-14T13:05:55.160 に答える
5

ビュースクリプトを介してデコレータを完全に制御しようとしていると思います:

Zend フレームワーク マニュアル

基本的に、要素の viewScript プロパティをスクリプトへのパスに設定し、送信したい追加情報 (作成中のリンクの linkHref またはタイトルなど) を渡します。

$name = new Zend_Form_Element_Text( 'name' );
$name->setLabel( 'Name' );   
$name->viewScript = 'path/to/viewScript.phtml';
$name->decorators = array('ViewScript', array('linkHref' => '#',
                                              'linkTitle' => 'My Link');
$this->addElements( $name );
$this->addDisplayGroup( array( 'name' ), 'people');

次に、viewScript は次のようになります。Zend_Form_Element のインスタンス内にすべてのヘルパーがどのように含まれているかはわかりませんが、次のようなものです。

<dt><?= $this->formLabel($this->element->getName(),
                     $this->element->getLabel()) ?></dt>
<dd><?= $this->{$this->element->helper}(
                     $this->element->getName(),
                     $this->element->getValue(),
                     $this->element->getAttribs()
                ) ?>
<a href="<?= $this->linkHref; ?>"><?= $this->linkTitle; ?></a>
<?= $this->formErrors($this->element->getMessages()) ?>

</dd>

かなりDRYでありながら、要素を100%制御できるため、viewScriptで実行する方が良い場合があります。

于 2009-03-13T22:51:14.863 に答える
1

アーロンの投稿にいくつかのサポートを追加するだけで、本当に単純なことをするために何時間もヘッドバッシングした後(これはフレームワークを持つことのポイントを無効にするようです)、これがチェックボックスで機能しないことがわかった場合、それはあなたがしなければならないからですこれを .phtml で使用します (Aaron の例に基づく):

<dt><?= $this->formLabel($this->element->getName(),
                     $this->element->getLabel()) ?></dt>
<dd><?= $this->{$this->element->helper}(
                     $this->element->getName(),
                     $this->element->getValue(),
                     $this->element->getAttribs(),
                     $this->element->options
                ) ?>
<a href="<?= $this->linkHref; ?>"><?= $this->linkTitle; ?></a>
<?= $this->formErrors($this->element->getMessages()) ?>

</dd>

オプション!オプション!オプション!私があなたを見つける必要があるとき、あなたはどこにいましたか?! チェックボックスを使用している場合は、ヘルパーに次を追加することを忘れないでください。

$this->element->options

これはZend_Form_Element_Checkboxで利用規約チェックボックスを追加するのに適しています (これは SEO 用です) 。

于 2010-01-15T14:58:11.127 に答える