athila 0 Denunciar post Postado Março 27, 2012 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
Eduiagami 1 Denunciar post Postado Março 30, 2012 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
athila 0 Denunciar post Postado Abril 10, 2012 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
Eduiagami 1 Denunciar post Postado Abril 19, 2012 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