[Resolvido] Campo Obrigatório Mas Só Na Edição

Pelo que vi poderia fazer isto utilizando cenários.

E também vi que tem um tuto pra cenários => http://www.yiiframework.com/wiki/266/understanding-scenarios

Mas to iniciando em Yii e não consegui sacar ainda como se faz…

Qualquer ajuda é bem vinda.

No View o campo esta assim


            <?php echo $form->dropDownListRow($model, 'Reativo', 

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

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

No models - rules esta assim


array('Reativo', 'length', 'max'=>3)

Já que não é obrigatório na adição…

Xevious não sei porque você não quer colocar o campo não obrigatório no Update (Pelo menos foi assim que entendi), pois você pode deixar e colocar o campo bloqueado no update, ai o usuário não vai conseguir mudá-lo.

Mais bem, você pode fazer assim, no model você cria a função beforeValidate() e trata essa informação dependente do scenario.





    public function beforeValidate() {

        if ($this->scenario == 'update') {

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

                if (empty($this->Reativo)) {

                    $this->addError('Reativo', 'Campo Obrigatório.');

                }

            }            

        }

        return parent::beforeValidate();

    }



Ou até mesmo colocar a regra no rules assim




array('Reativo','required','on'=>'update'),



Acho que sua dica me serve, vou testar agora

mas oq queria é que ele fosse não-requerido, na adição

e obrigatório o preenchimento na edição

Fica assim:




    public function beforeValidate() {

        if ($this->isNewRecord) {

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

                if (empty($this->Reativo)) {

                    $this->addError('Reativo', 'Campo Obrigatório.');

                }

            }            

        }

        return parent::beforeValidate();

    }



ou assim




array('Reativo','required','on'=>'create'),



Não funcionou :mellow:

Precisa fazer alguma coisa pro evento beforeValidate ser chamado?

Eu cheguei a tacar um erro incondicional nele e ele nem bola


		public function beforeValidate() {			

				throw new CHttpException(404,'ERRO.');		

    }    



Consegui ;D

O caso é que no evento ‘actionUpdate’ do controller estava sendo setado o evento ‘register’


$model->scenario='register';

Por isso quando colocava


array('Reativo', 'required', 'on'=>'update'),

no model não funcionava pq não ‘pegava’ o evento update

o ‘register’ é o mesmo evento que ocorre na adição…

mas … qual o motivo dele ter forçado essa mudança de evento?

testei adição e alteração ta certinho

mas fico meio assim ???

deve ter um motivo pra ele ter feito isso

talvez nem precise mais…

tem alguma ideia?