Validação Ajax

Adrian, como estou engatinhando no Yii devo estar fazendo alguma coisa errada mas não descubro. Resolvi tirar todas as suspeitas. Criei uma nova aplicação, do zero, sem nenhuma extensão. Deu o mesmo problema.

Fiz um teste. Coloquei no controller $this->status = 1 e no model (beforesave) $this->status++. Deveria gravar 2, mas ele grava 3. Enfim, chama duas vezes o beforesave. Alguém tem alguma ideia do que pode estar acontecendo? Veja o código:

_Controller


public function actionCreate()

	{

		$model=new pj;


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['pj']))

		{

			$model->attributes=$_POST['pj'];

                        $model->pj_status = 1;

                        if($model->beforeSave()){

                            if($model->save())

				$this->redirect(array('view','id'=>$model->idpj));

                        }

			

		}


		$this->render('create',array(

			'model'=>$model,

		));

	}

_model


public function beforeSave()

        {

           $this->pj_status++;

            return parent::beforeSave();

           

        }  

Usa $model->validate() ao invés de $model->beforeSave()

Newerton, mudei para $model->validate() e ele não chamou o beforeSave.

Percebi o seguinte: quando vou inserir um novo registro se eu uso no controller o


if($model->beforeSave())

ele chama duas vezes o metodo, porém se não uso, se deixo simplesmente assim


$model->attributes=$_POST['usuario'];

                   if($model->save())

			$this->redirect(array('view', 'created'=>'true', 'id'=>$model->idusuario));

                     

ou usando o


if($model->validate())

ele não chama o método beforeSave.

Porém quando vou atualizar (actionUpdate) simplesmente deixo assim


if(isset($_POST['usuario']))

		{

			$model->attributes=$_POST['usuario'];

			if($model->save())

				$this->redirect(array('view','id'=>$model->idusuario));

		}

e chama o método beforeSave corretamente. Já percorri todo codigo e já li vários tópicos e não encontro nada. Tem alguma luz por favor?

Ric_ardo o beforeSave() você utiliza nos nodels mesmo




    public function beforeSave() {

        if ($this->isNewRecord) {

           //regras   

        }       

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

           //regras   

        }


        return parent::beforeSave();

    }



Quando você utilizar o beforeValidate() também coloca no [b]model

[/b]




    public function beforeValidate() {

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

          //Regras

            }

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

          //Regras

            }


        }

        return parent::beforeValidate();

    }



Quando você utilizar o beforeValidate nos seus models colocar assim nos controllers




if(isset($_POST['usuario'])) 

                { 

                        $model->attributes=$_POST['usuario']; 

                        if($model->validate() && $model->save()) 

                                $this->redirect(array('view','id'=>$model->idusuario)); 

                }



Desta forma pra mim sempre dá certo…

Criei o metodo BeforeValidate e deu certo. Mas uma duvida: o que preciso fazer é conversão de valores (moeda) para gravar no banco e setar valores de status, data de cadastro e coisas assim. Penso que o ideal seria fazer isso no BeforeSave e não no BeforeValidate. Estou certo? Ou posso fazer em qualquer um dos dois?

Estou intrigado com BeforeSave, porque ele não funciona. Se alguém tiver mais alguma ideia agradeço.

De qualquer maneira, obrigado pelas dicas!!

No beforeSave você pode fazer conversões de falores e de Strings etc., já no BeforeValidate você faz regras de inserções no banco, tipo: "O usuário só poderá colocar uma data se não for maior que 5 dias da data atual".

Se quiseres posso colocar algum exemplo, quai são os dados que você deseja converter e setar do banco??

Abaixo BeforeValidate que estou usando com campos que preciso validar.


public function beforeValidate() {

            if (!parent::beforeValidate()) return false;

            $this->valor = str_replace(',', '.', str_replace('.', '', $this->valor));

            $this->placa = strtoupper($this->placa);

            ($this->tipo == 0 && $this->valor < 70000) ? $this->valor = 70000 : '';

            ($this->tipo == 1 && $this->valor < 100000) ? $this->valor = 100000 : '';

            ($this->tipo == 2 && $this->valor < 100000) ? $this->valor = 100000 : '';

            ($this->tipo == 3 && $this->valor < 130000) ? $this->valor = 130000 : '';

            if ($this->isNewRecord) {

                $this->status = 1;

                $this->datacad = date('d/m/Y H:i:s');

                $this->usuario_idusuario = Yii::app()->user->id;

            } 

            return parent::beforeValidate();

        }

