HUFERSIL.WEBDEVELOPER

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:

  1. O carregamento da biblioteca pagination do CodeIgniter. Ela servirá para colocarmos o número de páginas em resultados encontrados para listagem de registros.
  2. 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!

4 Responses to “Criando um catálogo de produtos com Lumine e CodeIgniter – Parte 4”

  • Valdir diz:

    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

  • Danilo Torres diz:

    Ola hugo,

    Rapaiz, to travado em um erro aqui, estou tentando entender a estrutura para achar o erro, mais deve ser algo bobo que não estou vendo.

    No final de desse pagina você pedi para efetuar o login ele diz que nao encontrou a classe Usuario, o arquivo existe em models o erro é o seguinte:

    Fatal error: Class ‘Usuario’ not found in C:\xampp\htdocs\universom\catalogohugo\application\controllers\admin\login.php on line 29

    se puder me dar uma luz…agradeço muito.

    Danilo Torres

  • Samoel Bianeck diz:

    será que alguem ainda tem tempo de ficar quebrando a cara.? Tem um monte de sistemas prontos que é só instalar e eles funcionam. To fora.

Deixar uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*

Pode usar estas etiquetas HTML e atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">