Как отключить Zend_Form_Element_Radio, но при этом включить его значение в запрос POST? - PullRequest
0 голосов
/ 23 октября 2011

Приветствую коллег кодеров.

В моем приложении у меня есть 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.

1 Ответ

0 голосов
/ 23 октября 2011

Всегда проверяйте значения внутри вашей модели! Не полагайтесь только на свои значения формы! Для любого пользователя с современным браузером несложно изменить значение ввода только для чтения.

ТАК, в основном, делайте что-то подобное внутриВаша модель

switch ($user->getRight()) {
  case 'admin':
    $myCustomField = $this->_getParam('value');
  break;
  case 'normaluser':
    $myCustomField = in_array($this->_getParam('value'), array(
      'values', 'user', 'is', 
      'allowed', 'to', 'set')) ? $this->_getParam('value') : $defaultValue;
  break;
}

$model->setField($myCustomField);

Ни при каких обстоятельствах вы не должны полагаться на то, что отправляет форма.Очевидно, что при использовании _getParam('value'), подобного этому, должна быть какая-то проверка, проверяющая, существует ли отправленный идентификатор (я думаю, это то, что вы выбираете из своего радиоэлемента) в базе данных (Db_RecordExists)

...