Criando um catálogo de produtos com Lumine e CodeIgniter – Parte 4
Nesta quarta parte de como integrar Lumine com CodeIgniter, vamos estudar sobre como criar nossa controller de cadastro de usuários.
Nela criaremos as operações de
- Listar os usuários cadastrados
- Pesquisar os usuários cadastrados
- Inclusão de usuários
- Edição de usuários
- Remoção de usuários
Criando a controller de gerenciamento de usuários
Crie um arquivo usuarios.php na seguinte estrutura:
- application/controllers/admin/usuarios.php
Abra o arquivo recém criado coloque o conteúdo abaixo (as explicações estão nos comentários do arquivo):
<?php
/**
* Controller para gerenciamento dos usuários
*
*
* @link http://www.hufersil.com.br
* @author Hugo Ferreira da Silva
*
*/
class Usuarios extends AdminController {
/**
* Metodo para listar os usuarios cadastrados
*
* @param int $page Pagina inicial para listar os usuarios
* @author Hugo Ferreira da Silva
*/
public function index($page = 0){
// objeto para consultar os usuarios
$lista = new Usuario();
$lista->alias('u');
// se usuario informou o nome na pesquisa
if($this->input->post('nome') != ''){
// filtramos pelo nome
$lista->where('u.nome like ?', $this->input->post('nome'));
}
// se usuario informou o email na pesquisa
if($this->input->post('email') != ''){
$lista->where('u.email like ?', $this->input->post('email'));
}
// contamos o numero de registros encontrados
$total = $lista->count();
// limitamos o numero de resultados
$lista->limit(max(0, (int)$page - 1) * LIMITE_PAGINACAO_ADMIN, LIMITE_PAGINACAO_ADMIN)
// ordenamos pelo nome
->order('u.nome asc')
// efetuamos a consulta
->find();
// colocamos nos dados para o template o numero de resultados...
$this->assign('total', $total);
// ... e a lista de resultados
$this->assign('lista', $lista->allToArray());
// exibimos o resultado
$this->display('usuarios/index');
}
/**
* Exibe a tela de inserção/atualização de usuários
*
* @param int $id Codigo do usuario que esta sendo editado ou null para cadastrar um novo
* @author Hugo Ferreira da Silva
*/
public function editar($id = null){
// se tem codigo de usuario e o metodo é GET
if(!empty($id) && $_SERVER['REQUEST_METHOD'] == 'GET'){
// resgatamos o registro do banco
$user = new Usuario();
$user->get($id);
// colocamos os dados na variavel $_POST
$_POST = $user->toArray();
// tiramos a senha (está em MD5)
unset($_POST['senha']);
}
// exibimos a tela de inserção/edição de usuarios
$this->display('usuarios/editar');
}
/**
* Insere um novo usuário ou salva as alterações feitas em um usuário existente
*
* @param int $id Código do Usuário ou null para um novo usuário
* @author Hugo Ferreira da Silva
*/
public function salvar($id = null){
// cria um objeto para persistencia
$dao = new Usuario();
// se está editando (informou o código do usuário)
if(!empty($id)){
// pegamos o registro do banco de dados
$dao->get($id);
// se não informou a senha, então deixamos a mesma
if(empty($_POST['senha'])){
unset($_POST['senha']);
}
}
// se tem senha enviada do formulario
if(!empty($_POST['senha'])){
// colocamos em MD5
$_POST['senha'] = md5($_POST['senha']);
}
// colocamos no objeto os valores que estão no formulario
// como os nomes dos campos tem os mesmos nomes dos campos,
// este método facilita o preenchimento do objeto
$dao->populateFrom($_POST);
// fazemos a validação dos dados
$erros = $dao->validate();
// se não houveram erros
if(empty($erros)){
// fazemos a persistencia
$dao->save();
// redirecionamos para a tela de listagem de usuários
redirect('admin/usuarios/index');
// mas se não passou na validação
} else {
// informamos quais foram os erros
$this->assign('erros', $erros);
// exibimos a tela de inserção/edição
$this->editar($id);
}
}
/**
* Remove um usuário cadastrado
*
* @param int $id Código do usuário a ser removido
* @author Hugo Ferreira da Silva
*/
public function remover($id){
// criamos um objeto de usuario
$user = new Usuario();
// se informou o codigo do usuario e encontrou no banco
if(!empty($id) && $user->get($id) == 1){
// removemos o usuario
$user->delete();
}
// redirecionamos para a tela de listagem de usuários
redirect('admin/usuarios/index');
}
}
?>
Para podermos validar o cadastro de usuários, precisamos adicionar regras de validação de preenchimento de dados do formulário. Estas regras ficarão dentro do arquivo de model de usuário, que está em:
- application/models/Usuario.php
Adicione o método abaixo:
public function validate(){
$this->addValidator(new Lumine_Validator_String('nome', 'Informe o nome do usuário', 3));
$this->addValidator(new Lumine_Validator_Email('email', 'Informe um e-mail válido'));
$this->addValidator(new Lumine_Validator_Unique('email', 'E-mail já utilizado por outro usuário'));
$this->addValidator(new Lumine_Validator_String('senha', 'Informe uma senha com ao menos 4 caracteres', 4));
return parent::validate();
}
Adicionando facilidades para desenvolver o admin.
Para facilitar, iremos realizar algumas alterações no arquivo application/core/AdminController.php. Vamos adicionar:
- O carregamento da biblioteca pagination do CodeIgniter. Ela servirá para colocarmos o número de páginas em resultados encontrados para listagem de registros.
- Criar uma função para armazenar os dados da ultima pesquisa realizada. Assim, podemos fazer uma pesquisa, editar o registro encontrado e, quando retornarmos à tela de listagem, os dados da última pesquisa continuam salvos.
Encontre a linha onde está:
// verifica se a permissão do usuário de acessar a URL indicada
$this->verificarPermissao();
// -------- e adicione
// carrega a biblioteca de paginação
$this->load->library('pagination');
// fazemos um hook para formularios de pesquisa
$this->hookFormularioPesquisa();
Adicione a seguinte função:
/**
* Grava os dados da pesquisa realizada.
*
* <p>Ao realizar uma pesquisa, gravamos quais foram os dados
* enviados pelo usuário na sessão, para quando ele voltar
* na tela de pesquisa os dados continuem lá.</p>
*
* <p>Para funcionar corretamente, o nome do método que realiza
* a consulta deve ser sempre o método "index" da controller</p>.
*
* <p>Ao acessar uma controller diferente, limpamos os dados anteriores</p>
*
* @author Hugo Ferreira da Silva
*/
protected function hookFormularioPesquisa(){
// pega o nome da controller anterior e atual
$ctrlAnterior = empty($_SESSION['_ctrl']) ? null : $_SESSION['_ctrl'];
$ctrlAtual = $this->uri->segment(2);
// se enviou uma solicitação via POST e foi pelo metodo index
if($_SERVER['REQUEST_METHOD'] == 'POST' && strpos($this->uri->uri_string(), '/index') !== false){
$_SESSION['_busca'] = $_POST;
$_SESSION['_ctrl'] = $ctrlAtual;
return;
}
// se não for a mesma controller
if($ctrlAnterior != $ctrlAtual){
// limpamos os dados
unset($_SESSION['_busca'], $_SESSION['_ctrl']);
return;
}
// se tem dados de busca e for o metodo index
if(!empty($_SESSION['_busca']) && $this->uri->segment(3) == 'index'){
$_POST = $_SESSION['_busca'];
}
}
Agora que já temos a lógica de negócio, controller e auxiliadores criados, vamos construir nossas views.
Crie o arquivo application/views/admin/usuarios/index.php com o conteúdo abaixo:
<fieldset class="admin-container form-padrao">
<legend>Cadastro de Usuários - Pesquisar</legend>
<form action="<?php echo site_url('admin/usuarios/index'); ?>" method="post">
<p>
<label for="nome">Nome: </label>
<input type="text" name="nome" id="nome" value="<?php echo $this->input->post('nome'); ?>" />
</p>
<p>
<label for="email">E-mail: </label>
<input type="text" name="email" id="email" value="<?php echo $this->input->post('email'); ?>" />
</p>
<p>
<input type="submit" name="btnBusca" id="btnBusca" value="Consultar" />
<input type="button" name="btnAdicionar" id="btnAdicionar" value="Adicionar Usuário" onclick="location.href='<?php echo site_url('admin/usuarios/editar');?>'" />
</p>
</form>
</fieldset>
<fieldset class="admin-container lista-resultados">
<legend>Usuários encontrados</legend>
<?php if(!empty($lista)): ?>
<table class="tabela-resultados">
<thead>
<tr>
<th>Código</th>
<th>Nome</th>
<th>E-mail</th>
<th>Ações</th>
</tr>
</thead>
<?php
// para cada usuario encontrado
foreach($lista as $item){
// criamos uma linha na tabela
printf('<tr>
<td width="10%%">%d</td>
<td width="40%%">%s</td>
<td width="40%%">%s</td>
<td width="10%%">
<a href="%s" title="Editar" class="btnEditar">Editar</a>
<a href="%s" title="Remover" class="btnRemover">Remover</a>
</td>
</tr>'
, $item['codusuario']
, $item['nome']
, $item['email']
, site_url('admin/usuarios/editar/'.$item['codusuario'])
, site_url('admin/usuarios/remover/'.$item['codusuario'])
);
}
// configurações da paginacao
// @link http://codeigniter.com/user_guide/libraries/pagination.html
$config['uri_segment'] = 4;
$config['total_rows'] = $total;
$config['per_page'] = LIMITE_PAGINACAO_ADMIN;
$config['base_url'] = site_url('admin/usuarios/index');
$config['use_page_numbers'] = TRUE;
$this->pagination->initialize($config);
// exibe a paginacao
printf('<tr>
<td colspan="4"> %s </td>
</tr>'
, $this->pagination->create_links()
);
?>
</table>
<?php else: ?>
<p>Nenhum registro encontrado</p>
<?php endif; ?>
</fieldset>
Crie o arquivo application/views/admin/usuarios/editar.php com o conteúdo abaixo:
<fieldset class="admin-container form-padrao">
<legend>Cadastro de Usuários - <?php echo $this->uri->segment(4) == '' ? 'Adicionar' : 'Atualizar'; ?></legend>
<?php
// se houveram erros
if(!empty($erros)){
// indicamos os erros
echo '<div class="erros">', implode("<br />", $erros), '</div>';
}
?>
<form action="<?php echo site_url('admin/usuarios/salvar/'.$this->uri->segment(4)); ?>" method="post">
<p>
<label for="nome">Nome: </label>
<input type="text" name="nome" id="nome" value="<?php echo $this->input->post('nome'); ?>" />
</p>
<p>
<label for="email">E-mail: </label>
<input type="text" name="email" id="email" value="<?php echo $this->input->post('email'); ?>" />
</p>
<p>
<label for="senha">Senha: </label>
<input type="text" name="senha" id="senha" value="<?php echo $this->input->post('senha'); ?>" />
</p>
<p>
<input type="submit" name="btnSalvar" id="btnSalvar" value="Salvar" />
<input type="button" name="btnCancelar" id="btnCancelar" value="Cancelar" onclick="location.href='<?php echo site_url('admin/usuarios/index');?>'" />
</p>
</form>
</fieldset>
E, para deixarmos nossas views um pouco mais amigáveis, vamos adicionar no arquivo assets/css/admin.css o conteúdo abaixo:
/*************************************/
/* Estilos gerais para admin
/*************************************/
.admin-container {
width: 85%;
margin-left: auto;
margin-right: auto;
margin-bottom: 40px;
padding: 10px;
}
.admin-container legend {
font-weight: bold;
font-size: 14px;
color: #003300;
}
.admin-container input[type="submit"], .admin-container input[type="button"] {
padding: 5px;
}
.admin-container .tabela-resultados {
width: 100%;
border: 1px solid black
}
.admin-container .tabela-resultados td, .admin-container .tabela-resultados th {
padding: 3px;
}
.admin-container .tabela-resultados thead th {
background-color: #EFEFEF;
font-weight:bold;
text-align: left;
}
.admin-container .tabela-resultados tbody tr:hover {
background-color: #EFEFEF;
}
.form-padrao p {
clear: both;
padding-bottom: 5px;
}
.form-padrao p label {
display: block;
float: left;
width: 120px;
padding-top: 2px;
padding-right: 10px;
text-align: right;
}
.btnEditar {
background-image: url("http://www.iconfinder.com/ajax/download/png/?id=11450&s=16");
background-position: center center;
background-repeat: no-repeat;
width: 15px;
height: 15px;
display: inline-block;
overflow:hidden;
text-indent: -10000px;
}
.btnRemover {
background-image: url("http://www.iconfinder.com/ajax/download/png/?id=10032&s=16");
background-position: center center;
background-repeat: no-repeat;
width: 15px;
height: 15px;
display: inline-block;
overflow:hidden;
text-indent: -10000px;
}
.erros {
padding: 4px;
background-color: #FFFF55;
color: #FF0000;
font-weight: bold;
margin-bottom: 10px;
}
Pronto! Se tudo deu certo, efetue o login e depois acesse http://localhost/vitrine/admin/usuarios/index para ver a lista de usuários.
Até a próxima!
@braços e fiquem com Deus!
Criando um catálogo de produtos com Lumine e CodeIgniter – Parte 3 Exemplo de Chat
estou com seguinte problema :
A PHP Error was encountered
Severity: Notice
Message: Use of undefined constant LIMITE_PAGINACAO_ADMIN – assumed ‘LIMITE_PAGINACAO_ADMIN’
Filename: admin/usuarios.php
Line Number: 36
A PHP Error was encountered
Severity: Notice
Message: Use of undefined constant LIMITE_PAGINACAO_ADMIN – assumed ‘LIMITE_PAGINACAO_ADMIN’
Filename: admin/usuarios.php
Line Number: 36
Sera que voce pode me ajudar
Olá!
No arquivo application/config/constants.php acrescente a linha:
define(‘LIMITE_PAGINACAO_ADMIN’, 20);
@braços!