Ajuda Com Active Record Relacional

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.

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

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.