sexta-feira, 10 de junho de 2011

Formule alguma coisa : Criando formulários em Zend Framework parte 3 :: Salvando dados enviados dos formulários

Agora, após termos criado o formulário ( parte 1 ) e criado os métodos de envio dos dados ( parte 2 ), vamos slavá-los num banco de dados.

Para inserir dados de seu formulario no banco de dados, usamos os models.

Abre um terminal e crie o model

$ zf create model meumodel

Abra o arquivo 'models/Meumodel.php' e veja que dentro está assim, vaziozão:

class Model_Meumodel extends Zend_Db_Table {
 
}

Esse vai ser a classe com que você irá trabalhar os dados do banco de dados com o controller e vice-versa.
Em específico ao nosso caso, vai ser o responsável por salvar os dados do formulário no banco de dados.
Primeiro, setamos a tabela do banco de dados que será trabalhada, acrescentando uma variável protegida no model

class Model_Meumodel extends Zend_Db_Table {

    protected $_name = 'minhatabela';

}

e agora, o campo da tabela que trabalha como seu índice

class Model_Meumodel extends Zend_Db_Table {

    protected $_name = 'minhatabela';
    protected $_primary = 'id';

}

Colocamos o campo 'id' como mera ilustração, pode ser qualquer outro campo, e no caso de você ter esquecido de declarar o campo índice, o Zend toma por padrão o primeiro campo chamado 'id' que porventura tenha na tabela. No caso de não haver um campo 'id' e você não ter declarado o campo índice, não sei o que acontece, por isso, é bem melhor declarar mesmo explicitamente o 'id' pra não correr riscos.
Agora, criemos no model a função que irá cadastrar o usuário

class Model_Meumodel extends Zend_Db_Table {

    protected $_name = 'minhatabela';
    protected $_primary = 'id';

    /*
     * Função que insere dados na tabela
     */
    public function insereDados($data){

        // Insere os dados do array '$data' no banco de dados.
        // Caso não seja possível inserir no banco de dados retorna falso.
        try{ $this->insert($data); return true; }
        catch( Zend_Db_Exception $e){ return false; }

    }

}

'$this->insert()' é o método da classe Zend_Db_Table que faz o trabalho sujo.
Agora, voltando ao nosso controller do formulario da parte 2 de nosso tutorial, lembremos que deixei uma parte escrito '<codigo surpresa>'

// Caso os dados sejam válidos.
if( $form->isValid($data) ){

    <codigo surpresa> <- olha a parte do código surpresa aqui

}
Pois bem, nessa parte, que fica logo depois de termos recebido os dados e depois deles term sido devidamente validados, é onde colocamos o resto do codigo
// Cria o objeto do model.
$objeto_model = new Model_Meumodel();
    
// Tenta inserir os dados no db.
// Caso dê certo, é impresso uma mensagem na view.
if( $objeto_model->insereDados($data) ){

    $mensagens = "Usuário criado com sucesso.";
    $this->view->mensagens = $mensagens;
     
}

// Caso dê algo errado com a inserção no banco de dados,
// é impresso uma mensagem de erro e voltamos ao formulário
// com os dados populado, para caso seja algum problema de 
// digitação.
else{
      $this->view->mensagens = "Não foi possível criar usuário.";
      // Reenvia os dado para o formulário.
      $form->populate($data);
      $this->view->formulario = $form;
}
E assim completamos nosso formulário em Zend. Basta testar e usar.
Referência: http://framework.zend.com/manual/en/zend.form.html http://framework.zend.com/manual/1.11/en/learning.quickstart.create-model.html

6 comentários:

  1. olá, como eu especifico qual o campo do banco de dados ele deve inserir a informação que veio do formulário?

    ResponderExcluir
  2. Olá Dayhan.

    Quando você cria um form pro formulário, você dá o nome do campo que está no db.

    Na parte 1 deste meu tutorial ( http://bardozend.blogspot.com/2011/06/formule-alguma-coisa-criando.html ) você vai ver que tem um form tipo 'text' com nome 'nomedoform'.

    Esse 'nomedoform' seria o nome do campo na tabela do db.

    Mas claro que não é regra, você pode por exemplo no controller, criar um array com os nomes dos campos do db nas chaves, e pegar os dados enviados via post para salvar nas chaves certas do novo array, e enviar pro model certinho.

    O importante é somente enviar pro model um array com os nomes dos campos no db certinho, o método de fazer isso fica a seu critério.

    Abraços.

    ResponderExcluir
  3. Boa tarde Albert,
    Estou com um grande problema para relacionar tabelas no zend. Testei minhas models inserindo dados e consultando em uma única tabela e deu tudo certo, mas quando tento inserir em todas ao mesmo tempo não sai nada. Já segui vários tutorias e não deu certo. Caso vc tenha alguma solução para o meu caso, um bom exemplo para que eu possa seguir, me passa aí por favor.
    Valeu.

    ResponderExcluir
    Respostas
    1. Olá Elbes Alves.

      Talzes seja o caso de você criar uma função no model principal que aceite como entrada um array '$data' com os campos e seus respectivos valores, e dentro dessa função você insere/atualiza os dados de cada campo em sua respectiva tabela, inclusive usando o relacionamento do post aqui, mas no caso, apenas para pegar os id´s para inserir/atualizar no lugar certo.

      Abraços.

      Excluir