Yii Framework Forum: Duplicação de Registros ao salvar - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Duplicação de Registros ao salvar Rate Topic: ***** 1 Votes

#1 User is offline   Daniel Letieri 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 3
  • Joined: 09-June 10

Posted 08 December 2010 - 07:50 AM

Desenvolvi um sistema, e no mesmo possuo várias tabelas no banco de dados. UMA DELAS... Só uma delas, ao salvar salva o registro duplicado. Duas ou tres cópias do mesmo registro. Alguém faz idéia do que pode estar acontecendo?
0

#2 User is offline   Daniel Augusto Bastos 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 347
  • Joined: 25-May 09
  • Location:Rio de Janeiro - Brasil

Posted 08 December 2010 - 08:18 AM

Poste o model que repete e a parte do código do controller onde salva. 
Every solution creates a problem.
twitter.com/nenhumnick
0

#3 User is offline   Rafael Quines 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 18-December 10

Posted 22 December 2010 - 08:46 AM

Ou vc tá fazendo algumas lógicas que o model tá chamando + de 1 vez o save()..

Outra possibilidade é Triggers... vai saber..

Só qria saber pq postou no forum, se nao vem ver a resposta.

Acho que pelo seu pedido, ele olhou pra mandar, e viu o problma.

abraço
0

#4 User is offline   Newerton 

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

Posted 23 December 2010 - 05:43 PM

Tive um problema essa semana.

Verifica se seu CActiveForm está com enableAjaxValidation => true.

Faz assim, vai no seu Controller, e verifica se o ID do form está igual a função do function performAjaxValidation().


$form = $this->beginWidget('CActiveForm', array(
            'id' => 'index-form',
            'enableAjaxValidation' => true,
            'htmlOptions' => array(
                'enctype' => 'multipart/form-data'
            ),
        ));


