Как создать подчиненную форму формы - Zend Framework - PullRequest
3 голосов
/ 19 марта 2012

У меня есть форма со всеми полями, которые отображают объект.Из этого я бы сгенерировал подчиненную форму в классе Form.Я пытаюсь сделать это с помощью displaygroup, но при вызове «subform» в контроллере тег 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');
?>

Ответы [ 2 ]

11 голосов
/ 19 марта 2012

Подформа - это нечто иное, чем группа отображения. подчиненная форма - это экземпляр Zend_Form_SubForm, вложенный в экземпляр Zend_Form. Вы можете использовать это для встраивания одной формы в другую. Например, у вас может быть форма профиля пользователя и форма регистрации. В форме регистрации вы можете ввести значения профиля, а также некоторые другие детали. Таким образом, вы можете использовать эту форму профиля как подчиненную форму, встроенную в форму регистрации. Подформа в основном используется для принципов СУХОЙ (не повторяйся) или для создания многостраничной формы.

A группа отображения - это просто визуальное представление некоторых элементов формы, сгруппированных вместе. В синтаксисе HTML это называется fieldset. Основная цель - создать группы элементов, которые принадлежат друг другу. Например, в корзине покупок может быть группа адресов счетов-фактур и группа адресов доставки. Такая группа отображения в основном используется для семантики и визуального представления.

Одно из самых больших отличий заключается в том, что для групп отображения форма осведомлена об этих элементах формы, так как в случае с подчиненными формами форма не имеет сведений об элементах подчиненных форм. При этом я заметил, что вы хотите создать одну форму, которая содержит две группы отображения: одну при входе в систему, другую при создании (или регистрации) пользователя. С учетом приведенного выше вы не можете использовать для этого группы отображения. Один из вариантов - использовать два экземпляра формы:

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');
    }
}

В обоих случаях вы можете просто создать одну из этих форм в вашем контроллере:

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;
}
2 голосов
/ 19 марта 2012

Zend_Form_SubForm не отображает <form> теги по умолчанию.

Чтобы сделать это, вам нужно добавить декоратор 'Form' к вашему экземпляру подчиненной формы перед его рендерингом.

Попробуйте:

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

и затем в вашем скрипте вида вы можете сделать:

<?php echo $this->mySubForm; ?>
...