Desabilitando CheckBoxes no CGridView

Boa tarde à todos.

Tenho uma Grid (CGridView) com um array de CheckBoxes conforme a estrtura abaixo:




<?php $this->widget('zii.widgets.grid.CGridView', array(

                'id' => 'grdPermissaoTela',

                'dataProvider' =>  $modelPermissaoTela->searchPermissaoTela($model->PerfilId),

                'selectableRows'=>0,


                'columns' => array(

                        array(

                                'header'=>'Nome',

                                'value'=>'$data["NomeExibicao"]',

                        ),

                    

                        array(

                                'header'=>'Exibir',

                                'class'=>'CDataColumn',

                                'type'=>'raw',

                                'htmlOptions'=>array('style'=>'text-align:center'),

                                'value' => 'CHtml::checkBox($data["Nome"]."[Exibir]", $data["Exibir"])',

                        ),

                        array(

                                'header'=>'Inserir',

                                'class'=>'CDataColumn',

                                'type'=>'raw',

                                'htmlOptions'=>array('style'=>'text-align:center'),

                                'value' => 'CHtml::checkBox($data["Nome"]."[Inserir]", $data["Inserir"])',

                                'visible'=>'false',

                        ),

                        array(

                                'header'=>'Excluir',

                                'class'=>'CDataColumn',

                                'type'=>'raw',

                                'htmlOptions'=>array('style'=>'text-align:center'),

                                'value' => 'CHtml::checkBox($data["Nome"]."[Excluir]", $data["Excluir"])',

                        ),

                        array(

                                'header'=>'Atualizar',

                                'class'=>'CDataColumn',

                                'type'=>'raw',

                                'htmlOptions'=>array('style'=>'text-align:center'),

                                'value' => 'CHtml::checkBox($data["Nome"]."[Atualizar]", $data["Atualizar"])',

                        ),

                    ),

                )

            );

            ?>



Eu gostaria de desativar os CheckBoxes ‘Inserir’, ‘Excluir’ e ‘Atualizar’ caso o usuário não set como verdadeiro o checkBox ‘Exibir’.

Existe alguma propriedade a ser passada nos trechos de códigos abaixo, ou terei que fazer de outra forma ?




'value' => 'CHtml::checkBox($data["Nome"]."[Exibir]", $data["Exibir"])'






'value' => 'CHtml::checkBox($data["Nome"]."[Exibir]", $data["Exibir"])'






'value' => 'CHtml::checkBox($data["Nome"]."[Exibir]", $data["Exibir"])'



Desde já, grato

Raphael Prado

No htmlOptions dos CheckBoxes que você só quer que sejam exibidos quando a opção "Exibir" estiver ativa, adicione as classes displayNone no seu arquivo CSS assim:


.displayNone {display: none;}

Vai ficar mais ou menos assim…


'value' => 'CHtml::checkBox($data["Nome"]."[Inserir]", $data["Inserir"], array("class"=>"displayNone"))'

'value' => 'CHtml::checkBox($data["Nome"]."[Excluir]", $data["Excluir"], array("class"=>"displayNone"))'

'value' => 'CHtml::checkBox($data["Nome"]."[Atualizar]", $data["Atualizar"], array("class"=>"displayNone"))'


// Os se preferir...

'value' => 'CHtml::checkBox($data["Nome"]."[Inserir]", $data["Inserir"], array("style"=>"display:none;"))'

'value' => 'CHtml::checkBox($data["Nome"]."[Excluir]", $data["Excluir"], array("style"=>"display:none;"))'

'value' => 'CHtml::checkBox($data["Nome"]."[Atualizar]", $data["Atualizar"], array("style"=>"display:none;"))'

Depois é só colocar um evento onChange no CheckBox "Exibir" para exibir os CheckBoxes inativos.

Para isso, você pode adicionar o ID do CheckBox "Exibir" como uma classe de flag nos ChackBoxes inativos chamada cbxHide_<ID> por exemplo.

Obrigado pela dica Lothor, porem fiz de um modo diferente.

Nos “CHtml’s” utilizei um ifInLine conforme abaixo:




'value' => 'CHtml::checkBox($data["Nome"]."[Inserir]", $data["Inserir"],array("disabled"=>($data["Exibir"] == 1) ? false : true)',




'value' => 'CHtml::checkBox($data["Nome"]."[Alterar]", $data["Alterar"],array("disabled"=>($data["Exibir"] == 1) ? false : true))',




'value' => 'CHtml::checkBox($data["Nome"]."[Excluir]", $data["Excluir"],array("disabled"=>($data["Exibir"] == 1) ? false : true))',



Não utilizei o evento onChange do CheckBox e sim o evento onClick, conforme abaixo:




array(

      'header'=>'Exibir',

      'class'=>'CDataColumn',

      'type'=>'raw',

      'htmlOptions'=>array('style'=>'text-align:center',),

      'value' => 'CHtml::checkBox($data["Nome"]."[Exibir]",

      $data["Exibir"],array(\'onclick\'=>"enable_check(this)"))',

),



E o javaScript ficou da seguinte maneira:




<script language="JavaScript">


function enable_check(status)

{ 

var name=status.id;

var nameInserir=name.replace("Exibir","Inserir"); 

var nameExcluir=name.replace("Exibir","Excluir"); 

var nameAtualizar=name.replace("Exibir","Atualizar"); 


if(status.checked)

{

// Habilita todos os outros CheckBoxes

document.getElementById(nameInserir).disabled = false;

document.getElementById(nameExcluir).disabled = false;

document.getElementById(nameAtualizar).disabled = false;

}

else

{

// Desabilita e limpa os outros CheckBoxes

document.getElementById(nameInserir).disabled = true;

document.getElementById(nameInserir).checked = false;

document.getElementById(nameExcluir).disabled = true;

document.getElementById(nameExcluir).checked = false;

document.getElementById(nameAtualizar).disabled = true;

document.getElementById(nameAtualizar).checked = false;

}

}

</script>