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