[Resolvido] Como Deixar Um Campo Desabilitado Ou Invisivel

To fazendo uma manutenção num sistema, incluindo uns campos e talz.

Dois campos não nunca serão gravados na adição, somente na edição.

E ‘por acaso’… o sistema não ta mesmo gravando na adição…

Mas não vou deixar um campo lá, que parece que vai será salvo mas não será né.

É relato de bug na certa…

Então ou eu faço ele gravar na adição (ele nunca será, mas isso não vai encomodar ninguém)

ou faço com não se possa gravar ele na adição

deixando desabilitado ou invisível

Eu antes já tinha conseguido fazer ele ser obrigatório só na edição

e fiz isto com esse comando

no Models - Rules


array('Cod_Reativo, QualidadeReativo', 'required', 'on'=>'update'),

Então pela lógica (pelo menos a minha…) seria alí também que iria dar o comando para ele ficar invisível ou desabilitado na adição.

Mas testei algumas palavras chaves e não encontrei.

Olhei a documentação e até o fonte do Yii e não encontrei também.

Isso são cenários. Você pode ler sobre em http://www.yiiframework.com/doc/guide/1.1/en/form.model

Para o caso de inserir um novo registro, o cenário é o insert. Ele é o cenário padrão setado no construtor do ActiveRecord: https://github.com/yiisoft/yii/blob/master/framework/db/ar/CActiveRecord.php

Ele serve apenas para falar se uma regra de validação vai ou não ser aplicada. Não tem relação NENHUMA com gravação ou exibição do campo. Para não exibir o campo, você pode verificar se ele é novo utilizando o método isNewRecord.

Valew Davi, mas onde eu colocaria essa verificação?

Vai depender de como você está fazendo as coisas ai. Normalmente fica na view:




<?php if(!$model->isNewRecord()): ?>

    <input type="text">

<?php endif; ?>



Foi oq fiz, mas teria como utilizar o recurso de CENÁRIOS pra essa solução?


            <?php             

	            if (($model->isNewRecord)==false) {            

	            		$criteria = new CDbCriteria;

	            		$criteria->order = 'Cod_Reativo';

	            		echo $form->dropDownListRow($model, 'Cod_Reativo',

	                CHtml::listData(tiporeativo::model()->findAll($criteria), 'Cod_Reativo', 'Descricao'),

	                array('prompt' => 'Indique se é Reativo'));

	

	            		echo $form->dropDownListRow($model, 'QualidadeReativo',

	                array('Qualificado'=>'Qualificado', 'Não Qualificado'=>'Não Qualificado'),

	                array('prompt' => 'Indique se é qualificado'));

            	}

            ?>




if($model->scenario != 'insert')



Agora, uma dica muito importante: NUNCA coloque esse tipo de código na View. NUNCA. A view deve ter apenas código de visualização de dados. Ela NUNCA deveria ter essa lógica relacionada ao banco de dados.

Uma possibilidade de melhorar esse código, seria utilizar Named scopes: http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes. O código ficaria ± assim:


            

<?php if (($model->isNewRecord)==false): ?>

	<?php $listData = CHtml::listData(tiporeativo::model()->ordenadoPorCodigo()->findAll(), 'Cod_Reativo', 'Descricao'); ?>

	<?php echo $form->dropDownListRow($model, 'Cod_Reativo', $listData, array('prompt' => 'Indique se é Reativo')); ?>

	<?php $listQualidade = array('Qualificado'=>'Qualificado', 'Não Qualificado'=>'Não Qualificado'); ?>

	<?php echo $form->dropDownListRow($model, 'QualidadeReativo', $listQualidade, array('prompt' => 'Indique se é qualificado')); ?>

<?php endif; ?>



Repare também na organização melhor dos elementos na view. Você não é obrigado, mas a recomendação (e a maneira como praticamente todos fazem) é abrir e fechar as tags PHP diversas vezes, fazendo com que se pareçam tags do HTML e deixando tudo mais com cara de template.

Ainda é possível melhor um pouco mais o exemplo e passar essa informação do $listData no método render, deixando a view bem mais separada do model e sem saber dos scopes.