Yii CActiveForm radioButtonList。在"其他上添加您自己的答案。请注明"选择

时间:2014-04-18 09:24:27

标签: php yii radiobuttonlist

例如,我们有:

<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),然后单击“返回其他” - 仅显示隐藏的文本字段。亲爱的亚历克斯,我需要你的帮助。并不是每个人都可以猜测进行这些操作。

3 个答案:

答案 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!