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.
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.
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:
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:
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!
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" ?
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($attribute,$params)
{
$this->model()->setScenario('updateChefe');
if($this->id_avaliacao_chefe_nivel != $this->nivel_esperado){
$this->addError($attribute,'Justifique');
//echo var_dump($this->id_avaliacao_chefe_nivel);
}
}
será que conseguem ajudar com esta nova informação?
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:
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() {
$id = (int) $_GET['id'];
$model = new AvaliacaoCompetenciaTransversalMomento('updateChefe');
$lideranca = new AvaliacaoCompetenciaTransversalLiderancaMomento('updateChefe');
$model1 = new CompetenciaTransversal();
$ctn = new CompetenciaTransversalNivel();
$ctl = new CompetenciaTransversalLideranca();
$Compet = $model->ListaCompetChefe();
$competLider = $lideranca->ListaCompetChefe();
$items = $this->getItemsToUpdate();
$getCTL = $this->getItemsToUpdate1();
$NStatus = MomentoAvaliacaoColaborador::model()->getStatusChefe();
$indCTL= $this->getIndicadorCTL();
$indCT= $this->getIndicadorCT();
$this->performAjaxValidation(array($model,$lideranca), 'user-form');
if (isset($_POST['AvaliacaoCompetenciaTransversalMomento']) || isset($_POST['AvaliacaoCompetenciaTransversalLiderancaMomento'])) {
$valid = true;
foreach ($items as $i => $item) {
if (isset($_POST['AvaliacaoCompetenciaTransversalMomento'][$i])) {
$item->attributes = $_POST['AvaliacaoCompetenciaTransversalMomento'][$i];
$valid=$item->validate() && $valid;
$model->validate();
$item->save();
} ....
[/color]}