例如,我们有:
<div class="row">
<?php echo $form->labelEx($company,'company_type_of_ownership'); ?>
<?php echo $form->radioButtonList($company,'company_type_of_ownership',array("Private company"=>"Private company","A"=>"A","B"=>"B","Other"=>"Other(Please specify)"),array(//SOME JS HERE MAY BE?); ?>
<?php echo $form->error($company,'company_type_of_ownership'); ?>
</div>
如果用户选择A,则A将保存在“company_type_of_ownership”单元格中。
但是如何实现下一个功能?
用户选择“其他(请指定)”并且有一个特殊的文本字段,例如,他可以键入“我自己的所有权类型”,并且表中会保存此值。 < / p>
或者(我不知道,如果是更好的做法): 表格中还有另一个特殊的单元格用于此类情况? 例如,如果用户选择“A”,则该值将保存在“TYOF OF OWNERSHIP”单元格中,而“OTHER TYPE”单元格则为空。 但如果他选择其他,那么“所有权类型”具有“其他”价值,并且他所输入的内容将保存在“其他类型”中
有什么建议吗?
更新 谢谢你的答复。你能告诉我我做错了什么吗? 我现在尝试以这种方式实现它(我在js中很差,所以在网上发现了这个):
<div class="row">
<?php echo $form->labelEx($company,'company_type_of_ownership'); ?>
<?php echo $form->radioButtonList($company,'company_type_of_ownership',array("Private company"=>"Private company","Other"=>"Other (please, specify)"),array('onchange'=>'return muFun(this.value)')); ?>
<?php echo $form->error($company,'company_type_of_ownership'); ?>
</div>
<div id="check_1" style="display:none">
<div class="row">
<?php echo $form->labelEx($company,'company_type_of_ownership_other'); ?>
<?php echo $form->textField($company,'company_type_of_ownership_other',array('size'=>50,'maxlength'=>25)); ?>
<?php echo $form->error($company,'company_type_of_ownership_other'); ?>
</div>
</div>
<script>
function muFun(obj){
if(obj=="Other"){
document.getElementById('check_1').style.display="block";
return false;
}else{
document.getElementById('check_1').style.display="none";
return false;
}
}
</script>
当我选择OTHER时,此txtfield变为可见。我在表格中为它创建了一个特殊的单元格:'company_type_of_ownership_other' 但是如果我在其中键入内容,它就不会被保存到我的数据库中。可能是什么问题,如果你建议同样的事情? 谢谢
更新2:一个有点讨厌的错误 由于一切都很完美,出现了一个问题: 您指定“其他”按钮,将出现隐藏的文本字段。您决定忽略它并继续填写申请表。按SUBMIT(SEND)后,将出现beforeValidate规则中指定的错误。完美,但是:隐藏的文本域再次隐藏。并且再次显示用户必须单击另一个单选按钮(例如,此处为PRIVATE COMPANY),然后单击“返回其他” - 仅显示隐藏的文本字段。亲爱的亚历克斯,我需要你的帮助。并不是每个人都可以猜测进行这些操作。
答案 0 :(得分:1)
添加隐藏文本字段,当用户选择其他显示隐藏字段和jvascript时,然后在控制器中检查此字段并为其创建新记录。
更新:this.value!='其他','其他' - 是文字,价值会有所不同。试试这个
this.options[this.selectedIndex].innerHTML
或更好地检查那里会有什么价值
console.log(this.value);
更好地将'onchange'=>'return muFun(this.value)'
更改为'onchange'=>'return muFun(this)'
。那么功能就是
function muFun(sb){
if(sb.options[sb.selectedIndex].innerHTML=="Other")
document.getElementById('check_1').style.display="block";
else
document.getElementById('check_1').style.display="none";
return false;
}
在beforeValidate模型方法中,您应该手动检查这两个字段中的一个是否已填充。从模型的rules()方法中删除它们的“必需”规则。
答案 1 :(得分:1)
如果要使用规则验证company_type_of_ownership_other,请创建自定义验证规则。 (请注意,我使用company_ownership_type_other_description
代替company_type_of_ownership_other
而不是company_ownership_type //field that gets the value from radio buttons
company_ownership_type_other_description //field for text
...您可以选择自己喜欢的内容。
您的模型应具有以下属性(或db表中的字段)
array('company_ownership_type_other_description',
'validateOtherCompanyTypeOwnershipText'),
将以下内容添加到规则中:
public function validateOtherCompanyTypeOwnershipText($attribute) {
if ($this->company_ownership_type == 'other' && empty($this->attribute))
$this->addError($attribute,'You need to enter a value for ' .
$this->getAttributeLabel ($attribute) .
' if you select "Other" for Company Type');
}
将以下方法添加到您的模型中:
{{1}}
这基本上是做什么的:验证规则是针对文本字段运行的(在规则中设置)。 $ attribute是'company_ownership_type_other_description'。
'getAttributeLabel'给出文本字段的标签(如果您已在模型中设置它)。
答案 2 :(得分:0)
顺便说一句,只是想添加一些有关beforeValidate的有用信息: 对于此示例,我们需要添加:
public function beforeValidate() {
if ($this->company_type_of_ownership=='Other' && !$this->company_type_of_ownership_other) {
$this->addError('typeofwnership', 'Please, specify the type of ownership');
}
if ($this->company_legal_form=='Other' && !$this->company_legal_form_other) {
$this->addError('legalform', 'Please, specify the company legal form');
}
return parent::beforeValidate();
}
那么,它做了什么? 如果&#34;其他,请注明&#34;收音机被选中。然后这个规则:
$this->company_type_of_ownership=='Other'
有效,需要这一条规则:
&& !$this->company_type_of_ownership_other
也必须指定(此处不是EMPTY)。然后我们可以添加一些错误文本,例如&#39;请指定所有权类型&#39;它会工作! HOLA!