1

Zend_Form でこの自動化されたフォームを完成させようとして気が狂いそうになりました。すでにほとんどすべてのことを行っていますが、すべて Stackoverflow コミュニティのおかげです。これが私がやりたいことです、私は自分自身を明確にしようとします(私は自分自身を説明するのが難しいです-_-''):

私がすでに行ったこと:各要素のラベルと入力をdiv内にラップし、それぞれを適切なtwitterスパンクラスでラップして上位のdivに入力し、フォーム自体がデータの配列を受け取り、それを自動的に生成します。

必要なもの: 私の優れた Div は Span:12 (レイアウト内) です。コンテンツには 2 つの "Span:6" div が必要で、各 div は同じフォームのパーツを保持する必要があります。

私が思いついた解決策:

私の解決策の 1 つは、各要素を個別に取得し、各 span6 div に手動で配置することです。もう1つは、関数に「コンテナ」パラメーターを作成することです。これにより、ジェネレーターはそれを実行できます(ただし、スパンクラスで2つのdivを作成し、それぞれの要素に要素を追加する方法がわかりません)

私がやろうとしていることと必要なことを皆さんが理解してくれることを願っています, ありがとう =)

form/Usuario:

<?php
class Admin_Form_Usuario extends Zene_Form_Helper_Abstract
{
    protected $campo = null;
    /**
     * Initialize form (used by extending classes)
     *
     * @return void
     */

