cakePHP - HABTM e Checkbox

52 views
Skip to first unread message

Wagner Franze Junior

unread,
Nov 17, 2009, 9:29:55 PM11/17/09
to cake-...@googlegroups.com, franz...@gmail.com
Boa noite pessoal...

Estou com um probleminha chato no momento de salvar dados HABTM utilizando uma lista de checkbox. Tenho uma pagina onde existe um campo do tipo text para o usuário colocar o nome de um livro e abaixo uma lista de categorias que podem ser escolhidas pelo usuário para serem associadas a esse novo livro que esta sendo cadastrado. Essa lista de categorias é dinâmica e hoje possui três registros que são exibidos como checkbox. O problema acontece quando seleciono uma ou duas e uma fica sem selecionar. Para cada checkbox gerado na tela, é gerado também um outro campo do tipo input hidden com value igual a 0, quando clico no botão salvar, ele também gera um insert para esse checkbox que não foi selecionado atribuindo para o id da categoria na cláusula insert o valor 0 valor ( zero ) que é o valor default desse campo hidden que o acompanha, os demais são salvos normalmente.

Um exemplo da utilização do checkbox :

E esses são os erros que ele apresenta na tela
Warning (512): SQL Error: 1452: Cannot add or update a child row: a foreign key constraint fails (`cakestudo`.`categorias_livros`, CONSTRAINT `fk_categorias_llivros_categorias1` FOREIGN KEY (`categoria_id`) REFERENCES `categorias` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) [CORE\cake\libs\model\datasources\dbo_source.php, line 525]

Query: INSERT INTO `categorias_livros` (`categoria_id`, `livro_id`) VALUES (0, 34)

Array ( [Livro] => Array ( [nome] => ddd ) [Categoria] => Array ( [0] => Array ( [categoria_id] => 1 ) [1] => Array ( [categoria_id] => 2 ) [2] => Array ( [categoria_id] => 0 ) ) )


Repare que no array de dados para serem salvos no último [2] => Array ( [categoria_id] => 0 )  ele trás o valor 0 ...


Queria saber se é possível tratar isso no controller antes de ele efetuar o saveAll 


Meu controller hoje se encontra da seguinte forma para a action add.

   function add(){
    // Gera lista de categorias para criação dos checkbox
     $this->set('Categorias', $this->Categoria->find('all', array('fields' => array( 'Categoria.id' , 'Categoria.nome' ))));

  if( $this->Livro->saveAll( $this->data )){
           
    // print_r( $this->data );
  }
    }

Obrigado 

 

Marcio Trindade

unread,
Nov 22, 2009, 11:10:25 PM11/22/09
to cake-...@googlegroups.com
Wagner,

Tente utilizar padrões do cake.

Um pequeno exemplo.

function add(){
// Gera lista de categorias para criação dos checkbox
$this->set('Categorias', $this->Categoria->find('list', array('fields' => array( 'id' , 'nome' ))));

if (isSet($this->data))
{
if( $this->Livro->saveAll( $this->data)){
debug ($this->data);
}else{
$this->Session->setFlash('Error!');
}
}
}


Marcio Trindade
http://marciotrindade.com


2009/11/18 Wagner Franze Junior <franz...@gmail.com>
Reply all
Reply to author
Forward
0 new messages