3

オブジェクトをマップするすべてのフィールドを持つフォームがあります。このうち、Form クラス内にサブフォームを生成します。これをディスプレイグループでやろうとしているのですが、コントローラーで「サブフォーム」を呼び出すと、フォームのタグ生成されません。どうすれば解決できますか?ありがとう

これがコードです。

<?php
   $username = new Zend_Form_Element_Text('user');
   ...//param for field
   $password = new Zend_Form_Element_Password('pwd');
   ...//param for field
   $name = new Zend_Form_Element_Text('name');
   ...//param for field
   $submit = new Zend_Form_Element_Submit('submit');
   ...//param for field
   $this->addElement(array($user,$password,$name,$submit));
   $this->addDisplayGroup(array($user,$password,$submit),'login');
   $this->addDisplayGroup(array($user,$password,$name, $submit),'create');
?>
4

2 に答える 2

11

サブフォームは、表示グループとは別のものです。サブフォームは、Zend_Form_SubFormインスタンスにネストされたZend_Formインスタンスです。これを使用して、あるフォームを別のフォームに埋め込むことができます。例として、ユーザー プロファイル フォームと登録フォームがあるとします。登録フォームでは、プロファイル値やその他の詳細を入力できます。したがって、このプロファイル フォームを登録フォーム内に埋め込まれたサブフォームとして使用できます。サブフォームは、主に DRY (同じことを繰り返さないでください) の原則、または複数ページのフォームを作成するために使用されます。

表示グループは、グループ化されたいくつかのフォーム要素を視覚的に表現したものです。HTML 構文では、これは a と呼ばれますfieldset。主な目的は、互いに属する要素のグループを作成することです。たとえば、ショッピング カートには、請求先住所グループと配送先住所グループがあるとします。このような表示グループは、主にセマンティクスと視覚的表現に使用されます。

最大の違いの 1 つは、サブフォームの場合、フォームはサブフォームの要素を認識しないのと同様に、表示グループの場合、フォームはそれらのフォーム要素を認識することです。これは、2 つの表示グループを含む 1 つのフォームを作成する必要があることに気付きました。1 つはログイン時、もう 1 つはユーザーの作成 (または登録) 時です。上から与えられたものでは、これに表示グループを使用することはできません。1 つのオプションは、2 つのフォーム インスタンスを使用することです。

class LoginForm extends Zend_Form
{
    public function init ()
    {
        $this->addElement('text', 'user');
        $this->addElement('password', 'pwd');
        $this->addElement('submit', 'submit');
    }
}

class RegisterForm extends Zend_Form
{
    public function init ()
    {
        $this->addElement('text', 'user');
        $this->addElement('password', 'pwd');
        $this->addElement('text', 'name');
        $this->addElement('submit', 'submit');
    }
}

フィールドを再利用したい場合、userサブpwdフォームを使用したい場合:

class BaseForm extends Zend_Form_SubForm
{
    public function init ()
    {
        $this->addElement('text', 'user');
        $this->addElement('password', 'pwd');
    }
}

class LoginForm extends Zend_Form
{
    public function init ()
    {
        $subform = new BaseForm;
        $this->addSubform($subform, 'base');

        $this->addElement('submit', 'submit');
    }
}

class RegisterForm extends Zend_Form
{
    public function init ()
    {
        $subform = new BaseForm;
        $this->addSubform($subform, 'base');
        $this->addElement('text', 'name');

        $this->addElement('submit', 'submit');
    }
}

どちらの場合も、コントローラーでこれらのフォームの 1 つをインスタンス化するだけです。

public function loginAction ()
{
    $form = new LoginForm();
    // More code here

    $this->view->form = $form;
}

public function registerAction ()
{
    $form = new RegisterForm();
    // More code here

    $this->view->form = $form;
}
于 2012-03-19T09:23:43.317 に答える
2

Zend_Form_SubForm<form>デフォルトではタグをレンダリングしません。

そのためには、'Form'レンダリングする前にサブフォーム インスタンスにデコレータを追加する必要があります。

試す:

$mySubForm->addDecorator('HtmlTag', array('tag' => 'dl', 'class' => 'zend_form'))
          ->addDecorator('Form');

次に、ビュー スクリプトで次のことができます。

<?php echo $this->mySubForm; ?>
于 2012-03-19T09:22:23.323 に答える