    public function init()
    {   

        //Valores dos Campos 
        $model = new Admin_Model_Usuario();
        $option = $model->getOptions();


        $modelPage = new Admin_Model_Page();
        $optionPage = $modelPage->getOptions();

        //Atributos dos Campos
        $this->campo = array(
                array('Tipo'=>'Text',   'Id'=>'UsuId',          'Label'=>'Código do Usuário',   'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'UsuId','Atributo'=>array('readonly'=>'true')),
                array('Tipo'=>'Select', 'Id'=>'UsuFunId',       'Label'=>'Funcionário',         'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'UsuFunId','Option'=>array(1=>'Guest',2=>'Charles')),
                array('Tipo'=>'Text',   'Id'=>'UsuLogin',       'Label'=>'Login do Usuário',    'Span' =>'12',  'Required'=>'true', 'Table'=>'Usuario','Field'=>'UsuId'),
                array('Tipo'=>'Pass',   'Id'=>'UsuSenha',       'Label'=>'Senha Usuário',       'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'UsuSenha'),
                array('Tipo'=>'Pass',   'Id'=>'ConfUsuSenha',   'Label'=>'Confirmar Senha',     'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'ConfUsuSenha'),
                array('Tipo'=>'Check',  'Id'=>'full_permission','Label'=>'Permissão Total',     'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'full_permission'),
                array('Tipo'=>'Check',  'Id'=>'UsuAtivo',       'Label'=>'Ativo',               'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'UsuAtivo'),
                array('Tipo'=>'Date',   'Id'=>'UsuDtAtivo',     'Label'=>'Data ativação',       'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'UsuDtAtivo','Atributo'=>array('readonly'=>'true')),
                array('Tipo'=>'Date',   'Id'=>'UsuDtDesativo',  'Label'=>'Data Desativação',    'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'UsuDtDesativo','Atributo'=>array('readonly'=>'true')),
                array('Tipo'=>'Select', 'Id'=>'Parent_id',      'Label'=>'Grupo',               'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'Parent_id','Option'=>$option),
                //array('Tipo'=>'MSelect','Id'=>'Parent_id',    'Label'=>'Grupo',               'Span' =>'6',   'Required'=>'true', 'Table'=>'Usuario','Field'=>'Parent_id','Option'=>$option),
                array('Tipo'=>'Submit', 'Id'=>'save',           'Label'=>'Salvar',              'Span' =>'12'   )
        );

        parent::createElemento($this->campo);

    }


Helper Abstract (gera o form) e o executa o `parent::createElemento()`
<?php
abstract class Zene_Form_Helper_Abstract extends Zend_Form{
    /**
     * Metodo para retornar um lemento criado apartir de um array
     * deve seguir a seguinte estrutura;
     * @see Zend_Form::getElement()
     */
    public function createElemento(array $options){

        $element = null;
        foreach ($options as $option)
        {
            switch ($option['Tipo']) {
                case 'Hidden':
                    $element = new Zend_Form_Element_Hidden($option['Id']);
                    break;
                case 'Select':
                    $element = new Zend_Form_Element_Select($option['Id']);
                    $element->addMultiOptions($option['Option']);
                    break;
                case 'Date':
                    $element = new Zend_Form_Element_Text($option['Id']);
                    $element->setAttrib("class", "datepicker");
                    break;
                case 'Check':
                    $element = new Zend_Form_Element_Checkbox($option['Id']);
                    break;
                case 'MCheck':
                    $element = new Zend_Form_Element_MultiCheckbox($option['Id']);
                    $element->addMultiOptions($option['Option']);
                    break;
                case 'Text':
                    $element = new Zend_Form_Element_Text($option['Id']);
                    break;
                case 'Pass':
                    $element = new Zend_Form_Element_Password($option['Id']);
                    break;
                case 'Checkbox':
                    $element = new Zend_Form_Element_Checkbox($option['Id']);
                    break;
                case 'Textarea':
                    $element = new Zend_Form_Element_Textarea($option['Id']);
                    break;
                case 'MSelect':
                    $element = new Zend_Form_Element_Multiselect($option['Id']);
                    $element->addMultiOptions($option['Option']);
                    break;
                case 'Submit':
                    $elementDecorator = array(
                            array('ViewHelper'),
                            array('HtmlTag', array('tag' => 'div','style' =>'margin-left:0', 'class' => 'span'.$option['Span'])),
                    );
                    $element = new Zend_Form_Element_Button($option['Id']);
                    $element->setLabel($option['Label'])
                    ->setAttrib('type','submit')
                    ->setAttrib('class','btn btn-primary')
                    ->setDecorators($elementDecorator);
                    break;
                default:
                    break;
            }
            $elementDecorator = array(
                    array('ViewHelper'),
                    array('Label'),
                    array('HtmlTag', array('tag' => 'div','style' =>'margin-left:0', 'class' => 'span'.$option['Span'])),
            );

            if(isset($option['Atributo'])){
                foreach ($option['Atributo'] as $key=>$value) {
                    $element->setAttrib($key, $value);
                }
            }

            if(($option['Tipo'] != 'Submit') && ($option['Tipo'] != 'Button')){
                $element->setLabel($option['Label'])
                ->setAllowEmpty((bool)$option['Required'])
                ->setRequired(!$option['Required'])
                ->addValidator('Db_NoRecordExists', false,
                        array(
                                'table'   => $option['Table'],
                                'field'   => $option['Field']
                        )
                )->setDecorators($elementDecorator);

                if ($option['Disabled'] == 'true')
                    $element->setAttrib('disabled','disabled');
            }

        $this->addElement($element);

        }
    }


no usuario/controller:


    $form = new Admin_Form_Usuario();

no usuario/view:

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

1 に答える 1

1

bt フォームを作成したい場合は、ViewScript デコレータを使用するか、このようにソートすることができます

$pro_name = new Zend_Form_Element_Text('pro_name');
    $pro_name->setLabel("Project name")
            ->setRequired(true)
            ->addValidators(array($pnalnum,$pnlength))
            ->setAttrib("class", "textInput")
            ->setDecorators(array(
                'ViewHelper',
                array(array('control' => 'HtmlTag'), array('tag' => 'div', 'class' => 'controls')),
                array('Label', array('class' => 'control-label')),
                array(array('controls' => 'HtmlTag'), array('tag' => 'div', 'class' => 'control-group'))  
            ));

これは単純なhtmlの作成です:

<div class="control-group">
   <label for="pro_name" class="control-label required">Project name</label>
   <div class="controls">
      <input type="text" name="pro_name" id="pro_name" value=""class="textInput">
   </div>
</div>
于 2012-12-15T14:21:48.257 に答える