Yii Framework Forum: Validação Ajax - Yii Framework Forum

Jump to content

  • (4 Pages)
  • +
  • 1
  • 2
  • 3
  • 4
  • You cannot start a new topic
  • You cannot reply to this topic

Validação Ajax Validação Ajax Rate Topic: -----

#41 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 30 October 2012 - 09:09 AM

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();
           
        }  

0

#42 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 791
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 30 October 2012 - 06:22 PM

Usa $model->validate() ao invés de $model->beforeSave()
Newerton Vargas de Araújo
0

#43 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 31 October 2012 - 06:28 AM

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?
0

#44 User is offline   Adrian Lucas 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 209
  • Joined: 13-October 11
  • Location:João Pessoa - Paraíba

Posted 31 October 2012 - 08:16 AM

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 model
    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..


Adrian Lucas
A fé em Deus nos faz crer no incrível,
ver o invisível e realizar o impossível.

0

#45 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 31 October 2012 - 12:44 PM

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!!
0

#46 User is offline   Adrian Lucas 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 209
  • Joined: 13-October 11
  • Location:João Pessoa - Paraíba

Posted 31 October 2012 - 12:52 PM

View Postric_ardo, on 31 October 2012 - 12:44 PM, said:

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??
Adrian Lucas
A fé em Deus nos faz crer no incrível,
ver o invisível e realizar o impossível.

0

#47 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 31 October 2012 - 01:07 PM

View PostAdrian Lucas, on 31 October 2012 - 12:52 PM, said:

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.
0

#48 User is offline   Adrian Lucas 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 209
  • Joined: 13-October 11
  • Location:João Pessoa - Paraíba

Posted 31 October 2012 - 01:35 PM

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 Lucas
A fé em Deus nos faz crer no incrível,
ver o invisível e realizar o impossível.

0

#49 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 01 November 2012 - 07:42 AM

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?
0

#50 User is offline   Adrian Lucas 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 209
  • Joined: 13-October 11
  • Location:João Pessoa - Paraíba

Posted 01 November 2012 - 09:30 AM

View Postric_ardo, on 01 November 2012 - 07:42 AM, said:

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á.
Adrian Lucas
A fé em Deus nos faz crer no incrível,
ver o invisível e realizar o impossível.

0

#51 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 791
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 01 November 2012 - 10:19 AM

View PostAdrian Lucas, on 01 November 2012 - 09:30 AM, said:

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


Isso, ia dizer o mesmo, posta por completo.
Newerton Vargas de Araújo
0

#52 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 05 November 2012 - 09:34 AM

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.
0

#53 User is offline   Adrian Lucas 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 209
  • Joined: 13-October 11
  • Location:João Pessoa - Paraíba

Posted 05 November 2012 - 01:07 PM

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 Lucas
A fé em Deus nos faz crer no incrível,
ver o invisível e realizar o impossível.

0

#54 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 05 November 2012 - 01:25 PM

View PostAdrian Lucas, on 05 November 2012 - 01:07 PM, said:

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.
0

#55 User is offline   Adrian Lucas 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 209
  • Joined: 13-October 11
  • Location:João Pessoa - Paraíba

Posted 05 November 2012 - 02:25 PM

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 Lucas
A fé em Deus nos faz crer no incrível,
ver o invisível e realizar o impossível.

0

#56 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 06 November 2012 - 09:57 AM

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

#57 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 07 November 2012 - 07:35 AM

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

#58 User is offline   Adrian Lucas 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 209
  • Joined: 13-October 11
  • Location:João Pessoa - Paraíba

Posted 07 November 2012 - 11:25 AM

View Postric_ardo, on 07 November 2012 - 07:35 AM, said:

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!!!!
Adrian Lucas
A fé em Deus nos faz crer no incrível,
ver o invisível e realizar o impossível.

0

#59 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 07 November 2012 - 01:37 PM

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.
0

#60 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 791
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 07 November 2012 - 05:40 PM

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.
Newerton Vargas de Araújo
0

Share this topic:


  • (4 Pages)
  • +
  • 1
  • 2
  • 3
  • 4
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users