Validar Atributo

Bom dia.

Estou com o seguinte problema que não consigo resolver. Tenho um form com dois models e preciso de tornar um atributo obrigatório quando este dois campos forem diferentes.

Tenho o nivel esperado e a avaliacao do chefe que são a mesma lista de opções e sempre que estes dois forem diferentes tem de justificar.

Já tentei através da relação mas não consigo pois o campo que quero comparar não é a chave estrangeira mas sim outro campo dessa tabela.

Tentei com funções mas não funcionam.

Se me poderem ajudar agradeço. Obrigada

Olá Marisalima,

Você pode utilizar a função BeforeValidate() em seu model, mais ou menos assim:





    public function beforeValidate() {

        if ($this->isNewRecord) {            

            if (!$this->hasErrors('data')) {

                if ($this->campo1 <> null && $this->campo2 == null) {

                    $this->addError('campo1', 'Campo obrigatório.');

                }                

            }

        } 

        return parent::beforeValidate();

    }



Obrigada pela resposta, mas o meu problema é que o campo1 não faz parte desse model e sim de outro. Aí é eu não sei consigo obter o campo1. Mas vou tentar com esta dica.

Tem como você postar seu model, para termos uma noção como está??

envio o model em anexo. Campo que eu preciso está em outro model onde existe um relacionamento entre eles.

Se possível manda o _form também…

Vou enviar todos os ficheiros que alimentam o form.

Consegui encontrar uma solução, mas não me indica o erro no ecrã.

Declarei um atributo nivel_esperado no model que fica com o valor do campo que eu quero comparar com o campo que vou introduzir, depois criei a função beforeValidate com o seguinte código:

public function beforeValidate()

{


       &#036;this-&gt;model()-&gt;setScenario('updateChefe');


     





       if(&#036;this-&gt;justificacao_chefe == null){


         &#036;this-&gt;addError(&#036;this-&gt;justificacao_chefe,'Justifique');


       //  var_dump(&#036;this-&gt;getErrors());


       }


     return parent::beforeValidate();


}  

Vai buscar o erro não deixa gravar ma não identifica o erro no formulário. Como resolvo esta situação?

Obrigada.

Olá Marisalima, tenta fazer da seguinte forma:

na tua funçao rules() do teu modelo adicionas esta regra:




array(

        // o atributo a ser validado e cujo cual vai aparecer o error  

        'justificacao_chefe',

        // a funçao a ser chamado para fazer a validasao  

        'validarJustificacaoChefe',

        // o Scenario a que se aplica

        'on' => 'updateChefe'

),



depois en vez de utilizares a funçao beforeValidate()

cria uma nova que esta sera a tua validasao "personalizada"

tipo asim:




public function validarJustificacaoChefe($attribute, $params) {

	if($this->justificacao_chefe == null){

		$this->addError('justificacao_chefe','Justifique');

	}

}



para mais detalhes podes consultar o seguinte post:

crear sua propia regla de validasao

Olá.

Penso que o meu problema está em o form ser com tabular input. O form ao carregar a view já trás dados consigo vindos da base de dados e o que pretendo fazer é um update à informação. Se colocar o getErrors e não fizer o redirect ele dá-me erro de validação em que um determinado campo é obrigatório, mas esse campo está preenchido quando dá erro.

Não sei mais o que fazer, já pesquisei em todos os forums e não encontro nenhuma solução!

