terça-feira, setembro 28, 2010

Tutorial CodeIgniter - Parte 3

Neste post, vamos criar as funções que irão realizar as operações inserir, atualizar e deletar os registros da tabela bacia_hidrografica.

Antes de começarmos a criar as funções, vamos habilitar a biblioteca "session" do codeigniter e o helper "form", para isso, abra o arquivo autoload.php e modifique as linhas 42 e 54, respectivamente para:

$autoload['libraries'] = array('database', 'session');
$autoload['helper'] = array('url', 'form');

Vamos começar definindo uma função no model que será responsável por inserir os registros na tabela, abra o arquivo bacia_model.php e adicione a seguinte função:

function insert()
{
  $data = $_POST;
  return $this->db->insert('bacia_hidrografica', $data);
}

Já a função abaixo, retorna a linha da tabela com o id_bacia informado, ela será usada para povoar o campo "nome da bacia" do formulário de atualização:

function get_where($id)
{
    $this->db->where('id_bacia', $id);
    $query = $this->db->get('bacia_hidrografica');
    return $query->row();
}

Para realizar o update, usaremos a função abaixo:
function update($id)
{
    $data = $_POST;
    $this->db->where('id_bacia', $id);
    $this->db->update('bacia_hidrografica', $data);
}

Para deletar um registro desta tabela, primeiro faz-se necessário verificar se a mesma não possui nenhum rio vinculado, pois isso vai gerar uma mensagem de erro vinda do banco de dados, em função da constraint foreign key, logo criaremos a função abaixo que fará essa verificação de vínculo:

function verifica_fk($id)
{
    $this->db->where('id_bacia', $id);
    $query = $this->db->get('rio');
    if ($query->num_rows > 0)
    {
        // se houver fk, retorne falso
        return false;
    } else
    {
        return true;
    }
} 

De posse da função acima,  criaremos a função delete():

function delete($id)
{
   // se for verdadeiro, pode apagar o registro
   if ($this->verifica_fk($id))
   {
      $this->db->where('id_bacia', $id);
      return $this->db->delete('bacia_hidrografica');
   }
   else
   {
      return false;
   }
}

Agora, vamos criar duas funções no controller bacia.php, uma para chamar o formulário que será utilizado para a inserção de novos registros, e a outra, que será responsável por efetivar esta operação, através da função definida no model anteriormente (função insert() ):

OBS: Não vamos usar nenhuma função de validação dos dados nesse momento, este será um assunto abordado em um próximo post.

function criar()
{
    $data['titulo'] = "SIRH - Nova Bacia Hidrográfica";
    $data['cabecalho'] = "Criar nova Bacia Hidrográfica";
    $this->load->view('bacia_new', $data);
}

function insere()
{
    $this->bacia_model->insert();
    $this->session->set_flashdata('msg', 'Registro Criado com Sucesso!');
    redirect('bacia');
}

Seguindo o mesmo raciocínio, para realizar a atualização dos registros, vamos criar mais duas funções no controller, editar() e atualizar():

function editar($id)
{
    $data['titulo'] = "SIRH - Editar Bacia Hidrográfica";
    $data['cabecalho'] = "Editar Bacia Hidrográfica";

    $data['registro'] = $this->bacia_model->get_where($id);

    $this->load->view('bacia_new', $data);
}

function atualizar()
{
    $id = $this->input->post('id_bacia');

    $this->bacia_model->update($id);
    $this->session->set_flashdata('msg', 'Registro Atualizado com Sucesso!');
    redirect('bacia');
}

Criamos então a view bacia_new.php, que tanto servirá para inserir, quanto para atualizar, isso é feito através da verificação da existência da variável $registro->id_bacia:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title><?= $titulo ?></title>
    </head>
    <body>
        <h2><?= $cabecalho ?></h2>
        <?php
            //verifica se o form vai ser usado para insert ou update
            if (!isset($registro->id_bacia))
            {
                echo form_open('bacia/insere');
            }
            else
            {
                echo form_open('bacia/atualizar');
                echo form_hidden('id_bacia', $registro->id_bacia);
            }
        ?>
        <p><label>Nome da Bacia:</label>
            <input name="nome_bacia" type="text" id="nome_bacia" size="40" value="<?= @$registro->nome_bacia ?>" />
        </p>

        <p>
            <input type="submit" id="Enviar" value="Enviar" />
        </p>

        <?= form_close() ?>
    </body>
</html>

Finalizando o controller bacia.php, adicionamos a função deletar(), que vai chamar a função delete() do model:

function deletar($id)
{
    if ($this->bacia_model->delete($id))
    {
        $this->session->set_flashdata('msg', 'Registro Deletado com Sucesso!');
    }
    else
    {
        $this->session->set_flashdata('msg', 'ERRO - Não foi possível deletar este registro!<br/>
                                              Primeiro apague os Rios que se relacionam com esta Bacia');
    }
    redirect('bacia');
}

Para terminar, abra o arquivo bacia_view.php e logo abaixo do cabeçalho, chame a função que irá exibir as mensagens para as operações realizadas pelo usuário:

 <p><?=@$this->session->flashdata('msg');?></p>  


Pronto!!! Já temos um CRUD funcional para a tabela bacia_hidrografica, porém sem a validação dos formulários, isso será o assunto da próxima postagem, até lá!

Nenhum comentário: