Как заполнить пользовательский элемент zend_form_element с помощью $ form-> populate () и $ form-> isValid () - PullRequest
0 голосов
/ 18 мая 2011

Я создал собственный 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 Ответ

2 голосов
/ 18 мая 2011

Я думаю, что для населения достаточно, чтобы 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);

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

...