Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Não consigo salvar dados no banco

Boa noite,

Segui todos os passos explicados em aula, contudo quando clico no botão 'salvar' (onde a action do formulário aponta para a função do controller correspondente) não faz nada. A página atualiza, mas permanece com os dados em tela.

Seguem códigos abaixo:

  1. Controller:
<?php
    namespace App\Controller;

    /* Importando as funções existentes para persistência de BD, ORM do CakePHP. */
    use Cake\ORM\TableRegistry;

    class ProdutosController extends AppController {
        public function index() {
            $produtosTable = TableRegistry::get('Produtos');
            $produtos = $produtosTable->find('all');
            $this->set('produtos', $produtos);
        }

        public function novo() {
            $produtosTable = TableRegistry::get('Produtos');

            $produto = $produtosTable->newEntity();
            $this->set('produto', $produto);
        }

        public function salva() {
            $produtosTable = TableRegistry::get('Produtos');

            $produto = $produtosTable->newEntity($this->request->data());

            if($produtosTable->save($produto)) {
                $msg = "Produto salvo com sucesso.";
            }
            else {
                $msg = "Erro ao salvar o produto.";
            }       

            $this->set('msg', $msg);
        }
    }
?>

Formulário (Novo):

<?php

echo $this->Form->create([$produto, 'action' => 'salva']); echo $this->Form->input('id'); echo $this->Form->input('nome'); echo $this->Form->input('preco'); echo $this->Form->input('descricao'); echo $this->Form->button('Salvar'); echo $this->Form->end(); ?>

Página (Salva):


 <h1><?= $msg ?></h1>

 <?php
    echo $this->Html->Link('Voltar para a lista', ['controller' => 'produtos', 'action' => 'index']);
 ?>

Obs.: estou utilizando a versão do CakePHP 3.4.... está igualzinho o contexto da aula (espero não ter faltado em algo).

Quem puder me ajudar, agraço.

Abs.

6 respostas

Apenas reenviando o código mais estruturado do formulário (Novo):

Formulário (Novo):
<?php
echo $this->Form->create([$produto, 'action' => 'salva']); echo $this->Form->input('id'); echo $this->Form->input('nome'); echo $this->Form->input('preco'); echo $this->Form->input('descricao'); echo $this->Form->button('Salvar'); echo $this->Form->end(); ?>

Observação: acredito que não esteja capturando os dados com o $this->request->data();, ou caso esteja, a página apenas atualiza e nada acontece (como se não fosse na página 'salva').

Em outros fóruns, observei também que outros desenvolvedores usam N formas de atribuir os parâmetros na criação do formulário com CakePHP, como termos 'url', e mais informações entre "[ ]" do create do formulário.

De qualquer forma aguardo um retorno, pois achei muito prático o framework e gostaria de sair desse contexto para continuidade no curso.

Abs.

Alguém conseguiria me ajudar!? Estou precisando muito continuar o uso dessa ferramenta hehe.

Corrigindo, estou usando a versão 3.6

Seguem fontes + erro:

ProdutosController:

<?php
    namespace App\Controller;

    use Cake\ORM\TableRegistry;

    class ProdutosController extends AppController {
        public function index() {

            $produtosTable = TableRegistry::get('Produtos');
            $produtos = $produtosTable->find('all');
            $this->set('produtos', $produtos);

        }

        public function novo() {
            $produtosTable = TableRegistry::get('Produtos');

            /* Criando uma Entidade Vazia de ProdutoTable (BD) */
            $produto = $produtosTable->newEntity();
            $this->set('produto', $produto);
        }

        public function salva() {
            $produtosTable = TableRegistry::get('Produtos');
            $produto = $produtosTable­->newEntity($this->request->data());

            if($produtosTable->insert($produto)) {
                $msg = "Produto salvo com sucesso.";
            }
            else {
                $msg = "Erro ao salvar o produto.";
            }    

            $this->set('msg', $msg);
        }
    }
?>

Formulário:

<?php
    /* Utilizando Helpers para criação de formulários */

    echo $this->Form->create($produto, ['action' => 'salva']);
    echo $this->Form->input('nome');
    echo $this->Form->input('preco');
    echo $this->Form->input('descricao');  
    echo $this->Form->button('Salvar');
    echo $this->Form->end();
?>

Formulário para salvar:

<h1><?= $msg; ?></h1>

<?= $this->Html->Link('Voltar para a lista', ['controller' => 'produtos', 'action' => 'index']); ?>

ERRO:

Call to a member function newEntity() on null
solução!

Resolvido, atualizado o Composer.