Personalizando tela de cadastro no YII com select, radio e checkbox

Estou iniciando com o framework Yii, peguei o banco de um sistema que estou fazendo e criei os models e views.

Vi que ele além de ter criado as classes criou as telas de cadastro e todo aquele ‘crud’.

Porém nas telas onde deveria vim um Select com os dados de uma outra tabela, ele apenas criou um input do tipo texto para eu escrever a ID, sendo que na verdade deveria ser criado um <select>.

Minha dúvida é como eu devo criar esses <select> com a informação de uma outra tabela.

Estou mandando junto uma imagem para ilustrar essa dúvida, onde vou fazer um cadastro e preciso selecionar uma empresa.

Terei que criar os campos do cadastro de endereço, porém na hora de cadastrar, vou cadastrar o endereço na tabela endereço, pegar sua id e por fim realizar o cadastro na tabela ‘Cadastro’.

Ola kayzen, Seja bem vindo!

Sobre sua dúvida, o Yii ele não reconhece automáticamente se o tipo da tabela e input ou select, esse tratamento de dados no formulário, tu tera que fazer manualmente, abaixo vou mostrar um modelo básico, para você popular seu <select> com os dados que você deseja:




<div class="row codprofissional">

<?php echo $form->labelEx($model, 'codprofissional'); ?>

        <?php

        $profissional = Profissional::model()->findAll(array('order' => 'nome ASC'));

        $profissional = CHtml::listData($profissional, 'codprofissional', 'nome');


        echo $form->dropDownList($model, 'codprofissional', $profissional,

                array(

                    'prompt' => 'Selecione',

                )

        );

        ?>

        <?php echo $form->error($model, 'codprofissional'); ?>

    </div>



Ai no seu caso, tu vai trocar o Profissional pela tabela Empresa, e o codprofissional, pelo idempresa!

Sobre pegar o ID de um dado inserido e simples.

No actionCreate().

Após o $model->save(), ou abaixo dele, tu consegue capturar o ID inserido ou qualquer outro dado.

Por exemplo:




public function actionCreate() {

        $model = new Paciente;

        $telefone = new Telefone;


        // Uncomment the following line if AJAX validation is needed

        $this->performAjaxValidation($model);


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


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


            if ($model->save()) {


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


                            $telefone->datacriacao = date('Y-m-d H:i:s');

                            $telefone->cod = $model->codpaciente;

                            $telefone->bd = controller();

                            $telefone->save(false);

                    

                }

              

            }

        }


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

            'model' => $model,

            'telefone' => $telefone

        ));

    }



Com esses 2 exemplos tu já consegue adiantar boa parte dos _form.php.

Como você pode ver, no $telefone->cod, peguei o último dado inserido da tabela paciente ($model->save())


$telefone->cod = $model->codpaciente;

Antes de mais nada, muito obrigado Newerton pela ajuda…fiz o que vc me falou e consegui fazer a listagem das empresas em um select… embora na verdade não era isso que eu tinha que fazer…

O que tenho que fazer é criar um formulario de cadastro de uma empresa, contendo dados da empresa, endereco e site (Dai tenho uma tabela pra endereco, empresa e site) e suas PKs devem ficar numa tabela chamada cadastro.

Tentei criar um <input text> para começar a colocar os campos de endereço, como logradouro, bairro, etc… dentro do form do cadastro e deu esse erro:

( Property “Cadastro.nme_logradouro” is not defined ) , estou mexendo dentro do arquivo ‘views/Cadastro/_form.php’




       <div class="row">

		<?php echo $form->labelEx($model,'Logradouro'); ?>

		<?php echo $form->textField($model,'nme_logradouro'); ?>

		<?php echo $form->error($model,'nme_logradouro'); ?>

	</div>



Abaixo estou mandando um print dessa tela de como ela deve funcionar, se puder me dar uma luz em como criar essa tela e fazer ela funcionar…

835

Captura_de_tela.png

Kayzen,

Esse erro ocorreu, por que na tabela Cadastro, não existe o atributo ‘nme_logradouro’.

Detalha bem o formulário, e me mostra quais <input> estão na tabela Cadastro, e quais <input> vai pra outras Tabela.

Veja esse DER, tem a tabela Cadastro em destaque… quero cadastrar os dados nela… porém o formulário vai ser igual ta na imagem que mandei no post acima.

