如何禁用Zend_Form_Element_Radio但仍然在POST请求中包含其值?

时间:2011-10-23 07:27:09

标签: zend-framework radio-button zend-form readonly

问候编码员。

在我的应用程序中,我有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 :(得分:0)

始终验证模型内部的值! 不要仅依赖于您的表单值!对于拥有现代浏览器的任何人来说,改变只读输入的值是一件小事。

所以在你的模型中基本上做这样的事情

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')时,应该有某种验证器检查数据库中是否存在已发送的id(我猜这是你选择的无线电元素)(Db_RecordExists)