Deste jeito o BeforeValidate está me atendendo, mas fico preocupado com este problema no BeforeSave porque tenho certeza que futuramente vou acabar precisando usar o mesmo e não sei o motivo de não estar funcionando corretamente.

ric_ardo na verdade esta mesma regra sua eu usaria no beforeSave, traduzinho antes de salvar

Ficaria assim:




public function beforeSave() {             

             $this->valor = str_replace(',', '.', str_replace('.', '', $this->valor));             

             $this->placa = strtoupper($this->placa);

             ($this->tipo == 0 && $this->valor < 70000) ? $this->valor = 70000 : '';

             ($this->tipo == 1 && $this->valor < 100000) ? $this->valor = 100000 : '';

             ($this->tipo == 2 && $this->valor < 100000) ? $this->valor = 100000 : '';

             ($this->tipo == 3 && $this->valor < 130000) ? $this->valor = 130000 : '';

             if ($this->isNewRecord) {

                 $this->status = 1;

                 $this->datacad = date('d/m/Y H:i:s');

                 $this->usuario_idusuario = Yii::app()->user->id;

                 $this->dataentrada= date('Y-m-d', CDateTimeParser::parse($this->dataentrada, Yii::app()->locale->dateFormat));

             }

              return parent::beforeSave();

         }



Ja no beforeValidate colocaria uma regra mais ou nemos assim:




    public function beforeValidate() {

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

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

                if ((CDateTimeParser::parse($this->dataentrada, Yii::app()->locale->dateFormat) > strtotime('now'))) {

                    $this->addError('dataentrada', 'A data não pode ser superior a hoje');

                }

            }

        }

        return parent::beforeValidate();

    }






Faz esse teste e vê como fica.

Adrian, talvez eu não tenha me expressado claramente, mas o meu problema é justamente fazer com que o beforeSave funcione corretamente. Desde o principio tenho tentado fazer exatamente do modo como vc postou, usando o beforeSave, mas ele sempre converte a data para 1969-12-31, e isso ocorre porque por algum motivo (é isso que tô tentando descobrir)ele chama duas vezes o beforesave.

Fazendo isso ele converte uma vez a data de 01/11/2012 para 2012-11-01 e depois converte de novo 2012-11-01 para 1969-12-31. Porque ele faz isso eu não descobri. Quando uso apenas o BeforeValidate, conforme postei anteriormente ele converte apenas uma vez a data grava corretamente. Entendeu qual o meu problema?

Amigo posta teu model e o controller pra vermos como é que está.

Isso, ia dizer o mesmo, posta por completo.

Opa, ai vai…

_model


<?php


/**

 * This is the model class for table "veiculo".

 *

 * The followings are the available columns in table 'veiculo':

 * @property integer $idveiculo

 * @property string $datacad

 * @property string $dataentrada

 * @property integer $tipo

 * @property string $fipe

 * @property string $marca

 * @property string $modelo

 * @property integer $anofabricacao

 * @property integer $anomodelo

 * @property string $valor

 * @property string $placa

 * @property string $cor

 * @property string $chassi

 * @property string $motor

 * @property string $caixa

 * @property string $diferencial

 * @property string $renavam

 * @property integer $combustivel

 * @property integer $substituir

 * @property integer $rodoar

 * @property integer $interclima

 * @property integer $qtdinterclima

 * @property integer $suspensor_eixo

 * @property integer $lanternagem

 * @property integer $paralamas

 * @property integer $rastreador

 * @property string $marca_rastr

 * @property integer $pneus_dianteiros

 * @property integer $pneus_traseiros

 * @property string $obs

 * @property integer $status

 * @property integer $vistoria

 * @property integer $associado_idassociado

 * @property integer $usuario_idusuario

 */