Tai o form do meu formulario do cadastro.




<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'cadastro-form',

	'enableAjaxValidation'=>false,

)); ?>


	<p class="note">Campos com <span class="required">*</span> são obrigatórios.</p>


	<?php echo $form->errorSummary($model); ?>

        

	<div class="row">

		<?php echo $form->labelEx($model,'empresa_idempresa'); ?>

		<?php echo $form->textField($model,'empresa_idempresa'); ?>

		<?php echo $form->error($model,'empresa_idempresa'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'endereco_idendereco'); ?>

		<?php echo $form->textField($model,'endereco_idendereco'); ?>

		<?php echo $form->error($model,'endereco_idendereco'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'dat_data'); ?>

		<?php echo $form->textField($model,'dat_data',array('size'=>45,'maxlength'=>45)); ?>

		<?php echo $form->error($model,'dat_data'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'home_idhome'); ?>

		<?php echo $form->textField($model,'home_idhome'); ?>

		<?php echo $form->error($model,'home_idhome'); ?>

	</div>


	<div class="row buttons">

		<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->



836

tabela.png

Existe uma forma melhor de eu fazer esse cadastro?

Kayzen,

Esse ‘empresa_idempresa’,‘endereco_idendereco’,‘home_idhome’, serão todo <select>?

E o seguinte, vou explicar meio por cima!

Observa no seu crud, o CadastroController -> actionCreate(), que foi estanciado um novo objeto [$model = new Cadastro;], e no final dessa função, tem a renderização dele [$this->render(‘create’)], porém no arquivo create.php não está o formulário, no create.php ele ainda renderiza o _form, com ‘renderPartial’, e dizendo que o ‘model’ => $model, bom até ae tudo bem.

O que acontece no momento, é que seu _form.php, só está lendo o Model [Cadastro], caso queira por exemplo colocar o Endereco, para o usuário digitar, para aquela empresa vai ter que fazer mais ou menos assim:




public function actionCreate() {

        $model = new Empresa;

		$endereco = new Endereco;

		$site = new Site;


		// Validação do formulário

		$this->performAjaxValidation($model);


		// Verifica se os dados

        if (isset($_POST['Empresa']) && isset($_POST['Endereco']) && isset($_POST['Site'])) {


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

			$endereco->attributes = $_POST['Endereco'];

			$site->attributes = $_POST['Site'];


			// Validando totalmente os 3 Model [Empresa, Endereco, Site]

            if($model->validate() && $endereco->validate() && $site->validate()){


			

				// Salvando os dados na suas respectiva tabela

				// Empresa

				$model->save();

				// Endereço

				$endereco->save();

				// Site

				$site->save();

                

				// Salvando os dados na tabela Cadastro

				$cadastro = new Cadastro;

				$cadastro->empresa_idempresa = $model->idempresa;

				$cadastro->endereco_idendereco = $endereco->idendereco;

				$cadastro->site_idsite = $site->idsite;

				$cadastro->save(false);

            }

        }


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

            'model' => $model,

            'endereco' => $endereco,

			'site' => $site

        ));

    }



O raciocínio e mais ou menos isso, agora no view/empresa/create.php tu tem que fazer mais ou menos assim:




echo $this->renderPartial('_form', array('model'=>$model, 'endereco'=>$endereco, 'site'=>$site));



Ai no form, o que for da tabela Empresa, tu usa o $model, se for da tabela Endereço tu usa o $endereco, olha o exemplo:




<div class="row">

                <?php echo $form->labelEx($model,'nme_fantasia'); ?>

                <?php echo $form->textField($model,'nme_fantasia'); ?>

                <?php echo $form->error($model,'nme_fantasia'); ?>

        </div>

<div class="row">

                <?php echo $form->labelEx($endereco,'nme_logradouro'); ?>

                <?php echo $form->textField($endereco,'nme_logradouro'); ?>

                <?php echo $form->error($endereco,'nme_logradouro'); ?>

        </div>

<div class="row">

                <?php echo $form->labelEx($site,'nme_site'); ?>

                <?php echo $form->textField($site,'nme_site'); ?>

                <?php echo $form->error($site,'nme_site'); ?>

        </div>



Olha que cada um esta chamando o atributo da sua tabela.

Não posso fazer tudo pra você, mais com isso tu pode ter uma noção de como começar!

