Excluindo múltiplos registros selecionados por checkbox

Nesse tutorial vou mostrar como fazer exclusão múltipla a partir de um formulário com campos de seleção do tipo “checkbox”.

Passo 1 – Preparação do ambiente

Faça o download e instalação do CodeIgniter em seu embiente de desenvolvimento. Caso não saiba como fazer, temos um tutorial explicando cada detalhe, clique aqui e acompanhe.

Passo 2 – Configurações

Será necessário fazer 3 configurações, uma para conexão com o banco de dados, uma para uso de sessões e outra para uso das rotas.

Configurando o banco de dados

Para configurar o banco de dados, abra o arquivo “application/config/autoload.php” e adicione o carregamento da library “database” a ele.

$autoload['libraries'] = array('database');

Feito isso, abra o arquivo “application/config/database.php” e preencha os campos “hostname, username, password e database” com os dados da sua conexão.

$db['default'] = array(
    'dsn'    => '',
    'hostname' => '',
    'username' => '',
    'password' => '',
    'database' => '',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

Configurando o uso de sessões

Volte ao arquivo “application/config/autoload.php” e adicione o carregamento da library “session”, para que possamos fazer os uso das sessões para exibição de mensagens ao usuário.

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

Configurando as rotas

Para configurar as rotas, vá até o arquivo “application/config/routes.php” e cria uma nova chave para a variável $route, chamada “excluir”.

$route['excluir'] = 'Base/Excluir';

Essa chave indica a criação da rota “excluir” e quando essa rota for chamada, quem responderá por ela será o método “Excluir”, do controller “Base”, que será criado mais adiante.

Passo 3 – Criando a view

Vamos precisar de apenas uma view para construir esse exemplo, essa view vai conter uma tabela pra listar os dados e os checkbox para seleção dos registros a serem excluídos, combinados com um formulário e um botão para acionar a rota de exclusão.

O código abaixo refere-se apenas ao código HTML da tabela com o formulário, não tendo sido adicionado o cabeçalho e rodapé usado para páginas HTML, lembre-se de colocar ao criar a view.

A formatação e estilização da view pode ficar a seu critério, o importante é que ela esteja com essa base estrutural para que o resultado do código seja correto.

Crie um arquivo chamado “home.php”no diretório “application/views” e insira o código abaixo no arquivo.

<?php if ($this->session->flashdata('resultado') == TRUE): ?>
        <div><?php echo $this->session->flashdata('resultado'); ?></div>
    <?php endif; ?>

    <?php if ($this->session->flashdata('erro') == TRUE): ?>
        <div><?php echo $this->session->flashdata('erro'); ?></div>
    <?php endif; ?>

    <form action="<?= base_url('excluir') ?>" method="POST" id="formDelete">
    <table>
        <caption>Contatos</caption>
        <thead>
            <tr>
                <th><input type="checkbox" name="selecionar_todos" title="Selecionar Todos"/></th>
                <th>Nome</th>
                <th>Email</th>
            </tr>
        </thead>
        <tbody>
            <?php if ($contatos == FALSE): ?>
                <tr><td colspan="2">Nenhum contato encontrado</td></tr>
            <?php else: ?>
                <?php foreach ($contatos as $row): ?>
                    <tr>
                        <td><input type="checkbox" name="excluir_todos[]" value="<?=$row['id']?>"/></td>
                        <td><?= $row['nome']; ?></td>
                        <td><?= $row['email']; ?></td>
                    </tr>
                <?php endforeach; ?>
            <?php endif; ?>
        </tbody>
    </table>
    <input type="submit" value="Excluir Selecionados" />
    </form>

No início do código da view temos 2 ifs verificando se existem informações nas sessões “resultado” e “erro”, caso as informações existam, elas são exibidas na tela.

Em seguida temos a tabela que vai listar os dados retornados pelo controller. Se existirem registros, é executado um foreach para executar o loop e criar as linhas com os registros dentro da tabela.

Na linha de título da tabela temos um checkbox chamado “selecionar_todos”, e nas linhas de registro o checkbox se chama “excluir_todos[]”. O checkbox da linha de título é o responsável por fazer a seleção de todos os registros de uma única vez, e o checkbox de cada linha de registro seleciona somente o registro da linha em que está.

Para que o checkbox “selecionar_todos” possa funcionar, é preciso usar um pouco de JavaScript. Para facilitar vou utilizar um código feito com jQuery, veja a seguir:

$("input[name=selecionar_todos]").click(function(){
    $('input:checkbox').not(this).prop('checked', this.checked);
});

No evento “onclick” do checkbox “selecionar_todos” aplico o status dele (true ou false) ao demais checkbox da tabela através de prop(‘checked’,this.checked), que altera a propriedade “checked” dos checkbox para o status do checkbox “selecionar_todos”.

Você pode inserir esse código no rodapé, logo depois de chamar a library jQuery (que é necessária para que ese código funcione) ou criar um arquivo .js contendo esse código e chamá-lo no rodapé após a chamada da library jQuery.

Com isso a view está finalizada e vamos criar o model.

Passo 4 – Criando o model

Como vamos trabalhar com 2 operações no banco de dados, precisaremos criar um model para organizar melhor o código. Em “application/models” crie um arquivo chamado “Contatos_model.php”, e nele coloque o código a seguir:

<?php

class Contatos_model extends CI_Model {

    function __construct() {
        parent::__construct();
    }

    function GetContatos() {
        $query = $this->db->get('contatos');
        if ($query->num_rows() > 0) {
            return $query->result_array();
        } else {
            return false;
        }
    }

    function Delete($ids){
      if($this->db->where_in('id',$ids)->delete('contatos'))
        return true;
      else
        return false;
    }
}

O método GetContatos é o responsável por retornar um array com os registros contidos no banco de dados. Já o método Delete é o responsável por executar a exclusão de todos os registros selecionados.

No método Delete foi utilizada função where_in, que vai pegar os registros do array passado como parâmetro para o método, e usá-los como o parâmetro para definir quais os registros serão excluídos.

A tabela utilizada para armazenamento e exclusão dos dados é a “contatos”, que você deverá criar e inserir registros nela. Para facilitar, pode utilizar o códigos SQL abaixo, que vão criar a tabela e inserir alguns dados.

CREATE TABLE IF NOT EXISTS `contatos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `contatos` (`nome`,`email`) VALUES ("Hayes","[email protected]"),("Avram","[email protected]"),("Mufutau","[email protected]"),("Malachi","[email protected]"),("Victor","[email protected]"),("Geoffrey","[email protected]"),("Chaney","[email protected]"),("Emerson","[email protected]"),("Xanthus","[email protected]"),("Elvis","[email protected]");

O model está concluído, vamos para a última parte, que é a criação do controller.

Passo 5 – Criando o controller

Como vamos trabalhar com 2 operações no controller, precisamos criar 2 métodos. Em “application/controllers” crie um arquivo chamado “Base.php”, e nele coloque o código a seguir:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Base extends CI_Controller {

    function __construct(){
        parent::__construct();
        $this->load->model('contatos_model');
    }

    public function Index()
    {
        $data['contatos'] = $this->contatos_model->GetContatos();
        $this->load->view('home', $data);
    }

    public function Excluir()
    {
            $ids = $this->input->post("excluir_todos");
            $numRegs = count($ids);

            if($numRegs > 0)
            {
                $this->contatos_model->Delete($ids);
                $this->session->set_flashdata('resultado', "$numRegs Contato(s) excluído(s) com sucesso.");
            }
            else
            {
                $this->session->set_flashdata('erro', "Nenhum registro selecionado para exclusão.");
            }

            redirect();
    }

}

O primeiro método é o __construct(), que é acionado sempre que a classe Base for instanciada, ele vai carregar o model “Contatos_model”.

Em seguida temos o método Index, que vai obter os registros da tabela “Contatos” através da execução de “$this->contatos_model->GetContatos()” e exibir a view da home.

Depois temos o método chave desse artigo, que é o Excluir, onde será feito o processo de obtenção dos regsitros a serem excluídos e a chamada ao método $this->contatos_model->Delete(), passando como parâmetro a variável $ids, que recebeu o array com os ids dos registros a serem excluídos.

Conclusão

Essas são as rotinas e códigos necessários para que você possa fazer um processe de exclusão múltipla utilizando os checkbox para seleção dos registros.

Abaixo você encontrará os acessos para o código-fonte completo e um exemplo online.

button-codigo-fonteDemo Online