class veiculo extends CActiveRecord

{

	/**

	 * Returns the static model of the specified AR class.

	 * @return veiculo the static model class

	 */

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}


	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return 'veiculo';

	}


	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

			array('fipe, placa, status, associado_idassociado, usuario_idusuario', 'required'),

                        array('placa', 'application.extensions.uniqueMultiColumnValidator', 'on'=>array('insert','update')),//verifica e não permite duplicar placa no banco de dados

			array('tipo, anofabricacao, combustivel, substituir, rodoar, interclima, qtdinterclima, suspensor_eixo, lanternagem, paralamas, rastreador, pneus_dianteiros, pneus_traseiros, status, vistoria, associado_idassociado, usuario_idusuario', 'numerical', 'integerOnly'=>true),

			array('fipe, renavam, marca_rastr', 'length', 'max'=>15),

			array('marca, chassi', 'length', 'max'=>25),

                        array('modelo', 'length', 'max'=>75),

			array('placa', 'length', 'max'=>10),

                        array('valor', 'length', 'max'=>15),

			array('cor, motor, caixa, diferencial', 'length', 'max'=>20),

			array('obs', 'length', 'max'=>200),

                        //array('dataentrada', 'default', 'value'=>null),

			array('idveiculo, datacad, dataentrada, tipo, fipe, marca, modelo, anofabricacao, anomodelo, valor, placa, cor, chassi, motor, caixa, diferencial, renavam, combustivel, substituir, rodoar, interclima, qtdinterclima, suspensor_eixo, lanternagem, paralamas, rastreador, marca_rastr, pneus_dianteiros, pneus_traseiros, obs, status, vistoria, associado_idassociado, usuario_idusuario', 'safe'),

			// The following rule is used by search().

			// Please remove those attributes that should not be searched.

			array('idveiculo, datacad, dataentrada, tipo, fipe, marca, modelo, anofabricacao, anomodelo, valor, placa, cor, chassi, motor, caixa, diferencial, renavam, combustivel, substituir, rodoar, interclima, qtdinterclima, suspensor_eixo, lanternagem, paralamas, rastreador, marca_rastr, pneus_dianteiros, pneus_traseiros, obs, status, vistoria, associado_idassociado, usuario_idusuario', 'safe', 'on'=>'search'),

		);

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'implementos' => array(self::HAS_MANY, 'Implemento', 'veiculo_idveiculo'),

			'recibos' => array(self::HAS_MANY, 'Recibo', 'veiculo_idveiculo'),

			'sinistros' => array(self::HAS_MANY, 'Sinistro', 'veiculo_idveiculo'),

			'associado_idassociado0' => array(self::BELONGS_TO, 'Associado', 'associado_idassociado'),

			'usuario_idusuario0' => array(self::BELONGS_TO, 'Usuario', 'usuario_idusuario'),

		);

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'idveiculo' => 'Idveiculo',

			'datacad' => 'Data Cadastro',

			'dataentrada' => 'Data entrada',

			'tipo' => 'Tipo de veiculo',

			'fipe' => 'Fipe',

			'marca' => 'Marca',

			'modelo' => 'Modelo',

			'anofabricacao' => 'Ano Fab.',

			'anomodelo' => 'Ano Mod.',

			'valor' => 'Valor',

			'placa' => 'Placa',

			'cor' => 'Cor',

			'chassi' => 'Chassi',

			'motor' => 'Motor',

			'caixa' => 'Caixa',

			'diferencial' => 'Diferencial',

			'renavam' => 'Renavam',

			'combustivel' => 'Combustivel',

			'substituir' => 'Substituir',

			'rodoar' => 'Rodoar',

			'interclima' => 'Interclima',

			'qtdinterclima' => 'Qtd Int.',

			'suspensor_eixo' => 'Susp. Eixo',

			'lanternagem' => 'Lanternagem',

			'paralamas' => 'Paralamas',

			'rastreador' => 'Rastreador',

			'marca_rastr' => 'Marca Rastr.',

			'pneus_dianteiros' => 'Pneus Dianteiros',

			'pneus_traseiros' => 'Pneus Traseiros',

			'obs' => 'Obs',

			'status' => 'Status',

			'vistoria' => 'Vistoria',

			'associado_idassociado' => 'Associado',

			'usuario_idusuario' => 'Cadastrado por',

		);

	}


	/**

	 * Retrieves a list of models based on the current search/filter conditions.

	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.

	 */

	public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.

                

                if ($this->datacad){

                    $datacadastro = date('Y-m-d', CDateTimeParser::parse($this->datacad, Yii::app()->locale->dateFormat));

                } else {

                    $datacadastro = '';

                }

                

		$criteria=new CDbCriteria;

		$criteria->compare('idveiculo',$this->idveiculo);

		$criteria->compare('datacad',$datacadastro,true);

		$criteria->compare('dataentrada',$this->dataentrada,true);

		$criteria->compare('tipo',$this->tipo);

		$criteria->compare('fipe',$this->fipe,true);

		$criteria->compare('marca',$this->marca,true);

		$criteria->compare('modelo',$this->modelo,true);

		$criteria->compare('anofabricacao',$this->anofabricacao);

		$criteria->compare('anomodelo',$this->anomodelo);

		$criteria->compare('valor',$this->valor,true);

		$criteria->compare('placa',$this->placa,true);

		$criteria->compare('cor',$this->cor,true);

		$criteria->compare('chassi',$this->chassi,true);

		$criteria->compare('motor',$this->motor,true);

		$criteria->compare('caixa',$this->caixa,true);

		$criteria->compare('diferencial',$this->diferencial,true);

		$criteria->compare('renavam',$this->renavam,true);

		$criteria->compare('combustivel',$this->combustivel);

		$criteria->compare('substituir',$this->substituir);

		$criteria->compare('rodoar',$this->rodoar);

		$criteria->compare('interclima',$this->interclima);

		$criteria->compare('qtdinterclima',$this->qtdinterclima);

		$criteria->compare('suspensor_eixo',$this->suspensor_eixo);

		$criteria->compare('lanternagem',$this->lanternagem);

		$criteria->compare('paralamas',$this->paralamas);

		$criteria->compare('rastreador',$this->rastreador);

		$criteria->compare('marca_rastr',$this->marca_rastr,true);

		$criteria->compare('pneus_dianteiros',$this->pneus_dianteiros);

		$criteria->compare('pneus_traseiros',$this->pneus_traseiros);

		$criteria->compare('obs',$this->obs,true);

		$criteria->compare('status',$this->status);

		$criteria->compare('vistoria',$this->vistoria);

		$criteria->compare('associado_idassociado',$this->associado_idassociado);

		$criteria->compare('usuario_idusuario',$this->usuario_idusuario);


		return new CActiveDataProvider('veiculo', array(

			'criteria'=>$criteria,

		));

	}

        

        /**

         *Faz consulta no banco de dados dos anos modelo para retorno do campo anomodelo no update.

         * @return array contendo lista dos anos modelo de acordo com o veiculo escolhido 

         */

        public function getListaanos()

        {

            $lista = Yii::app()->dbfipe->createCommand("SELECT nome FROM ano_modelo WHERE modelo='".$this->fipe."'")->queryAll();

            $listaArray = CHtml::listData($lista, 'nome', 'nome');

            return $listaArray;

        }   

        

        /**

         *Função a ser executada antes de salvar um registro

         * @return boolean 

         */

        public function beforeSave()

        {

            if (!parent::beforeSave()) return false;

            

            $this->valor = str_replace(',', '.', str_replace('.', '', $this->valor));

            $this->placa = strtoupper($this->placa);

            ($this->tipo == 0 && $this->valor < 70000) ? $this->valor = 70000 : '';

            ($this->tipo == 1 && $this->valor < 100000) ? $this->valor = 100000 : '';

            ($this->tipo == 2 && $this->valor < 100000) ? $this->valor = 100000 : '';

            ($this->tipo == 3 && $this->valor < 130000) ? $this->valor = 130000 : '';

            

            if ($this->isNewRecord){

                $this->status = 1;

                $this->datacad = date('d/m/Y H:i:s');

                $this->usuario_idusuario = Yii::app()->user->id;

            }

            return parent::beforeSave();

           

        }  

        

        public function beforeValidate()

        {

            if (!parent::beforeValidate()) return false;

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

                if ((CDateTimeParser::parse($this->dataentrada, Yii::app()->locale->dateFormat) > strtotime('now'))) {

                    $this->addError('dataentrada', 'A data nao pode ser superior a hoje');

                }

            }

            return parent::beforeValidate();

        }

         

        public function behaviors()

        {

            //Extensão que percorre todo formulário e altera os campos de data e data/hora para formato americano antes de salvar no banco e faz o processo contrario para visulização.

            return array('datetimeI18NBehavior' => array('class' => 'ext.DateTimeI18NBehavior')); // 'ext' is in Yii 1.0.8 version. For early versions, use 'application.extensions' instead.

        }

        

        /**

         *Função para ordenar pelo idveiculo a grid e qualquer consulta que utilize o model por padrão.

         * @return type 

         */

        public function defaultScope(){

            return array(

                'order'=>'idveiculo ASC',

            );

        }

}