Observando, que tudo isso tu tem que fazer no formulário da empresa, tu so vai usar o Model Cadastro, para inserir os dados da Empresa, Endereco e Site, então tudo isso que expliquei é:

controllers/EmpresaController.php

views/empresa/_form.php

views/empresa/create.php

Espero ter ajudado, se tiver algum erro me desculpe!

Que nada já deu pra ter uma boa idéia… ;D

Esse ‘empresa_idempresa’,‘endereco_idendereco’,‘home_idhome’, serão todos <input>, igual a imagem do sistema que to fazendo lá em cima…

Agora os campos da empresa, endereço e home, não teria que ser montado na views/cadastro/_form.php não?

Por que até então, a idéia principal, é montar um formulário pro cliente preencher todos os dados numa mesma tela e em seguida clicar em cadastrar…

No final da tarde vou tentar fazer isso funcionar ou pelo menos no minimo montar a tela de cadastro…

Certamente minha próxima dúvida é fazer o cadastro funcionar… mas como se diz… vamos por parte… primeiro montar a tela… depois fazer funcionar… certamente eu devo criar um novo tópico pra não deixar esse aqui muito extenso… e pra finalizar esse, vou expor o código criado… e um print da tela.

Kayzen,

Pode montar sim no views/cadastro/_forms.php, o que expliquei caso fosse usar o formulário pra cadastro só da empresa, mais ai fica ao seu critério.

Vamos continuando nesse tópico mesmo, o assunto ainda não fugiu do titulo! hehe

Newerton,

Estamos aqui denovo… :rolleyes:

Bom, fiz o que você me falou e consegui montar a tela de cadastro e como sempre lá vem as dúvidas.

1º No <labelEx> vai o nome do campo a ser preenchido, como padrão o YII pega o que tá no banco de dados,

porém no meu caso, não pode ser o que está no banco, por causa dos prefixos que uso como referência do tipo de atributo.

Personalizei o nome do campo, e ele deixou de fazer a validação do mesmo. :( Como resolver esse problema?

2º Como faço pra esse cadastro funcionar? Porque clico em ‘Create’ (cadastrar) e não acontece nada…

3º O campo ‘Data Cadastro’ é a data atual do servidor tem como eu deixar esse campo como hidden e colocar as horas como value nele?

Abaixo segue os códigos criados:

:: CadastroController.php





	/**

	 * Creates a new model.

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

	 */

        

	public function actionCreate()

	{

		$model      = new Cadastro();

                $empresa    = new Empresa();

                $endereco   = new Endereco();

                $home       = new Home();


		// Descomente a seguinte linha se a validação AJAX é necessário

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


		if(isset($_POST['Cadastro']) && isset($_POST['Empresa']) && isset($_POST['Endereco']) && isset($_POST['Home']))

		{

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

                    $empresa->attributes    = $_POST['Empresa'];

                    $endereco->attributes   = $_POST['Endereco'];

                    $home->attributes       = $_POST['Home'];


                    /*

                     * Validando os 4 models

                     */


                    if($model->validate() && $empresa->validate() && $endereco->validate() && $home->validate()){


                        if($model->save() && $empresa->save() && $endereco->save() && $home->save()){

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

                        }


                    }


		}


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

			'model'     => $model,

                        'empresa'   => $empresa,

                        'endereco'  => $endereco,

                        'home'      => $home

		));

	}



::create.php




<?php

    $this->breadcrumbs=array(

            'Cadastros'=>array('index'),

            'Create',

    );


    $this->menu=array(

            array('label'=>'List Cadastro', 'url'=>array('index')),

            array('label'=>'Manage Cadastro', 'url'=>array('admin')),

    );

?>


<h1>Criando cadastro</h1>


<?php 

    echo $this->renderPartial('_form', array('model'=>$model, 'empresa'=>$empresa, 'endereco'=>$endereco, 'home'=>$home));

?>



:: _form.php




