Приветствую коллег кодеров.
В моем приложении у меня есть Zend_Forms с несколькими Zend_Form_Elements.Исходя из роли пользователя, я хотел бы изменить некоторые из этих элементов на статус «только для чтения / отключен».Однако важно, что отправка формы все еще работает.POST должен отправить значение для каждого элемента.Таким образом, установка атрибута readonly работает нормально, но отключено - нет.Если вы отключаете элемент формы HTML, он не передает свое значение в запросе POST.
Проблема в том, что невозможно установить атрибут readonly для всех типов элементов формы.Это не влияет на радио кнопки.
/**
*
* changes the Zend_Form_Element to a 'readonly' like state
*
* @param String $name (zend-) name of the element
*/
public function readonlyElement($name){
$elem = $this->getForm()->getElement($name);
/* @var $elem Zend_Form_Element */
$attribs = $elem->getAttribs();
if(is_a($elem, 'Zend_Form_Element_Radio')){
// !! this does NOT work !!
$attribs['disabled'] = true;
$value = $elem->getValue();
$hidden = new Zend_Form_Element_Hidden($name);
$hidden->setValue($value);
$this->getForm()->addElement($hidden);
}
else {
$attribs['readonly'] = true;
}
$style = $attribs['style'];
$attribs['style'] = $style;
$elem->setAttribs($attribs);
}
Я попытался отключить переключатель и добавить скрытое поле с тем же значением и тем же именем.Это не сработало, потому что имена Zend_Form_Element должны быть уникальными.Я также поэкспериментировал с $ elem-> setName (), чтобы изменить имя существующего элемента на другое.Пока что мне это не удалось.У вас есть идеи, как решить мою проблему?
Спасибо,
Андреас
Чтобы уточнить: вот как я использую свои формы в контроллере:
$form = new Some_Form();
//attach filters, validators, remove unneeded elements based on active user
$this->modifyForm($form);
if ($this->getRequest->save){
if $form->isValid(($this->getRequest->params){
//... Check and save
}
}
else{
$form->populate($model->toArray());
}
Поля "Отключено" будутзаполняется первым, но если проверка формы не удалась, они будут пустыми, потому что данные POST не были отправлены.Добавление скрытого поля с тем же именем, что и у отключенного поля, решило бы эту проблему в чистом PHP / HTML.