_Controller


<?php


class VeiculoController extends Controller

{

	/**

	 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning

	 * using two-column layout. See 'protected/views/layouts/column2.php'.

	 */

	public $layout='//layouts/column1';


	/**

	 * @var CActiveRecord the currently loaded data model instance.

	 */

	private $_model;


	/**

	 * @return array action filters

	 */

	public function filters()

	{

		return array(

			'accessControl', // perform access control for CRUD operations

		);

	}


	/**

	 * Specifies the access control rules.

	 * This method is used by the 'accessControl' filter.

	 * @return array access control rules

	 */

	public function accessRules()

	{

		return array(

			array('allow',  // allow all users to perform 'index' and 'view' actions

				'actions'=>array('index','view','list','anomodel'),

				'users'=>array('*'),

			),

			array('allow', // allow authenticated user to perform 'create' and 'update' actions

				'actions'=>array('create','delete', 'admin', 'update','list','anomodel'),

				'users'=>array('@'),

			),

			array('allow', // allow admin user to perform 'admin' and 'delete' actions

				'actions'=>array('admin','delete','list', 'anomodel'),

				'users'=>array('admin'),

			),

			array('deny',  // deny all users

				'users'=>array('*'),

			),

                        array('deny', //deny all actions

                                'actions'=>array('*')

                        ),

		);

	}


