6

Zend_Elements クラスを使用しながらフォームのレイアウト/デザインを制御する最良の方法と思われるため、ビュー スクリプトを使用して Zend フォームをレンダリングしたいと考えています。

ビュー スクリプトから、要素を でレンダリングします$this->element->getElement('elementName')

要素の名前に問題があります。これは、実際にはフォーム内のサブフォーム内のサブフォームです。

FormElements デコレータを使用したとき、要素の完全修飾名は form[subForm][subForm][element] でした。これは適切でした。viewScript デコレータに移動すると、subForm[subForm][element] に変わりました。

これを修正するには PrepareElements デコレータを使用する必要があることは理解していましたが、これにより名前が form[subForm][form][subForm][subForm][elements] に変更されました (最初の 2 つの名前が 2 倍になりました)。

これをどのように処理すればよいですか?

ありがとう。

更新: PrepareElements をデバッグしようとしましたが、何をしているのか本当にわかりません。最初の反復では問題なく動作するように見えますが、中間のサブフォームの 1 つで実行すると、再び form[subform] プレフィックスが追加されます。

PrepareElements デコレータを使用していないときは、名前に「form」プレフィックスがありません (つまり、form[subForm][element] ではなく、subForm[element] のみを取得します)。

どうにかしてこれを修正することはできますか?

私は属しているToを変更しようとしましたが、それは「subForm」プレフィックスを置き換えただけです。

実際に欠けているのは、サブフォームの属しているメソッドのようです。

繰り返しますが、これはすべて ViewScript デコレータによるものです。FormElements デコレータで問題なく動作します。

更新 2:明確にするために、この名前の変更は気にしませんが、 form->populate を呼び出すと、フィールドにデータが入力されなくなります。

編集:問題をこれに絞り込んだと思います:値をsetDefaultsに戻すと、値は次のように並べられます:

array(
\"formElements1-name\" => value1... \"subFormName\" => array(
\"parentFormName\" => array(
\"subFormName\" => subForm-values-array
)
)

... ここでの主な問題は、"parentFormName" => "subFormNAme"..何を繰り返すかということです。私はすでにメインフォームにいます。を設定したことが原因だと思いますがsetElementsBelongTo(formName[subFormName])、そうしないと、サブフォームの値がフォームから完全に分離されてしまいます。

つまり、配列 = 配列( \"formName\" => 配列( formValues ), \"subFormNAme\" => 配列( subFormValues )

、私はそれがそうであることを期待していますが

array(
formName => array(
subFormNAme => values-array
)
)...

これを機能させることさえ可能ですか?

4

4 に答える 4

8

<?php echo $this->form; ?>ビュースクリプトからフォームを出力しようとしているだけですか?

これは単純なフォームではうまく機能しますが、私のより複雑なフォームでは、各要素を個別にレンダリングする傾向がありますが、これを行うために個々の要素で ViewScript デコレータを使用する必要はありません。ビュースクリプトから次のようなことを試してください:

<div class="form">
    <fieldset>
        <legend>Some Form Name</legend>
        <form action="<?php echo $this->escape($this->form->getAction()) ?>"
              method="<?php echo $this->escape($this->form->getMethod()) ?>"
              enctype="multipart/form-data">

            <?php echo $this->form->id; // render the id element here ?>

            <div class="half">
                <?php echo $this->form->name; // render the user name field here ?>
            </div>
            <div class="half">
                <?php echo $this->form->description; // render the description element here ?>
            </div>
            <div class="clear"></div>

            <div class="half">
                <?php echo $this->form->address1; // render the address ?>
            </div>
            <div class="half">
                <?php echo $this->form->address2; // render address2 ?>
            </div>
            <div class="clear"></div>

            <div class="third">
                <?php echo $this->form->zip; // render zip code ?>
            </div>
            <div class="third">
                <?php echo $this->form->city; // render city ?>
            </div>
            <div class="third">
                <?php echo $this->form->state; // render state ?>
            </div>
            <div class="clear"></div>

            <div class="half">
                <?php echo $this->form->country; // render country ?>
            </div>
            <div class="clear"></div>

            <?php echo $this->form->submit; ?>

        </form>
    </fieldset>
</div>

これは、一部の要素を幅の半分にし、他の要素を全幅にしたいため、ほとんどのフォームを行う方法です。

驚いたことに、リファレンス ガイドには、これができるとは書かれていません。過去にそれに関するページを覚えているようですが、今は見つかりません。Zend Framework を使い始めたとき、自分のフォームを正確に出力するには、複雑なデコレータを作成するしかないと思っていましたが、そうではありませんでした。

Matthew Weier O'Phinney は、 Zend_Form デコレータを個別にレンダリングすることに関する素晴らしいブログ記事を投稿しており、上記で私が行ったことを説明しています。最初は落胆したので、Zend Form の最初のページにこれを追加してほしいと思います。実際、私のフォームの 90% は、フォーム自体を単にエコーするのではなく、要素を個別にレンダリングします。

注: ZF がフォーム要素を dt タグと dd タグで囲まないようにするために、このデコレーターをすべての標準フォーム要素に適用します。すべてのフォームを拡張する基本フォーム クラスがあるので、これをどこでも繰り返す必要はありません。これは要素のデコレータなので、タグを使用して要素を囲むことができます。

public $elementDecorators = array(
    'ViewHelper',
    'Errors',
    array('Description', array('tag' => 'p',    'class' => 'description')),
    array('HtmlTag',     array('tag' => 'div', 'class' => 'form-div')),
    array('Label',       array('class' => 'form-label', 'requiredSuffix' => '*'))
);

送信ボタンに使用する

public $buttonDecorators = array(
    'ViewHelper',
    array('HtmlTag', array('tag' => 'div', 'class' => 'form-button'))
);
于 2011-09-28T22:12:28.703 に答える
2

現在の解決策は、PrepareElements コードの再帰呼び出しを削除するという 1 つの変更を加えて、サブフォームで PrepareElements デコレータを使用することです。また、「setElementsBelongTo」は必要ありません。

これにより、正しい名前と ID が生成されるようです。

于 2011-10-04T13:15:08.207 に答える
0

belongsTo()解決策は、フォーム要素プロパティを使用することです。
例 :

new Zend_Form_Element_Text('<elementName>', array('belongsTo' => '<subformName>'))

このように、render() メソッドは次のようなフォーム要素名を使用します。

name="<subformName>[<elementName>]"
于 2012-07-12T13:33:24.327 に答える