问候编码员。
在我的应用程序中,我有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中的此问题。
答案 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)