	/**

	 * Displays a particular model.

	 */

	public function actionView()

	{

		$this->render('view',array(

			'model'=>$this->loadModel(),

		));

	}


	/**

	 * Creates a new model.

	 * If creation is successful, the browser will be redirected to the 'view' page.

	 */

	public function actionCreate()

	{

		$model=new veiculo;

                

		// Uncomment the following line if AJAX validation is needed

		$this->performAjaxValidation($model);


		if(isset($_POST['veiculo']))

		{

			$model->attributes=$_POST['veiculo'];

                        if($model->beforeSave()){

                            if($model->save())

                            $this->redirect(array('view','created'=>'true','id'=>$model->idveiculo));

                        }

		}


		$this->render('create',array(

			'model'=>$model,

		));

	}


	/**

	 * Updates a particular model.

	 * If update is successful, the browser will be redirected to the 'view' page.

	 */

	public function actionUpdate()

	{

		$model=$this->loadModel();


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['veiculo']))

		{

			$model->attributes=$_POST['veiculo'];

                        

			//$model->valor = str_replace(',', '.', str_replace('.', '', $model->valor));

                        

			if($model->save())

				$this->redirect(array('view','updated'=>'true','id'=>$model->idveiculo));

		}


		$this->render('update',array(

			'model'=>$model,

		));

	}


	/**

	 * Deletes a particular model.

	 * If deletion is successful, the browser will be redirected to the 'index' page.

	 */

	public function actionDelete()

	{

		if(Yii::app()->request->isPostRequest)

		{

			// we only allow deletion via POST request

			$this->loadModel()->delete();


			// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

			if(!isset($_GET['ajax']))

				$this->redirect(array('index'));

		}

		else

			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

	}


	/**

	 * Lists all models.

	 */

	public function actionIndex()

	{

		$dataProvider=new CActiveDataProvider('veiculo');

		$this->render('index',array(

			'dataProvider'=>$dataProvider,

		));

	}


	/**

	 * Manages all models.

	 */

	public function actionAdmin()

	{

		$model=new veiculo('search');

		$model->unsetAttributes();  // clear any default values

		if(isset($_GET['veiculo']))

			$model->attributes=$_GET['veiculo'];


		$this->render('admin',array(

			'model'=>$model,

		));

	}


	/**

	 * Returns the data model based on the primary key given in the GET variable.

	 * If the data model is not found, an HTTP exception will be raised.

	 */

	public function loadModel()

	{

		if($this->_model===null)

		{

			if(isset($_GET['id']))

				$this->_model=veiculo::model()->findbyPk($_GET['id']);

			if($this->_model===null)

				throw new CHttpException(404,'The requested page does not exist.');

		}

		return $this->_model;

	}


	/**

	 * Performs the AJAX validation.

	 * @param CModel the model to be validated

	 */

	protected function performAjaxValidation($model)

	{

		if(isset($_POST['ajax']) && $_POST['ajax']==='veiculo-form')

		{

			echo CActiveForm::validate($model);

			Yii::app()->end();

		}

	}

        

        /**

         *Pega id Fipe pelo $_POST e consulta o banco de dados pelos anos modelo de acordo com codigo FIPE e monta lista para dropdown para anomodelo 

         */

        public function actionAnomodel()

        {

          $id = $_POST['veiculo']['fipe'];

          $idano = $_POST['veiculo']['anomodelo'];

          

          $valor = Yii::app()->dbfipe->createCommand("SELECT valor FROM ano_modelo WHERE modelo='$id' AND nome='$idano'")->queryRow(false);

          echo CJSON::encode(array('valor'=>number_format($valor[0], 2, ',', '.')));

        }

        

        /**

         *Pega FIPE e anomodelo de acordo com valores escolhidos pelo usuário e faz consulta no banco para 

         * atualização dos campos marca, modelo e valor 

         */

        public function actionList()

        {

          $id = $_POST['fipe'];

          $data = Yii::app()->dbfipe->createCommand("SELECT nome, marca FROM modelo WHERE id='$id'")->queryRow(false);

          $marca = Yii::app()->dbfipe->createCommand("SELECT nome FROM marca WHERE id='$data[1]'")->queryRow(false);

          $anos = Yii::app()->dbfipe->createCommand("SELECT nome FROM ano_modelo WHERE modelo='$id'")->queryAll();

          

          $anos = CHtml::listData($anos, 'nome', 'nome');

          $drop = CHtml::tag('option', array('value' => ''), CHtml::encode('Selecione'), true);

          

          foreach ($anos as $value => $name) {

            $drop .= CHtml::tag('option', array('value' => $value), CHtml::encode($name), true);

          }

          

          echo CJSON::encode(array('marca'=>$marca[0], 'modelo'=>$data[0], 'anomodelo'=>$drop));

          

        }

        

}