<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'cadastro-form',

	'enableAjaxValidation'=>false,

)); ?>


	<p class="note">Campos com <span class="required">*</span> são obrigatórios.</p>


	<?= $form->errorSummary($model); ?>

        

        <!-- Dados da tabela empresa -->


        <div class="row">

            <?= $form->labelEx($empresa,    'Nome fantasia');?>

            <?= $form->textField($empresa,  'nme_fantasia', array('size'=>45,'maxlength'=>45));?>

            <?= $form->error($empresa,      'nme_fantasia');?>

        </div>


        <div class="row">

            <?= $form->labelEx($empresa,    'Razão social');?>

            <?= $form->textField($empresa,  'nme_razao_social', array('size'=>45,'maxlength'=>45));?>

            <?= $form->error($empresa,      'nme_razao_social');?>

        </div>


        <div class="row">

            <?= $form->labelEx($empresa,    'CNPJ');?>

            <?= $form->textField($empresa,  'doc_cnpj', array('size'=>15,'maxlength'=>15));?>

            <?= $form->error($empresa,      'doc_cnpj');?>

        </div>


        <div class="row">

            <?= $form->labelEx($empresa,    'Inscrição estadual');?>

            <?= $form->textField($empresa,  'doc_insc_estadual', array('size'=>15,'maxlength'=>15));?>

            <?= $form->error($empresa,      'doc_insc_estadual');?>

        </div>


        <div class="row">

            <?= $form->labelEx($empresa,    'Data fundação');?>

            <?= $form->textField($empresa,  'dat_data_fundacao', array('size'=>10,'maxlength'=>10));?>

            <?= $form->error($empresa,      'dat_data_fundacao');?>

        </div>


        <!-- Dados da tabela endereco -->


	<div class="row">

            <?= $form->labelEx($endereco,   'Logradouro'); ?>

            <?= $form->textField($endereco, 'nme_logradouro', array('size'=>45,'maxlength'=>45)); ?>

            <?= $form->error($endereco,     'nme_logradouro'); ?>

	</div>


	<div class="row">

            <?= $form->labelEx($endereco,   'Número'); ?>

            <?= $form->textField($endereco, 'num_numero', array('size'=>5,'maxlength'=>5)); ?>

            <?= $form->error($endereco,     'num_numero'); ?>

	</div>


	<div class="row">

            <?= $form->labelEx($endereco,   'Complemento'); ?>

            <?= $form->textField($endereco, 'nme_complemento', array('size'=>45,'maxlength'=>45)); ?>

            <?= $form->error($endereco,     'nme_complemento'); ?>

	</div>


	<div class="row">

            <?= $form->labelEx($endereco,   'Bairro'); ?>

            <?= $form->textField($endereco, 'nme_bairro', array('size'=>45,'maxlength'=>45)); ?>

            <?= $form->error($endereco,     'nme_cidade'); ?>

	</div>


	<div class="row">

            <?= $form->labelEx($endereco,   'Estado'); ?>

            <?= $form->textField($endereco, 'sgl_uf', array('size'=>2,'maxlength'=>2, 'value'=>'MG')); ?>

            <?= $form->error($endereco,     'sgl_uf'); ?>

	</div>


	<div class="row">

            <?= $form->labelEx($endereco,   'CEP'); ?>

            <?= $form->textField($endereco, 'nme_cep', array('size'=>15,'maxlength'=>15)); ?>

            <?= $form->error($endereco,     'nme_cep'); ?>

	</div>


        <!-- Dados da tabela cadastro -->


	<div class="row">

            <?= $form->labelEx($model,      'Data cadastro'); ?>

            <?= $form->textField($model,    'dat_data', array('size'=>10,'maxlength'=>10)); ?>

            <?= $form->error($model,        'dat_data'); ?>

	</div>




         <!-- Dados da tabela Home page -->




	<div class="row">

            <?= $form->labelEx($home,      'Site'); ?>

            <?= $form->textField($home,    'nme_site', array('size'=>45,'maxlength'=>45)); ?>

            <?= $form->error($home,        'nme_site'); ?>

	</div>


	<div class="row buttons">

            <?= CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->



E mais ou menos isso, ta quase no caminho!

Vamos depurar por parte!

1º Habilita o validação em Ajax do Formulário.

ControllerCadastro.php, descomenta essa linha.


$this->performAjaxValidation($model);

views/cadastro/index.php, alterere para true


'enableAjaxValidation'=>true,

Agora no formulário e o seguinte, tu tem que manter o mesmo nome do atributo do banco de dados,

só que ae tem 2 macetes para você mudar o nome:

model/Empresa.php




