#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. Теперь все работает правильно