Apenas reforçando, do modo como está ele salva a data de cadastro corretamente (inserida no beforeSave pelo comando $this->datacad = date(‘d/m/Y H:i:s’)), porém a data de entrada inserida pelo usuario salva no banco como 1969-12-31 e os campos monetarios como $this->valor faz a conversão colocando 2 zeros a mais no fim do numero, justamente por fazer duas vezes a conversão.

Obrigado pela atenção mais uma vez.

ric_ardo não precisa colocar o beforeSave() no controller não. Deixa no padrão é vê se dá certo??




        public function actionCreate() 

        { 

                $model=new veiculo; 

                 

                // Uncomment the following line if AJAX validation is needed 

                $this->performAjaxValidation($model); 

 

                if(isset($_POST['veiculo'])) 

                { 

                        $model->attributes=$_POST['veiculo']; 

                            if($model->save()) 

                            $this->redirect(array('view','created'=>'true','id'=>$model->idveiculo)); 

                } 

 

                $this->render('create',array( 

                        'model'=>$model, 

                )); 

        } 



Adrian, quando tiro o beforeSave do Controller, ele não chama o método. Ele dá mensagem no browser de que precisa preencher os campos status e usuario_idusuario (campos obrigatórios), justamente os campos que deveriam ser preenchidos ao chamar o beforeSave.