public function attributeLabels() {

        return array(

            'nme_fantasia' => 'Nome Fantasia',

            'nme_razao_social' => htmlentities('Razão Social'),

...

        );

    }



Observa que eu coloquei o htmlentities(), para pode funcionar os acentos e cedilhas(ç).

Nos attributeLabels() que você define os nomes para cada atributo, por padrão eles vem o que está no banco de dados.

Agora no formulário tu mantem os atributos:




<div class="row">

            <?= $form->labelEx($empresa,    'nme_fantasia');?>

            <?= $form->textField($empresa,  'nme_fantasia', array('size'=>45,'maxlength'=>45));?>

            <?= $form->error($empresa,      'nme_fantasia');?>

        </div>



Usa o Firebug, para debugar se está validando!

Vai testando ae!

Obs.: Para usar o data atual, não precisa do <input hidden>, dentro do actionCreate(), faz assim $_POST[‘Cadastro’][‘dat_data’] = date(‘Y-m-d H:i:s’);

Muda de VARCHAR(45) para DATETIME.

Olá… :rolleyes:

Bom, consegui mudar o nome dos campos dentro dos model como descrito acima,

criei a variável dentro CadastroController para receber a data atual, até ai tudo está indo conforme foi passado…

Dentro de views/cadastro/index.php, vc pediu pra alterar para true


'enableAjaxValidation'=>true,

Porém no meu index não tem esse trecho pra ser alterado, veja:


<?php

$this->breadcrumbs=array(

	'Cadastros',

);


$this->menu=array(

	array('label'   =>'Create Cadastro', 'url'=>array('create')),

	array('label'   =>'Manage Cadastro', 'url'=>array('admin')),

);

?>


<h1>Cadastros</h1>


<?php $this->widget('zii.widgets.CListView', array(

	'dataProvider'  =>$dataProvider,

	'itemView'      =>'_view',

)); ?>

Dai o formulário está validando os campos da tabela cadastro, mas os demais campos da empresa, endereco, home não estão sendo validados

Dentro do actionCreate do CadastroController eu tentei fazer essa alteração pra ver se as demais validação iria funcionar, mas não deu certo.




		// Descomente a seguinte linha se a validação AJAX é necessário

		$this->performAjaxValidation($model);

                $this->performAjaxValidation($empresa); // Criado por mim

                $this->performAjaxValidation($endereco); // Criado por mim

                $this->performAjaxValidation($home); // Criado por mim



O enableAjaxValidation’=>true, e no views/cadastro/_form.php.

Para validar os demais campos, usa $this->performAjaxValidation(array($model, $empresa, $endereco, $home));

Eu fiz o que passou, porém a validação ainda continua apenas sobre os dados ta tabela cadastro, mas todos os demais campos estão marcados com ‘*’.

A mensagem da validação:

Please fix the following input errors:

* Empresa Idempresa cannot be blank.


* Endereco Idendereco cannot be blank.


* Home Idhome cannot be blank.

CadastroController.php




	public function actionCreate()

	{

		$model      = new Cadastro();

                $empresa    = new Empresa();

                $endereco   = new Endereco();

                $home       = new Home();

                $_POST['Cadastro']['dat_data'] = date('Y-m-d H:i:s');


		// Descomente a seguinte linha se a validacao for ajax for solicitada

                $this->performAjaxValidation(array($model, $empresa, $endereco, $home));


		if(isset($_POST['Cadastro']) && isset($_POST['Empresa']) && isset($_POST['Endereco']) && isset($_POST['Home']))

		{

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

                    $empresa->attributes    = $_POST['Empresa'];

                    $endereco->attributes   = $_POST['Endereco'];

                    $home->attributes       = $_POST['Home'];


                    /*

                     * Validando os 4 models

                     */


                    if($model->validate() && $empresa->validate() && $endereco->validate() && $home->validate()){


                        if($model->save() && $empresa->save() && $endereco->save() && $home->save()){

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

                        }


                    }


		}


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

			'model'     => $model,

                        'empresa'   => $empresa,

                        'endereco'  => $endereco,

                        'home'      => $home

		));

	}



Sobre esse “‘enableAjaxValidation’=>true”, é uma validação inline, ele valida na hora que tiver preenchendo o formulário, se por acaso tu coloco o nme_empresa como ‘required’ no Model/Empresa.php, ele será validado.