protected function performAjaxValidation($model) {
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'index-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }


Observar que o index-form está igual nos dois, senão na hora de submeter o formulário, ele adiciona 2x ou mais.
Newerton Vargas de Araújo
0

#5 User is offline   André Couto 

  • Junior Member
  • Pip
  • Yii
  • Group: Validating
  • Posts: 93
  • Joined: 22-January 11
  • Location:Feira de Santana,Ba

Posted 28 July 2011 - 08:47 PM

Estou tendo este problema.

Segue o model.

<?php

/**
 * This is the model class for table "itens".
 *
 * The followings are the available columns in table 'itens':
 * @property string $id_item
 * @property string $id_empresa
 * @property string $id_objeto
 * @property integer $patrimonio
 * @property string $comentario
 *
 * The followings are the available model relations:
 * @property Empresas $idEmpresa
 * @property Objetos $idObjeto
 * @property ItensLog[] $itensLogs
 */
class Itens extends CActiveRecord
{
	/**
	 * Returns the static model of the specified AR class.
	 * @return Itens 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 'itens';                
	}

	/**
	 * @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('patrimonio', 'numerical', 'integerOnly'=>true),
			array('id_empresa, id_objeto, comentario', 'safe'),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('id_item, id_empresa, id_objeto, patrimonio, comentario', 'safe', 'on'=>'search'),
			array('id_empresa, id_objeto, patrimonio', 'required'),
		);
	}

	/**
	 * @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(
			'idEmpresa' => array(self::BELONGS_TO, 'Empresas', 'id_empresa'),
			'idObjeto' => array(self::BELONGS_TO, 'Objetos', 'id_objeto'),
			'itensLogs' => array(self::HAS_MANY, 'ItensLog', 'id_item'),
		);
	}
	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id_item' => 'Id Item',
			'id_empresa' => 'Id Empresa',
			'id_objeto' => 'Id Objeto',
			'patrimonio' => 'Patrimonio',
			'comentario' => 'Comentario',
		);
	}

	/**
	 * 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.

		$criteria=new CDbCriteria;

		$criteria->compare('id_item',$this->id_item);
		$criteria->compare('id_empresa',$this->id_empresa,true);
		$criteria->compare('id_objeto',$this->id_objeto,true);
		$criteria->compare('patrimonio',$this->patrimonio);
		$criteria->compare('comentario',$this->comentario,true);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
			'sort' => array(
                           'defaultOrder' => 'id_item DESC',
                        ),
                        'pagination' => array(
                           'pageSize' => 10,
                        ),
		));
	}
}

0

#6 User is offline   André Couto 

  • Junior Member
  • Pip
  • Yii
  • Group: Validating
  • Posts: 93
  • Joined: 22-January 11
  • Location:Feira de Santana,Ba

Posted 28 July 2011 - 08:48 PM

Estou tendo este problema.

Segue o model.

<?php

/**
 * This is the model class for table "itens".
 *
 * The followings are the available columns in table 'itens':
 * @property string $id_item
 * @property string $id_empresa
 * @property string $id_objeto
 * @property integer $patrimonio
 * @property string $comentario
 *
 * The followings are the available model relations:
 * @property Empresas $idEmpresa
 * @property Objetos $idObjeto
 * @property ItensLog[] $itensLogs
 */
class Itens extends CActiveRecord
{
	/**
	 * Returns the static model of the specified AR class.
	 * @return Itens 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 'itens';                
	}

	/**
	 * @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('patrimonio', 'numerical', 'integerOnly'=>true),
			array('id_empresa, id_objeto, comentario', 'safe'),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('id_item, id_empresa, id_objeto, patrimonio, comentario', 'safe', 'on'=>'search'),
			array('id_empresa, id_objeto, patrimonio', 'required'),
		);
	}

	/**
	 * @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(
			'idEmpresa' => array(self::BELONGS_TO, 'Empresas', 'id_empresa'),
			'idObjeto' => array(self::BELONGS_TO, 'Objetos', 'id_objeto'),
			'itensLogs' => array(self::HAS_MANY, 'ItensLog', 'id_item'),
		);
	}
	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id_item' => 'Id Item',
			'id_empresa' => 'Id Empresa',
			'id_objeto' => 'Id Objeto',
			'patrimonio' => 'Patrimonio',
			'comentario' => 'Comentario',
		);
	}

	/**
	 * 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.

		$criteria=new CDbCriteria;

		$criteria->compare('id_item',$this->id_item);
		$criteria->compare('id_empresa',$this->id_empresa,true);
		$criteria->compare('id_objeto',$this->id_objeto,true);
		$criteria->compare('patrimonio',$this->patrimonio);
		$criteria->compare('comentario',$this->comentario,true);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
			'sort' => array(
                           'defaultOrder' => 'id_item DESC',
                        ),
                        'pagination' => array(
                           'pageSize' => 10,
                        ),
		));
	}
}

0

#7 User is offline   André Couto 

  • Junior Member
  • Pip
  • Yii
  • Group: Validating
  • Posts: 93
  • Joined: 22-January 11
  • Location:Feira de Santana,Ba

Posted 28 July 2011 - 08:53 PM

Acho q espiritual.. Duplicou aqui o Post, mas é minha net que estava lenta e cliquei 2x rsrsrs
0

#8 User is offline   André Couto 

  • Junior Member
  • Pip
  • Yii
  • Group: Validating
  • Posts: 93
  • Joined: 22-January 11
  • Location:Feira de Santana,Ba

Posted 28 July 2011 - 10:57 PM

Parece ok o codigo. Alguém tem uma luz?
0

#9 User is offline   Gustavo 

  • Master Member
  • Yii
  • Group: Moderators
  • Posts: 916
  • Joined: 27-July 10
  • Location:Curitiba - Brasil

Posted 28 July 2011 - 11:03 PM

poste a action do controller que gera o código duplicado
--
Extensions:
translate modue - module to handle translations
multiActiveRecord - db selection in models
redisCache - redis cache component
mpCpanel - interact with cpanel api
mUploadify - use uploadify uploader in your application

Gustavo Salomé Silva
0

#10 User is offline   André Couto 

  • Junior Member
  • Pip
  • Yii
  • Group: Validating
  • Posts: 93
  • Joined: 22-January 11
  • Location:Feira de Santana,Ba

Posted 29 July 2011 - 06:30 AM

<?php

class ObjetosController 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/column2';

	/**
	 * @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'),
				'users'=>array('*'),
			),
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
				'actions'=>array('create','update'),
				'users'=>array('@'),
			),
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
				'actions'=>array('admin','delete'),
				'users'=>array('admin'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/**
	 * Displays a particular model.
	 * @param integer $id the ID of the model to be displayed
	 */
	public function actionView($id)
	{
		$this->render('view',array(
			'model'=>$this->loadModel($id),
		));
	}

	/**
	 * Creates a new model.
	 * If creation is successful, the browser will be redirected to the 'view' page.
	 */
	public function actionCreate()
	{
		$model=new Objetos;

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Objetos']))
		{
			$model->attributes=$_POST['Objetos'];
			if($model->save())
				$this->redirect(array('view','id'=>$model->id_objeto));
		}

		$this->render('create',array(
			'model'=>$model,
		));
	}

	/**
	 * Updates a particular model.
	 * If update is successful, the browser will be redirected to the 'view' page.
	 * @param integer $id the ID of the model to be updated
	 */
	public function actionUpdate($id)
	{
		$model=$this->loadModel($id);

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Objetos']))
		{
			$model->attributes=$_POST['Objetos'];
			if($model->save())
				$this->redirect(array('view','id'=>$model->id_objeto));
		}

		$this->render('update',array(
			'model'=>$model,
		));
	}

	/**
	 * Deletes a particular model.
	 * If deletion is successful, the browser will be redirected to the 'admin' page.
	 * @param integer $id the ID of the model to be deleted
	 */
	public function actionDelete($id)
	{
		if(Yii::app()->request->isPostRequest)
		{
			// we only allow deletion via POST request
			$this->loadModel($id)->delete();

			// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
			if(!isset($_GET['ajax']))
				$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
		}
		else
			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
	}

	/**
	 * Lists all models.
	 */
	public function actionIndex()
	{
		$dataProvider=new CActiveDataProvider('Objetos');
		$this->render('index',array(
			'dataProvider'=>$dataProvider,
		));
	}

	/**
	 * Manages all models.
	 */
	public function actionAdmin()
	{
		$model=new Objetos('search');
		$model->unsetAttributes();  // clear any default values
		if(isset($_GET['Objetos']))
			$model->attributes=$_GET['Objetos'];

		$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.
	 * @param integer the ID of the model to be loaded
	 */
	public function loadModel($id)
	{
		$model=Objetos::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404,'A página solicitada não existe.');
		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param CModel the model to be validated
	 */
	protected function performAjaxValidation($model)
	{
		if(isset($_POST['ajax']) && $_POST['ajax']==='objetos-form')
		{
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}
}

0

#11 User is offline   Newerton 

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

Posted 02 August 2011 - 12:48 PM

Se seu CActiveForm estiver assim:

$form = $this->beginWidget('CActiveForm', array(
            'id' => 'objetos-form',
            'enableAjaxValidation' => true,
        ));


Com 'enableAjaxValidation' => true, você deve habilitar o $this->performAjaxValidation($model);

Por que senão cada campo do formulário vai passar por validação em ajax no actionCreate(), ai no caso no seu actionCreate(), tem somente o $model->save(), ai depois que a validação de quase todos os campos está OK, caso haja mais outros campos, na hora da validação novamente em ajax, e feito a criação dos registro no banco de dados.

Só descomenta as linhas que contiver $this->performAjaxValidation($model).
Newerton Vargas de Araújo
2

#12 User is offline   André Couto 

  • Junior Member
  • Pip
  • Yii
  • Group: Validating
  • Posts: 93
  • Joined: 22-January 11
  • Location:Feira de Santana,Ba

Posted 02 August 2011 - 08:23 PM

Cara, muito Obrigado!
0

#13 User is offline   Juliana Costa 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 2
  • Joined: 05-February 13

Posted 29 April 2013 - 07:24 PM

View PostNewerton, on 02 August 2011 - 12:48 PM, said:

Se seu CActiveForm estiver assim:

$form = $this->beginWidget('CActiveForm', array(
            'id' => 'objetos-form',
            'enableAjaxValidation' => true,
        ));


Com 'enableAjaxValidation' => true, você deve habilitar o $this->performAjaxValidation($model);

Por que senão cada campo do formulário vai passar por validação em ajax no actionCreate(), ai no caso no seu actionCreate(), tem somente o $model->save(), ai depois que a validação de quase todos os campos está OK, caso haja mais outros campos, na hora da validação novamente em ajax, e feito a criação dos registro no banco de dados.

Só descomenta as linhas que contiver $this->performAjaxValidation($model).



Este post 'salvou' o meu dia!
0

Share this topic:


Page 1 of 1
  • 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