Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

athila

[Resolvido] salvar dados em tabelas relacionadas com Cake

Recommended Posts

Pessoal, estou querendo fazer uma coisa simples, não creio que seja complexo, mas até agora não consegui fazer.

 

Tenho duas tabelas no meu banco de dados que são as seguintes:

 

CREATE TABLE `mercearia`.`tipoprodutos` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`descricao` varchar(30) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

 

 

CREATE TABLE `mercearia`.`produtos` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`descricao` varchar(30) DEFAULT NULL,

`unidade` varchar(2) DEFAULT NULL,

`preco` float DEFAULT NULL,

`tipoproduto_id` int(11) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `id_tipoprodutos` (`tipoproduto_id`) USING BTREE,

CONSTRAINT `produtos_ibfk_1` FOREIGN KEY (`tipoproduto_id`) REFERENCES `tipoprodutos` (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

 

Como podem perceber, as tabelas estão relacionadas. A tabela produtos tem uma chave estrangeira para a tabela tipoprodutos. Os models são os seguintes:

 

 

<?php

class Produto extends AppModel {

public $name = 'Produto';

var $belongsTo = 'Tipoproduto';

 

 

public $validate = array(

'title' => array(

'rule' => 'notEmpty'

),

'body' => array(

'rule' => 'notEmpty'

)

);

}

 

 

<?php

class Tipoproduto extends AppModel {

public $name = 'Tipoproduto';

 

var $hasMany = 'Produto';

 

public $validate = array(

'title' => array(

'rule' => 'notEmpty'

),

'body' => array(

'rule' => 'notEmpty'

)

);

 

}

 

Como podem ver, relacionei os models. O Model Produto possui uma variável $belongsTo para TipoProduto. E TipoProduto possui uma variável $hasMany para Produto.

 

Eu queria então saber como faço para, ao Incluir um produto, poder escolher numa combobox qual o tipo do produto (isto virá do Model TipoProduto). No meu ProdutosController, tenho a seguinte função incluir()

 

---------------------------------------xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx----------------------------------

 

function incluir() {

 

$this->loadmodel('Tipoproduto');

$tipodeprodutos = $this->Tipoproduto->find('all');

$this->set('tipoprodutos',$tipodeprodutos);

 

if ($this->request->is('post')) { //neste ponto há o teste se a requisição é feita via método POST (escondida) ou GET (pela url)

if ($this->Produto->save($this->request->data)) { //neste ponto os dados obtidos por uma requisição (request) são salvos em banco de dados

$this->Session->setFlash('O produto foi salvo com sucesso.');

$this->redirect(array('action' => 'index'));

} else {

$this->Session->setFlash('Não foi possível fazer a gravação.');

}

}

}

----------------------------------------------xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx--------------------------------------

 

Notem que estou enviando os dados sobre os tipos dos produtos para a view incluir, através das 3 primeiras linhas da função, mas não sei como faço para preencher uma combobox com os ids e fazer o id escolhido ser gravado no banco de dados.

 

Obrigado,

 

Áthila

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo,

seu controller ficará assim:

/*
* Inclui novo produto 
* @public
* @params POST data
* @return void
*/
public function incluir()
{
  if($this->request->is('post'))
  {
     if($this->Produto->save($this->request->data))
       {
        $this->Session->setFlash('Produto criado com sucesso');
        $this->redirect('/produtos');
       }else{
        $this->Session->setFlash('Ocorreu um problema, verifique os campos e tente novamente');
       }
  }

 #Listagem de tipos que vai para o select
 $this->set('tipos',$this->Tipo->find('list'));

}

 

O tipo de busca (LIST) retorna um array com Tipoproduto.id o valor e Tipoproduto.descricao como rotulo.

 

No model Tipoproduto é necessário adicionar a seguinte variavel;

public $displayField = 'descricao';

 

Na view add o seguinte campo

$this->Form->input('tipoproduto_id',array('type'=>'select','options'=>$tipos,'label'=>'Tipo'));

 

Espero que seja isso e que eu tenha lhe ajudado.

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu amigo, muito obrigado. Funcionou. Agora, você saberia me dizer como mostrar os dados dos produtos e mostrar a descrição do tipo de produto associado a cada produto?

 

Desde já lhe agradeço.

 

Áthila

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo,

lhe aconselho a ler o Cook Book do Cakephp.

Já sua pergunta: Leia sobre o Containable behavior que lhe ajudará.

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.