Como remover múltiplos registros de uma única vez no CodeIgniter

Como remover múltiplos registros de uma única vez no CodeIgniter

17/12/2019 3 Por Jonathan Lamim

Umas das solicitações mais frequentes dos clientes no início do processo de desenvolvimento de aplicações web aqui no escritório é gostaria de poder remover múltiplos registros de uma única vez no sistema.

E como isso é algo comum por aqui acredito que possa ser bastante útil para você saber como construir essa funcionalidade utilizando o CodeIgniter.

A seguir você poderá implementar um exemplo em 4 passos e então remover múltiplos registros de uma única vez em suas aplicações.

Passo 1 – Criação e configuração do ambiente

Crie uma nova aplicação em CodeIgniter, seja através do download do código-fonte no site oficial ou via Composer, com o comando a seguir:

composer create-project bcit-ci/codeigniter nomde_do_projeto --prefer-dist

Após criar o ambiente 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 biblioteca 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 2 – 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 à estrutura 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><?= $this->session->flashdata('resultado'); ?></div>
<?php endif; ?>

<?php if ($this->session->flashdata('erro') == TRUE): ?>
<div><?= $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 3 – 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","commodo.tincidunt@aliquamadipiscinglacus.org"),("Avram","sem.Pellentesque.ut@molestietellusAenean.org"),("Mufutau","in.sodales.elit@nunc.org"),("Malachi","sagittis.felis@Ut.co.uk"),("Victor","orci.luctus.et@Phasellusdolor.net"),("Geoffrey","Cras.interdum@ligula.ca"),("Chaney","mi@Cumsociis.net"),("Emerson","Curae@semutdolor.co.uk"),("Xanthus","dolor.sit.amet@nasceturridiculus.co.uk"),("Elvis","dis@ipsumnuncid.com");

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

Passo 4 – 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.