Yii Framework Forum: Ajuda Com Active Record Relacional - Yii Framework Forum

Jump to content

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

Ajuda Com Active Record Relacional Rate Topic: -----

#1 User is offline   Gaúcho 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 25
  • Joined: 17-December 12

Posted 20 December 2012 - 05:36 PM

Amigos,

Seguinte, eu criei um formulário para cadastro de cliente onde o cliente seleciona se é Pessoa Física ou Pessoa Jurídica, são três tabelas (cliente, pessoa_fisica e pessoa_juridica). No diagrama de entidade-relacionamento que eu fiz coloquei fk_cliente tanto na tabela pessoa_fisica quanto na pessoa_juridica.

No modelo Cliente a relação ficou assim:
public function relations()
{
	return array(
		'pessoaFisicas' => array(self::HAS_ONE, 'PessoaFisica', 'fk_cliente'),
		'pessoaJuridicas' => array(self::HAS_ONE, 'PessoaJuridica', 'fk_cliente'),
	);
}


A parte de cadastro eu já fiz, funcionou direitinho, porém não consigo fazer a parte de update. Eu preciso alterar no meu controller Cliente o actionUpdate e o loadModel? Como fazer?

Segue abaixo como estão atualmente meu actionUpdate e o loadModel:

actionUpdate
public function actionUpdate($id)
{
	$model=$this->loadModel($id);

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

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

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


loadModel
public function loadModel($id)
{
	$model=Cliente::model()->findByPk((int)$id);
	if($model===null)
		throw new CHttpException(404,'A página solicitada não existe.');
	return $model;
}


O meu actionCreate ficou assim:
public function actionCreate()
{
	$model=new Cliente;
	$modelPessoaFisica=new PessoaFisica;
	$modelPessoaJuridica=new PessoaJuridica;

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

	if(isset($_POST['Cliente']))
	{
		$model->attributes=$_POST['Cliente'];

		if($model->tipo_pessoa == "Física"){
			$modelPessoaFisica->attributes=$_POST['PessoaFisica'];
			$valid=$model->validate();
			$valid=$modelPessoaFisica->validate() && $valid;
			if($valid){
				if($model->save()){
					$modelPessoaFisica->fk_cliente = $model->id_cliente;
					$modelPessoaFisica->save();
					$this->redirect(array('view','id'=>$model->id_cliente));
				}
			}
		}elseif($model->tipo_pessoa == "Jurídica"){
			$modelPessoaJuridica->attributes=$_POST['PessoaJuridica'];
			$valid=$model->validate();
			$valid=$modelPessoaJuridica->validate() && $valid;
			if($valid){
				if($model->save()){
					$modelPessoaJuridica->fk_cliente = $model->id_cliente;
					$modelPessoaJuridica->save();
					$this->redirect(array('view','id'=>$model->id_cliente));
				}
			}
		}
	}

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


Agradeço a ajuda desde já... abraços!!!
0

#2 User is offline   Anderson Scouto da Silva 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 09-May 12

Posted 20 December 2012 - 06:22 PM

View PostMarnei, on 20 December 2012 - 05:36 PM, said:

Amigos,

Seguinte, eu criei um formulário para cadastro de cliente onde o cliente seleciona se é Pessoa Física ou Pessoa Jurídica, são três tabelas (cliente, pessoa_fisica e pessoa_juridica). No diagrama de entidade-relacionamento que eu fiz coloquei fk_cliente tanto na tabela pessoa_fisica quanto na pessoa_juridica.

No modelo Cliente a relação ficou assim:
public function relations()
{
	return array(
		'pessoaFisicas' => array(self::HAS_ONE, 'PessoaFisica', 'fk_cliente'),
		'pessoaJuridicas' => array(self::HAS_ONE, 'PessoaJuridica', 'fk_cliente'),
	);
}


A parte de cadastro eu já fiz, funcionou direitinho, porém não consigo fazer a parte de update. Eu preciso alterar no meu controller Cliente o actionUpdate e o loadModel? Como fazer?

Segue abaixo como estão atualmente meu actionUpdate e o loadModel:

actionUpdate
public function actionUpdate($id)
{
	$model=$this->loadModel($id);

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

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

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


loadModel
public function loadModel($id)
{
	$model=Cliente::model()->findByPk((int)$id);
	if($model===null)
		throw new CHttpException(404,'A página solicitada não existe.');
	return $model;
}


O meu actionCreate ficou assim:
public function actionCreate()
{
	$model=new Cliente;
	$modelPessoaFisica=new PessoaFisica;
	$modelPessoaJuridica=new PessoaJuridica;

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

	if(isset($_POST['Cliente']))
	{
		$model->attributes=$_POST['Cliente'];

		if($model->tipo_pessoa == "Física"){
			$modelPessoaFisica->attributes=$_POST['PessoaFisica'];
			$valid=$model->validate();
			$valid=$modelPessoaFisica->validate() && $valid;
			if($valid){
				if($model->save()){
					$modelPessoaFisica->fk_cliente = $model->id_cliente;
					$modelPessoaFisica->save();
					$this->redirect(array('view','id'=>$model->id_cliente));
				}
			}
		}elseif($model->tipo_pessoa == "Jurídica"){
			$modelPessoaJuridica->attributes=$_POST['PessoaJuridica'];
			$valid=$model->validate();
			$valid=$modelPessoaJuridica->validate() && $valid;
			if($valid){
				if($model->save()){
					$modelPessoaJuridica->fk_cliente = $model->id_cliente;
					$modelPessoaJuridica->save();
					$this->redirect(array('view','id'=>$model->id_cliente));
				}
			}
		}
	}

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


Agradeço a ajuda desde já... abraços!!!


Acredito que para começar os clientes deveriam ficar na mesma tabela, tanto faz se for física ou jurídica. Qual é o problema com seu update? Da algum erro ou simplesmente não salva? Posta os dois models também. Vamos ver se eu posso te ajudar. Abraços.
0

#3 User is offline   Gaúcho 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 25
  • Joined: 17-December 12

Posted 20 December 2012 - 09:56 PM

Olá Anderson,

Então, no _form.php da view Cliente eu criei campos do modelo PessoaFisica e PessoaJuridica, como por exemplo:

<div class="<?php echo $form->fieldClass($modelPessoaFisica, 'nome'); ?>">
    <?php echo $form->labelEx($modelPessoaFisica,'nome'); ?>
    <div class="input">
        <?php echo $form->textField($modelPessoaFisica,'nome',array('size'=>60,'maxlength'=>60)); ?>
        <?php echo $form->error($modelPessoaFisica,'nome'); ?>
    </div>
</div>


Então quando acesso index.php?r=cliente/update&id=1 por exemplo ele apresenta o erro "Undefined variable: modelPessoaFisica". Depois que eu realizo as alterações abaixo ele pára de apresentar esse erro:

Na view Cliente em update.php:
<?php echo $this->renderPartial('_form', array(
	'model'=>$model,
	'modelPessoaFisica'=>$modelPessoaFisica,
	'modelPessoaJuridica'=>$modelPessoaJuridica
	));
?>


...e altero no ClienteController o actionUpdate() para:
	public function actionUpdate($id)
	{
		$model=$this->loadModel($id);
		$modelPessoaFisica=$this->loadModelPessoaFisica($model->id_cliente);
		$modelPessoaJuridica=$this->loadModelPessoaJuridica($model->id_cliente);


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

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

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


...e adiciono o loadModelPessoaFisica e loadModelPessoaJuridica no ClienteController assim:
	public function loadModelPessoaFisica($id)
	{
		$modelPessoaFisica=PessoaFisica::model()->findByPk((int)$id);
		
		if($modelPessoaFisica===null)
			throw new CHttpException(404,'A página solicitada não existe.');
		return $modelPessoaFisica;
	}

	public function loadModelPessoaJuridica($id)
	{
		$modelPessoaJuridica=PessoaJuridica::model()->findByPk((int)$id);
		
		if($modelPessoaJuridica===null)
			throw new CHttpException(404,'A página solicitada não existe.');
		return $modelPessoaJuridica;
	}


...ele pára de apresentar aquele erro, porém aparece o erro 404 e a mensagem "A página solicitada não existe." e não apresenta o formulário com os dados do cliente para alterar.

Meu raciocínio está certo? Eu preciso criar esses loadModelPessoaFisica e loadModelPessoaJuridica? Creio que deva ter algo mais simples mas não estou sabendo fazer...

Obrigado pela ajuda! Abraços!!!
0

#4 User is offline   Anderson Scouto da Silva 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 09-May 12

Posted 24 December 2012 - 06:41 AM

Primeiro crie somente uma tabela (ex: cliente) e crie o model para ela, e no lugar de cpf coloque cpf_cnpj.

A actionCreate e actionUpdate são praticamente iguais, ex:

Action Create:
$model = new Cliente();
		if(isset($_POST['Cliente'])) {
			$model->attributes = $_POST['Cliente'];
			if($model->validate()) {
				$model->save(false);
				Yii::app()->user->setFlash('success', Yii::t('app', 'Cliente cadastrado com sucesso!'));
				$this->redirect(Yii::app()->createUrl('cliente/index'));
			}
		}
		$this->render('create', array(
				'model' => $model,
		));


Action Update:
$id = Yii::app()->getRequest()->getParam('id');
		
		$model = OsTipoServico::model()->findByPk($id);
		if(!$model)
			$this->paginaNaoEncontrada(); // esta função você vai criar no component Controller

		if(isset($_POST['Cliente'])) {
			$model->attributes = $_POST['Cliente'];
			if($model->validate()) {
				$model->save(false);
				Yii::app()->user->setFlash('success', Yii::t('app', 'Cliente atualizado com sucesso!'));
				$this->redirect(Yii::app()->createUrl('cliente/index'));
			}
		}
		$this->render('update', array(
				'model' => $model,
		));


Componente Controller:
class Controller extends CController {
...
public function paginaNaoEncontrada() {
		throw new CHttpException('404', Yii::t('app', 'Página não encontrada!'));
	}
...
}


Na view update vai ser praticamente igual a create a não ser pelo fato que alguns rótulos vão mudar se preciso, tipo Breadcrumbs, mudar senha ou o botão Cadastrar fica Atualizar e por vai...

Abraços. Qualquer dúvida estamos ai.
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