Estou tramada :(

Ninguém! :(

Olá Marisa Lima,

Estava verificando seu código, baseado em sua interação número #10, gostaria de entender uma coisa. Quando o usuário acessa a interface de atualização acessa uma view chamada update.php e depois que esse formulário é salvo e validado você redireciona o usuário para uma outra interface? No caso "formularioChefePag3/update?id=$id" ?

Obrigada por responder e peço desculpa pela demora na resposta.

Sim passa para essa view e depois de guardar vai para outra interface.

O meu problema está no form ser de entradas tabulares, ao criar uma validação personalizada funciona mas não me identifica onde está o erro ou se identifca considera todos os campos.

A validação que criei foi:

   public function validarJustificacaoChefe(&#036;attribute,&#036;params)


{


       &#036;this-&gt;model()-&gt;setScenario('updateChefe');


       if(&#036;this-&gt;id_avaliacao_chefe_nivel &#33;= &#036;this-&gt;nivel_esperado){


           &#036;this-&gt;addError(&#036;attribute,'Justifique');


        //echo var_dump(&#036;this-&gt;id_avaliacao_chefe_nivel);


       }


}  

será que conseguem ajudar com esta nova informação?

Olá Marina,

O que está acontecendo com sua validação é o seguinte: todos os campos do formulário estão passando pela validação, portanto em sua função de validação customizada você tem o parâmetro ‘$attribute’ que assume o nome do campo que está passando pela validação, como todos os campos passam pela validação e a condição “($this->id_avaliacao_chefe_nivel != $this->nivel_esperado)” não muda, a erro é atribuído para todos os campos. Faça um teste, em sua condição de de validação faça o seguinte:




if($this->id_avaliacao_chefe_nivel != $this->nivel_esperado && $attribute == 'id_avaliacao_chefe_nivel'){

$this->addError($attribute,'Justifique');

}




Se isso funcionar, você pode ajustar sua validação.

Boas.

Estive a testar mas não funciona. O meu formulário tem entradas tabulares com valores que já vem preenchidos da base de dados e outros por preencher, então eu envio o model e a variavel items doi exemplo da documentação yii com valores. Quando obtenho a informação volto a usar o items vou colocar excertos de código para ver se fica mais fácil:

Controller:

[color="#0000FF"] function actionUpdate() {

    &#036;id = (int) &#036;_GET['id'];


    &#036;model = new AvaliacaoCompetenciaTransversalMomento('updateChefe');


    &#036;lideranca = new AvaliacaoCompetenciaTransversalLiderancaMomento('updateChefe');


    &#036;model1 = new CompetenciaTransversal();


    &#036;ctn = new CompetenciaTransversalNivel();


    &#036;ctl = new CompetenciaTransversalLideranca();


    &#036;Compet = &#036;model-&gt;ListaCompetChefe();


    &#036;competLider = &#036;lideranca-&gt;ListaCompetChefe();


    &#036;items = &#036;this-&gt;getItemsToUpdate();


    &#036;getCTL = &#036;this-&gt;getItemsToUpdate1();


    &#036;NStatus = MomentoAvaliacaoColaborador::model()-&gt;getStatusChefe();


   &#036;indCTL=  &#036;this-&gt;getIndicadorCTL();


    &#036;indCT=  &#036;this-&gt;getIndicadorCT();


    &#036;this-&gt;performAjaxValidation(array(&#036;model,&#036;lideranca), 'user-form');





    if (isset(&#036;_POST['AvaliacaoCompetenciaTransversalMomento']) || isset(&#036;_POST['AvaliacaoCompetenciaTransversalLiderancaMomento'])) {





        &#036;valid = true;


        foreach (&#036;items as &#036;i =&gt; &#036;item) {


            if (isset(&#036;_POST['AvaliacaoCompetenciaTransversalMomento'][&#036;i])) {


                &#036;item-&gt;attributes = &#036;_POST['AvaliacaoCompetenciaTransversalMomento'][&#036;i];


                &#036;valid=&#036;item-&gt;validate() &amp;&amp; &#036;valid;


                &#036;model-&gt;validate();


                &#036;item-&gt;save();


            } ....


        [/color]}

View:

[color="#0000FF"] <?php echo $form->HiddenField($model, “[$i]id”, array(‘value’ => $item[‘id’], ‘readonly’ => ‘readonly’, ‘type’ => “hidden”)); ?>

<?php echo $form->HiddenField($model1, “[$i]id”, array(‘value’ => $item[‘id’], ‘readonly’ => ‘readonly’, ‘type’ => “hidden”)); ?>

        &lt;table style=&quot;margin-left: 35px&quot;&gt;


            &lt;tr&gt;


                &lt;th&gt;&lt;?php echo &#036;form-&gt;Label(&#036;model1, 'competencia'); ?&gt;&lt;/th&gt;


                &lt;td&gt;&lt;?php echo &#036;form-&gt;TextArea(&#036;model1, &quot;[&#036;i]id_competencia_transversal&quot;, array('value' =&gt; &#036;item['competencia'], 'readonly' =&gt; 'readonly', 'style' =&gt; 'width:500px;')); ?&gt;&lt;/td&gt;


            &lt;/tr&gt;


            &lt;tr&gt;


                &lt;th&gt;&lt;?php echo &#036;form-&gt;Label(&#036;model1, 'descricao'); ?&gt;&lt;/th&gt;


                &lt;td&gt;


                    &lt;?php echo &#036;form-&gt;TextArea(&#036;model1, &quot;[&#036;i]descricao&quot;, array('style' =&gt; 'width:500px;', 'value' =&gt; &#036;item['descricao'], 'readonly' =&gt; 'readonly')); ?&gt;                    


                &lt;/td&gt;


            &lt;/tr&gt;


            &lt;tr&gt;


                &lt;th&gt;	&lt;?php echo &#036;form-&gt;Label(&#036;model1, 'indicador'); ?&gt;&amp;nbsp;&lt;a class=&quot;info&quot; href=&quot;#&quot;&gt;&lt;img src=&lt;?php echo Yii::app()-&gt;baseUrl.&quot;/images/help-16.png&quot; ?&gt; /&gt;


                &lt;span style=&quot;font-size: 9px&quot;&gt;Os indicadores são uma forma de monitorizar a competência, realizando a sua medição e consequente nível de desempenho. Preenchimento facultativo.


                &lt;/span&gt;&lt;/a&gt;&lt;/th&gt;


                &lt;td&gt;


                    &lt;?php echo &#036;form-&gt;TextArea(&#036;model1, &quot;[&#036;i]indicador&quot;, array('style' =&gt; 'width:500px;', 'value' =&gt; &#036;item['indicador'])); ?&gt;              


                &lt;/td&gt;


            &lt;/tr&gt;


            &lt;tr&gt;


                &lt;th&gt;&lt;?php echo &#036;form-&gt;Label(&#036;ctn, 'Nível Competência Esperado'); ?&gt;&lt;/th&gt;


                &lt;td&gt;


              &lt;?php echo &#036;form-&gt;HiddenField(&#036;model, &quot;[&#036;i]nivel_esperado&quot;, array('style' =&gt; 'width:500px;', 'value' =&gt; &#036;item['nivel_numero'], 'readonly' =&gt; 'readonly')); ?&gt;   


                    &lt;b&gt;&lt;?php echo &#036;form-&gt;TextArea(&#036;ctn, &quot;[&#036;i]id_nivel&quot;, array('style' =&gt; 'width:500px;color: #185c52;font-style:italic', 'value' =&gt; &#036;item['desc_nivel'], 'readonly' =&gt; 'readonly')); ?&gt;&lt;/b&gt;   


                &lt;/td&gt;


            &lt;/tr&gt;    


            &lt;tr&gt;


                &lt;th&gt;


                    &lt;?php echo &#036;form-&gt;LabelEx(&#036;model, 'id_auto_avaliacao_nivel'); ?&gt;&amp;nbsp;&lt;a class=&quot;info&quot; href=&quot;#&quot;&gt;&lt;img src=&lt;?php echo Yii::app()-&gt;baseUrl.&quot;/images/help-16.png&quot; ?&gt; /&gt;


                &lt;span style=&quot;font-size: 9px&quot;&gt;Competência consolidada: se operacional nos domínios do saber-saber (manifesta-se no domínio cognitivo: conhecimento assimilado / aquisição de informações),

saber-ser / estar (manifesta-se no domínio sócio afectivo: desenvolvimento de atitudes / aquisição de valores) e saber-fazer (manifesta-se no domínio

da prática / como executo a tarefa e/ou procedimento).

Competência não consolidada: se não aplicável em apenas um dos domínios do "saber".

                &lt;/span&gt;&lt;/a&gt;	&lt;/th&gt;


                &lt;td&gt;


                    &lt;?php echo &#036;form-&gt;textField(&#036;model, &quot;[&#036;i]id_auto_avaliacao_nivel&quot;, array('style' =&gt; 'width:500px;font-size:11px', 'readonly' =&gt; 'readonly', 'value' =&gt; &#036;item['id_auto_avaliacao_nivel'])); ?&gt;                      


                    &lt;?php echo &#036;form-&gt;error(&#036;model, &quot;[&#036;i]id_auto_avaliacao_nivel&quot;); ?&gt;                 


                &lt;/td&gt;


            &lt;/tr&gt;


            &lt;tr&gt;


                &lt;th&gt;&lt;?php echo &#036;form-&gt;Label(&#036;model, 'justificacao_colaborador'); ?&gt;&amp;nbsp;&lt;a class=&quot;info&quot; href=&quot;#&quot;&gt;&lt;img src=&lt;?php echo Yii::app()-&gt;baseUrl.&quot;/images/help-16.png&quot; ?&gt; /&gt;


                &lt;span style=&quot;font-size: 9px&quot;&gt;Justifique a sua escolha


                &lt;/span&gt;&lt;/a&gt;&lt;/th&gt;


                &lt;td&gt;


                    &lt;?php echo &#036;form-&gt;TextArea(&#036;model, &quot;[&#036;i]justificacao_colaborador&quot;, array('size' =&gt; 60, 'maxlength' =&gt; 1000, 'style' =&gt; 'width:500px;', 'value' =&gt; &#036;item['justificacao_colaborador'], 'readonly' =&gt; 'readonly')); ?&gt;                      


                &lt;/td&gt;


            &lt;/tr&gt;


            &lt;tr&gt;


                &lt;th&gt;&lt;?php echo &#036;form-&gt;LabelEx(&#036;model, 'id_avaliacao_chefe_nivel'); ?&gt;&amp;nbsp;&lt;a class=&quot;info&quot; href=&quot;#&quot;&gt;&lt;img src=&lt;?php echo Yii::app()-&gt;baseUrl.&quot;/images/help-16.png&quot; ?&gt; /&gt;


                        &lt;span style=&quot;font-size: 9px&quot;&gt;Indique o nível real de proeficiência em que o colaborador se encontra. &lt;br&gt; OBS: Sempre que o nível real de proeficiência for diferente do nível de proeficiência esperado é obrigatório justificar&#33;


                &lt;/span&gt;&lt;/a&gt;&lt;/th&gt;


                &lt;td&gt;


                    &lt;?php echo &#036;form-&gt;DropDownList(&#036;model, &quot;[&#036;i]id_avaliacao_chefe_nivel&quot;, CHtml::listData(NivelAvaliacao::model()-&gt;findAll(), 'pontos', 'descricao'), array('style' =&gt; 'width:506px', 'options' =&gt; array(&#036;item['id_avaliacao_chefe_nivel'] =&gt; array('selected' =&gt; 'selected')), 'empty' =&gt; '')); ?&gt;


                    &lt;?php echo &#036;form-&gt;error(&#036;model, &quot;[&#036;i]id_avaliacao_chefe_nivel&quot;); ?&gt;





                &lt;/td&gt;


            &lt;/tr&gt;


            &lt;tr&gt;


                &lt;th&gt;&lt;?php echo &#036;form-&gt;LabelEx(&#036;model, 'justificacao_chefe'); ?&gt;&amp;nbsp;&lt;a class=&quot;info&quot; href=&quot;#&quot;&gt;&lt;img src=&lt;?php echo Yii::app()-&gt;baseUrl.&quot;/images/help-16.png&quot; ?&gt; /&gt;


                &lt;span style=&quot;font-size: 9px&quot;&gt;Justifique a sua escolha


                &lt;/span&gt;&lt;/a&gt;&lt;/th&gt;


                &lt;td&gt;


                    &lt;?php echo &#036;form-&gt;TextArea(&#036;model, &quot;[&#036;i]justificacao_chefe&quot;, array('style' =&gt; 'width:500px;', 'value' =&gt; &#036;item['justificacao_chefe'])); ?&gt;                      


                    &lt;?php echo &#036;form-&gt;error(&#036;model, &quot;[&#036;i]justificacao_chefe&quot;); ?&gt;


                &lt;/td&gt;


            &lt;/tr&gt;


        &lt;/table&gt;[/color]

Eu não valido o meu model mas sim o items que tras o valor do formulário. Sei que há algo aqui que está errado, mas não consigo descobrir o que é!

Bom dia Marina,

Gostaria de saber se conseguiu resolver o seu problema.