Я создал собственный 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. может быть, я все неправильно понял, и это не правильный способ сделать то, что я хотел сделать: не стесняйтесь указывать правильный путь, я новичок в фреймворке и у меня не было времени, чтобы понять это полностью.