
Como remover múltiplos registros de uma única vez no CodeIgniter
17/12/2019Umas 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.