Implementação de Busca no Painel Administrativo com CoreThink

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.

  1. 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'))

  1. 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);

  1. 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();
        }
    }
}

Tags: CoreThink ThinkPHP PHP busca administrativa painel admin

Publicado em 7-14 03:46