Sobre esses erros é o seguinte, esses ID não pode ser vazio, por que esse campos não é autoincremento no banco de dados, mesmo se você tirar esse do ‘required’, do Model ele vai dar erro no banco.

Tu 2 situações para solucionar:

  1. Coloca o idempresa, idendereco, idhome como auto-increment no banco de dados.

  2. Ou buscar o valor max() dessa tabela, e acrescentar +1, fazer de forma manual.

Ai vai do seu critério.

A validação de forma manual a medida que se vai preenchendo o formulário, está funcionando… :P

Parece que ele não valida na hora que se submit o formulário…

Agora sobre o campo idempresa, idenderedo e idhome eu não posso usar max() por que na verdade o que tenho que passar são as IDs, se na hora que eu obtiver o número da próxima ID a ser gerada e uma outra pessoa no mesmo instante fizer um cadastro em outro pc, ambos preenchendo o mesmo formulário ao mesmo tempo, mas com dados diferentes, vai dar erro, considerando que nas cardinalidades possa apenas ter uma empresa, um home(site), um endereço únicos pra cada cadastro…

E também tem a possibilidades das ids estarem quebradas, tipo… IDs existentes no banco(1,2,5,10,22,23,24,25,26,30) se eu desse o max() ele retornaria 10 dai eu acrescentaria mais +1 = (10+1) = 11, 11 seria o próximo registro, sendo que na verdade, se ninguém fizer um cadastro antes de mim, ele vai ser 31.

Auto-increment no banco também não daria certo, por que ele vai estar sempre visando que os dados no banco nunca vai ser deletado e que a próxima id gerada em relação a que ele possui sempre ser +1, mas esquecemos que nem todos os dados nas tabelas empresa, endereco e home, vai ser utilizadas pela tabela cadastro…

Sem usar framework, na verdade nem uso framework ainda :P

Faria o seguinte código na hora de fazer a inserção no banco de dados, exemplo:




 require_once 'Classe/autoLoad.php';


/*

 * Cadastrando os dados do endereco e recuperando a id gerada

 */


 $objEndereco                    = new ControleEndereco();

 $objEndereco                    = $objEndereco->inserir($_POST);


 $objBanco                       = new ControleBanco();

 $objBanco                       = $objBanco->buscarId();

 $_POST['idendereco']            = $objBanco->__get('idregistro');

 $_POST['endereco_idendereco']   = $objBanco->__get('idregistro');


/*

 * Cadastrando os dados da empresa e recuperando a id gerada

 */


 $objEmpresa                     = new ControleEmpresa();

 $objEmpresa                     = $objEmpresa->inserir($_POST);


 $objBanco                       = new ControleBanco();

 $objBanco                       = $objBanco->buscarId();

 $_POST['idempresa']             = $objBanco->__get('idregistro');

 $_POST['empresa_idempresa']     = $objBanco->__get('idregistro');

        

/*

 * Cadastrando o site e recuperando a id gerada

 */


 $objHome                        = new ControleHome();

 $objHome                        = $objHome->inserir($_POST);


 $objBanco                       = new ControleBanco();

 $objBanco                       = $objBanco->buscarId();

 $_POST['idhome']                = $objBanco->__get('idregistro');

 $_POST['home_idhome']           = $objBanco->__get('idregistro');

        

/*

 * Cadastrando os dados da tabela cadastro com as ids geradas acima 

 * e outros dados vindo do formulário

 */


 $objCadastro                     = new ControleCadastro();

 $retorno                         = $objCadastro->inserir($_POST);


 if($retorno == true){ 


    echo 'CADASTRADO COM SUCESSO';


 }else{


     echo 'ERRO AO CADASTRAR';


     /*

      * Se ouve algum erro ao finalizar o cadastro eu excluo todos os registros feitos até o momento

      */


     $objEndereco                 = new ControleEndereco();

     $objEndereco                 = $objEndereco->excluir($_POST);


     $objEmpresa                  = new ControleEmpresa();

     $objEmpresa                  = $objEmpresa->excluir($_POST);


     $objHome                     = new ControleHome();

     $objHome                     = $objHome->excluir($_POST);


 }        






max vai ser igual a 30, count = 10 :) (Foi só pra ser chato mesmo, hehe)