Blza ric_ardo, coloca o teu beforeSave() assim, e vê se dá OK




    public function beforeSave() {

        if ($this->isNewRecord) {

            $this->status = 1;

            $this->datacad = date('d/m/Y H:i:s');

            $this->usuario_idusuario = Yii::app()->user->id;

            $this->valor = str_replace(',', '.', str_replace('.', '', $this->valor));

            $this->placa = strtoupper($this->placa);

            ($this->tipo == 0 && $this->valor < 70000) ? $this->valor = 70000 : '';

            ($this->tipo == 1 && $this->valor < 100000) ? $this->valor = 100000 : '';

            ($this->tipo == 2 && $this->valor < 100000) ? $this->valor = 100000 : '';

            ($this->tipo == 3 && $this->valor < 130000) ? $this->valor = 130000 : '';

        }

        return parent::beforeSave();

    }



Adrian, fiz da forma que você falou e deu o mesmo problema. Continua não chamando o beforeSave.

Ninguém tem ideia do que pode estar ocorrendo? Estou precisando muito resolver isso. Se alguém tiver qualquer dica agradeço bastante.

ric_ardo infelismente não sei o que está acontecendo, nas minhas aplicações faço sempre desta forma "como falei" e sempre dá certo. Sei lá, tenta gerar novamente o model e crud veiculo pra vê se dá certo.

Então você colocar no controller




        public function actionCreate()          {

                  $model=new veiculo;

                  // Uncomment the following line if AJAX validation is needed

                  // $this->performAjaxValidation($model); 

                   if(isset($_POST['veiculo']))                  {

                          $model->attributes=$_POST['veiculo'];

                              if($model->validate() && $model->save())

                              $this->redirect(array('view','created'=>'true','id'=>$model->idveiculo));

                  }

                    $this->render('create',array(

                          'model'=>$model,

                  ));

          } 



E no model acrescenta




    public function beforeSave() {

         if ($this->isNewRecord) {

             $this->status = 1;

             $this->datacad = date('d/m/Y H:i:s');

             $this->usuario_idusuario = Yii::app()->user->id;

             $this->valor = str_replace(',', '.', str_replace('.', '', $this->valor));

             $this->placa = strtoupper($this->placa);

//Tenta tirar essa regra aqui a baixo só pra teste

             ($this->tipo == 0 && $this->valor < 70000) ? $this->valor = 70000 : '';

             ($this->tipo == 1 && $this->valor < 100000) ? $this->valor = 100000 : '';

             ($this->tipo == 2 && $this->valor < 100000) ? $this->valor = 100000 : '';

             ($this->tipo == 3 && $this->valor < 130000) ? $this->valor = 130000 : '';

         }

         return parent::beforeSave();

     }


        public function beforeValidate()

         {

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

                 if ((CDateTimeParser::parse($this->dataentrada, Yii::app()->locale->dateFormat) > strtotime('now'))) {

                     $this->addError('dataentrada', 'A data nao pode ser superior a hoje');

                 }

             }

             return parent::beforeValidate();

         } 



Como eu disse sempre dá certo assim comigo. Se algum amigo tiver outro exemplo avisa aí pra nós. Flw!!!!

Ok Adrian, muito obrigado pelas dicas. Valeu mesmo!

Vou tentar gerar novamente o CRUD e MODEL como vc sugeriu. Se alguém tiver mais alguma luz e puder me ajudar por favor.

ricardo,

Usa assim:


if($model->validate()){


if($model->save())

    $this->redirect(array('view','created'=>'true','id'=>$model->idveiculo));


}

O $model->validate() executa seu beforeValidate(), se não tiver efetuando a validação, me fala qual as variáveis do beforeValidate não está sendo alterado.