Neste artigo, vamos explorar como adicionra funcionalidade de busca em uma página de listagem do painel administrativo utilizando o framework CoreThink baseado em ThinkPHP.
- Configuração do Campo de Busca na Interface
Para inserir a caixa de pesquisa na visualização, utilizamos o método setSearch do construtor de listagem. O campo deve ser posicionado após os botões de ação superior.
->setSearch('Digite nome, MAC ou número do quarto', U('index'))
- Definição dos Campos de Pesquisa no Controller
No início do método index, capturamos o termo digitado pelo usuário e montamos a estrutura de filtro para consulta no banco de dados. O operador like permite busca parcial nos campos especificados.
$busca = I('busca', '', 'string');
$filtro = array('like','%'.$busca.'%');
$criterio['nome_dispositivo|endereco_mac|numero_quarto'] = array($filtro, $filtro, $filtro,'_multi'=>true);
- Aplicação do Filtro na Consulta
O filtro construído é então passado para o método where da consulta ao modelo, garantindo que apenas os registros correspondentes sejam retornados.
->where($criterio)
Observação: durante a busca, utilize o botão de pesquisa ao invés da tecla Enter para submeter o formulário.
Exemplo Completo do Controller
<?php
namespace Dispositivo\Admin;
use Admin\Controller\AdminController;
use Common\Util\Think\Page;
class AccessPointController extends AdminController
{
public function index()
{
// Processamento da busca
$termo = I('busca', '', 'string');
$filtroBusca = array('like', '%' . $termo . '%');
$condicoes['nome_dispositivo|endereco_mac|numero_quarto'] = array(
$filtroBusca, $filtroBusca, $filtroBusca, '_multi' => true
);
// Paginação e consulta
$paginaAtual = !empty($_GET["p"]) ? $_GET["p"] : 1;
$modelo = D('dispositivo_ap');
$resultados = $modelo
->page($paginaAtual, C('ADMIN_PAGE_ROWS'))
->where($condicoes)
->select();
$paginacao = new Page(
$modelo->count(),
C('ADMIN_PAGE_ROWS')
);
// Estruturação hierárquica dos dados
$arvore = new \Common\Util\Tree();
$resultados = $arvore->toFormatTree($resultados);
// Construção da página de listagem
$construtor = new \Common\Builder\ListBuilder();
$construtor->setMetaTitle('Access Points Wi-Fi')
->addTopButton('addnew')
->addTopButton('delete', array('model' => 'dispositivo_ap'))
->setSearch('Digite nome, MAC ou número do quarto', U('index'))
->addTableColumn('id', 'Identificador')
->addTableColumn('nome_dispositivo', 'Nome do Dispositivo')
->addTableColumn('endereco_mac', 'MAC')
->addTableColumn('numero_quarto', 'Número do Quarto')
->addTableColumn('status_funcionamento', 'Status', 'status')
->addTableColumn('acoes', 'Ações', 'btn')
->setTableDataList($resultados)
->setTableDataPage($paginacao->show())
->addRightButton('edit')
->display();
}
public function adicionar()
{
if (IS_POST) {
$modelo = D('dispositivo_ap');
$registro = $modelo->create();
if ($registro) {
$novoId = $modelo->add($registro);
if ($novoId) {
$this->success('Registro criado com sucesso', U('index'));
} else {
$this->error('Falha ao criar registro');
}
} else {
$this->error($modelo->getError());
}
} else {
$construtorForm = new \Common\Builder\FormBuilder();
$construtorForm->setMetaTitle('Novo Access Point')
->setPostUrl(U('adicionar'))
->addFormItem('nome_dispositivo', 'text', 'Nome do AP')
->addFormItem('endereco_mac', 'text', 'mac', 'Endereço MAC do AP')
->addFormItem('numero_quarto', 'text', 'Número do Quarto', 'Quarto vinculado ao AP')
->addFormItem('status_funcionamento', 'radio', 'Status', 'Estado atual', array('0' => 'Online', '1' => 'Offline'))
->display();
}
}
public function editar($id)
{
if (IS_POST) {
$modelo = D('dispositivo_ap');
$registro = $modelo->create();
if ($registro) {
if ($modelo->save($registro)) {
$this->success('Atualização concluída', U('index'));
} else {
$this->error('Falha na atualização');
}
} else {
$this->error($modelo->getError());
}
} else {
$dadosExistentes = D('dispositivo_ap')->find($id);
$construtorForm = new \Common\Builder\FormBuilder();
$construtorForm->setMetaTitle('Editar Access Point')
->setPostUrl(U('editar'))
->addFormItem('id', 'hidden', 'Identificador', 'ID')
->addFormItem('nome_dispositivo', 'text', 'Nome', 'Nome do AP')
->addFormItem('endereco_mac', 'text', 'MAC', 'Endereço MAC')
->addFormItem('status_funcionamento', 'radio', 'Status', 'Estado atual', array('0' => 'Online', '1' => 'Offline'))
->addFormItem('numero_quarto', 'text', 'Número do Quarto', 'Quarto vinculado')
->setFormData($dadosExistentes)
->display();
}
}
}