Com o max vc tem esse problema mesmo … parece um problema pequeno, mas já tive ese caso em várias apps que eu fiz. Mesmo se vc itvesse incluindo por SQL direto com o campo id=max() da sua tabela, isso tem chance de acontecer pq o max não garante.

Vc pode usar da mesma forma que vc mostrou.

No caso de usar autoincrement, vc pode cadastrar e recuperar com http://www.yiiframew…on#lastInsertID, usando assim:


 $model->save(); 

Yii::app()->db->lastInsertID

:blink:

Olha, bom… eu ainda não sei fazer absolutamente nada no framework a não ser o que o Newerton me passou até agora com estes posts…então até agora tudo que consegui fazer foi montar uma tela de cadastro pra atender minhas necessidades e agora… porém a validação não deixa o formulário ser submetido por causa das fks da tabela cadastro… essa é uma situação que vou ter que enfrentar toda hora, por mais simples que seja minha DER, vou ter sempre uma tabela que fará ligação de outras várias tabelas…

O que pega é montar a tela de cadastro e fazer isso funcionar, pois essa tela carrega dados de cadastro de outras tabelas…

Com tudo isso, o auto-increment não resolve… eu teria que fazer exatamente igual postei o código de exemplo de uma programação em MVC… cadastrar os elementos das tabelas empresa, endereço e home(site), pegar suas ids… depois ir na tabela cadastro, cadastar essas id + data (data de cadastro (datetime)).

Mas antes de chegar ao ponto de cadastrar… o form não consegue ser submetido, por essas fks da tabela cadastro, estarem sendo validadas e não poderem ser passadas em branco… :( Eu não faço a minima idéia do que fazer…

Kayzen,

Me passa a ordem de cadastro, que vou montar como que deve ser feito, só que como você não usa ‘autoincremento’, como vai estipular as ID para empresa, endereco e site?

As ids para empresa, endereco e site dentro de suas respectivas tabelas são auto incremento.

Acho que fiz confusão com esse auto incremento… rsrsr

Bom a ordem do cadastro é o seguinte:

1º Cadastro os dados do:

  • empresa dentro da tabela empresa

  • endereço dentro da tabela endereço

  • site dentro da tabela home

2º Cadastro dentro da tabela Cadastro os dados:

  • data do cadastro

  • idempresa

  • idendereco

  • idhome

FIM…

Kayzen,

Seguindo essa ordem vou dar um exemplo de como tem que fazer!

Primeiramente verifica nos Models de cada item, Empresa, Endereco e Home.




public function rules() {

        return array(

            array('id', 'required'),

    }



Onde esta esse ‘id’, verifica se nesse array tem o idempresa, idendereco e idhome, e retira ele desse array(‘required’).

Por que isso? Por que todos esses campos vão ser validado na hora de inserir no banco de dados, você removendo, ele não será validado, no $var->validate()

Agora no CadastroController faz mais ou menos isso.




if(isset($_POST['Cadastro']) && isset($_POST['Empresa']) && isset($_POST['Endereco']) && isset($_POST['Home']))

                {

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

                    $empresa->attributes    = $_POST['Empresa'];

                    $endereco->attributes   = $_POST['Endereco'];

                    $home->attributes       = $_POST['Home'];


                    /*

                     * Validando os 4 models

                     */

                    if($model->validate() && $empresa->validate() && $endereco->validate() && $home->validate()){


			/*

			 * Salvar o Cadastro.

			*/

                        if($empresa->save()){

						

				/* Depois que foi salvo ele vai cair dentro dessa condição */

				/* Agora vamos salvar nos outros banco de dados */

				$idempresa = $model->idempresa;

								

				$endereco = new Endereco;

				$endereco->nmo_endereco = $_POST['Empresa']['nmo_endereco'];

				...

				$endereco->save(false);

				$idendereco = $endereco->idendereco;

								

				$home = new Home;

				$home->nmo_home = $_POST['Home']['nmo_home'];

				...

				$home->save(false);

				$idhome = $home->idhome;

								

				$cadastro = new Cadastro;

				$cadastro->data_cadastro = date('Y-m-d');

				$cadastro->idempresa = $idempresa;

				$cadastro->idendereco = $idendereco;

				$cadastro->idhome = $idhome;

				$cadastro->save(false);

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

                        }


                    }


                }



Esse modo é so para você ter uma base de como tem que seguir as inserções, as vezes o Daniel ou outros tem um modo mais reduzido.