Как заполнить пользовательский zend_form_element с помощью $form-> populate() и $form-> isValid()

#php #zend-framework #zend-form #zend-form-element

#php #zend-framework #zend-form #zend-form-element

Вопрос:

Я создал пользовательский Zend_form_element, следуя руководству, чтобы иметь некоторые пользовательские входные данные. Все более или менее в порядке, отображается корректно и так далее. Что мне нужно сделать, так это заполнить его при отображении формы для обновления или при отображении формы, когда она не проходит проверку. Вот код для моего пользовательского элемента:

 class ZC_Form_Element_TabellaRendite
    extends Zend_Form_Element_Xhtml
{

    public $helper = "tabellaRenditeElement";
    private $_data;
    // the second paramater was added by me, i'll explain why below
    function __construct($spec, $data = null){
        $this->_data = $data;
        parent::__construct($spec);
    }

    public function setValue() {

    }

    public function getValue() {

        return $this->_data;
    }
}
  

И вот вспомогательная функция

     class ZC_View_Helper_TabellaRenditeElement
        extends Zend_View_Helper_FormElement
    {

        protected $html = '';

        public function tabellaRenditeElement ($name, $value=null, $attribs = null){
//Here the $attribs are correctly the $specs i passed, the $value only has some value because of the workaround i explain below
            $helper = new Zend_View_Helper_FormText();
            $helper->setView($this->view);
            fb($value, 'value in ');
            fb($name, 'name');
            $options = array('class'=> 'somma','size'=> 4);
            $optionsReadonly = array('readonly' => 1, 'class'=> 'totale', 'size'=> 4);
            if (!$attribs['modificabile']){
                $options['readonly'] = 1;
            }
            $this->html .= "
            <table class='display datatablesRendite' id='tableRendite' style='border:1px solid;'>
                        <thead>
                            <tr bgcolor='#B8D3E8'>
                                <th>RENDITA da LOCAZIONI (canone di locazione - manutenzione)</th>
                                <th>Importo</th>
                            </tr>
                        </thead>
                        <tbody>";
            $this->html .= '<tr>';
            $this->html .= '<td>LOCALI COMMERCIALI - IMPIANTI SPORTIVI</td>';
            $this->html .= '<td>';
            $this->html .= $helper->formText("renditaImpianti",$value['renditaImpianti'], $options);
            $this->html .= '</td>';
            $this->html .= '</tr>';
            $this->html .= '<tr>';
            $this->html .= '<td>LOCALI COMMERCIALI - AGGIUNTI (servizio di ristorazione)</td>';
            $this->html .= '<td>';
            $this->html .= $helper->formText("renditaAggiunte", $value['renditaAggiunte'], $options);
            $this->html .= '</td>';
            $this->html .= '</tr>';




            $this->html .= '</tbody></table>';


            return $this->html;
        }
    }
  

Я совершенно новичок в zend_framework, и это, очевидно, неправильно, как вы видите, я добавил второй параметр, называемый data, в __construct элемента: я сделал это, потому что, когда я создаю свою форму и передаю данные для ее заполнения, я не знаю, как передать его помощнику. Итак, я нашел обходной путь, передав данные непосредственно пользовательскому zend_form_element в конструкторе, и (я не знаю, почему) это работает.

Это означает, что если я сделаю

 $form = new My_Form();
$form->populate($data);
  

или

 $form = new My_Form();
$form->isValid($_POST);
  

Значение $ в помощнике пустое.

Итак, в функции init () формы я передаю $data пользовательскому элементу следующим образом:

 $myCustomElement = new My_custom_element($specs, $data);
  

и я передаю данные в форму при создании

 $form = new My_Form($data);//this way i pass the data to populate custom elements
$form->populate($data);//this way i populate all the standard elements
  

То же самое для isValid()

 $form = new My_Form($_POST);//this way i pass the data to populate custom elements
$form->isValid($_POST);//this way i populate all the standard elements
  

Таким образом, все работает нормально, но я уверен, что это довольно неправильно: мой босс, наконец, дал мне полдня на рефакторинг кода, и поэтому я хочу объединить оба пользовательских и стандартных поля с помощью $form-> populate() и $ form-> isValid().

P.S. возможно, я все понял неправильно, и это неправильный способ сделать то, что я хотел сделать: не стесняйтесь указывать правильный способ, я новичок в фреймворке, и у меня не было времени, чтобы понять это полностью.

Комментарии:

1. Можете ли вы привести пример ваших $data или $ _POST?

2. они оба являются ассоциативными массивами. $data — это данные, взятые из базы данных, а $ _POST — это данные, взятые из POST. вам нужен var_dump точных данных?

Ответ №1:

Я думаю, что, насколько это касается populate, должно быть достаточно ZC_Form_Element_TabellaRendite следующего:

 class ZC_Form_Element_TabellaRendite extends Zend_Form_Element_Xhtml {

    public $helper = "tabellaRenditeElement";

    /**
    * Is the value provided valid?
    *
    *
    *@param  string $value
    *@param  mixed $context
    *@return bool
    */
     public function isValid($value, $context = null) {
       // you need to specify what it means that your element is valid or not.
     }

}
  

Вам не нужно создавать какие-либо переменные для ваших данных. Методы из Zend_Form_Element позаботятся об этом. С помощью этого вы можете задать значение элемента как, например:

     $t = new ZC_Form_Element_TabellaRendite('somename', array('modificabile' =>'1'));
    $t->setValue($data);     
  

Также вы должны иметь возможность заполнить форму этим элементом как, например:

     $data2Populate = array(
        'somename' => array(
            'renditaImpianti' => 112,
            'renditaAggiunte' => 132
        )
    );

    $myForm = new My_Form();
    $myForm->populate($data2Populate);
  

Надеюсь, это поможет.

Комментарии:

1. Да, это помогает, единственное, что все еще не работает, это когда я делаю $ t-> setValue($data), а затем ‘$ myForm = new My_Form(); $myForm-> populate($data2Populate);’ $data имеет значение null в форме.

2. Конечно, я ввел $ t-> setValue($data) в функцию init () моей формы. Правильно ли это?

3. Хорошо, в конце концов, это было ясно, мне просто не нужно было перепроверять метод при расширении Zend_Form_Element_Xhtml. Теперь все работает правильно