Skip to content

Repository files navigation

CodeHead - Template para Codeigniter 3

CodeHead é uma biblioteca com otimizações voltada para diminuir a repetição de código e aumentar a produtividade através de métodos úteis. Utilizaremos Twitter Bootstrap 4, JQuery 3.4.1, Font-awesome 5.8.1, Toastr, Core System Classes e Bibliotecas para manipular funções do Codeigniter 3.

  • Links úteis

Sumário

Instalando

Faça o download como ZIP ou clone o repósitorio em seu ambiente local, em seguida basta realizar a configuração da aplicação e começar a usa-la para desenvolver sua sistema web.

Configurando

Conectando ao Banco de Dados

Credenciais do banco configuradas em application/config/database.php

  • Troque os valores YOURHOST, DB_USERNAME, DB_PASSWORD e DB_NAME pelo host, username, senha e nome do banco de dados respectivamente
$db['default'] = array(
'dsn' => '',
'hostname' => 'YOURHOST',
'username' => 'DB_USERNAME',
'password' => 'DB_PASSWORD',
'database' => 'DB_NAME',
'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
);

Helper functions

O template possui algumas funções pré-definidas em PHP para facilitar no seu desenvolvimento.

  • debug()
  • str_slug()
  • format_money()
  • validate_card()
  • time_ago()
  • hextorgba()

Funções

  • debug()
/** * debug * * Exibe o conteúdo detalhado e identado de uma variável no PHP *  * @param Array $arry * @return void */functiondebug($arry) {
echo'<pre>' . var_export($arry, TRUE) . '</pre>';
}
  • str_slug()
/** * str_slug * * Normaliza uma string removendo todos os caracteres especiais, espaços e acentos. *  * @param String $str * @return String */functionstr_slug($str) {
returnurl_title(convert_accented_characters($str), "-", true);
}
  • format_money()
/** * format_money * * Recebe um valor float/ e converte para a exibição padrão do Real com 2 casas decimais, separando os decimais com virgula e a casa de milhares com ponto. *  * @param Mixed $money * @return void */functionformat_money($money) {
$money = floatval($money);
echonumber_format($money, 2, ',', '.');
}
  • validate_card()
/** * validate_card * * Recebe um número de cartão de crédito e retorna o número do cartão, a bandeira dele e se é valido ou não. *  * @param String $number * @return array $return */functionvalidate_card($number){
// Remove spaces$number = str_replace("", "", $number);
$cardtype = array(
'visa' => "/^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/",
'mastercard' => "/^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/",
'discover' => "/^6011-?\d{4}-?\d{4}-?\d{4}$/",
'amex' => "/^3[4,7]\d{13}$/",
'diners' => "/^3[0,6,8]\d{12}$/",
'bankcard' => "/^5610-?\d{4}-?\d{4}-?\d{4}$/",
'jcb' => "/^[3088|3096|3112|3158|3337|3528]\d{12}$/",
'enroute' => "/^[2014|2149]\d{11}$/",
'switch' => "/^[4903|4911|4936|5641|6333|6759|6334|6767]\d{12}$/"
);
$type = false;
if (preg_match($cardtype['visa'], $number)) {
$type = "visa";
} elseif (preg_match($cardtype['mastercard'], $number)) {
$type = "mastercard";
} elseif (preg_match($cardtype['amex'], $number)) {
$type = "amex";
} elseif (preg_match($cardtype['diners'], $number)) {
$type = 'diners';
} elseif (preg_match($cardtype['bankcard'], $number)) {
$type = 'bankcard';
} elseif (preg_match($cardtype['jcb'], $number)) {
$type = 'jcb';
} elseif (preg_match($cardtype['enroute'], $number)) {
$type = 'enroute';
} elseif (preg_match($cardtype['switch'], $number)) {
$type = 'switch';
} else {
$type = false;
}
$return['valid'] = LuhnCheck($number);
$return['ccnum'] = $number;
$return['type'] = $type;
return$return;
}

Essa função utiliza o Algoritmo de Luhn para fazer o checksum dos números do cartão retornando TRUE ou FALSE.

  • time_ago()
/** * time_ago * * Recebe um Timestamp e retorna o tempo que passou desta data até o momento atual. *  * @param Integer $time * @return boolean */functiontime_ago($time){
$time_difference = time() - $time;
if ($time_difference < 1) {
return'less than 1 second ago';
}
$condition = array(
12 * 30 * 24 * 60 * 60 => 'year',
30 * 24 * 60 * 60 => 'month',
24 * 60 * 60 => 'day',
60 * 60 => 'hour',
60 => 'minute',
1 => 'second'
);
foreach ($conditionas$secs => $str) {
$d = $time_difference / $secs;
if ($d >= 1) {
$t = round($d);
return'about ' . $t . '' . $str . ($t > 1 ? 's' : '') . ' ago';
}
}
}
  • hextorgba()
/** * hextorgba * * Recebe uma string referente a um valor hexadecimal, um valor de transparencia entre 0-1 e converte para RGBA. *  * @param String $hex * @param Float $transp * @return boolean */functionhextorgba($hex, $transp = 1) {
list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x");
echo'rgba(' . $r . ',' . $g . ',' . $b . ', ' . $transp . ')';
}

Assets

Defina a source de todos os import .js e .css em application/config/assets.php

  • No array $config['default'] configure a ordem, da esquerda para a direita, em que os assets serão carregados. Note que os arquivos functions.js e style.css devem ser carregados por último. É válido freezar que os assets apenas serão carregados caso sejam definidos nesse array.
$config['default'] = ['bootstrap', 'vendors', 'toastr', 'custom'];

O $config["default"] é o array responsável por definir quais e em qual ordem os assets serão importados.

O indice custom deve estar sempre na última posição do vetor.

  • Defina o caminho dos plugins a serem utilizados sempre respeitando a estrutura dos arrays(como no exemplo a seguir) e adicionando o nome deste ao $config['default'](como mostrado a cima).
$config['modulo_name'] = [
'css' => [
site_url('assets/path/to/css/file1.css'),
site_url('assets/path/to/css/file2.css'),
site_url('assets/path/to/css/file3.css'),
site_url('assets/path/to/css/file4.css')
],
'js' => [
site_url('assets/path/to/js/file1.js'),
site_url('assets/path/to/js/file2.js'),
site_url('assets/path/to/js/file3.js'),
site_url('assets/path/to/js/file4.js')
]
];

Carregado por padrão(bootstrap e toastr)

Note que o Jquery não é carregado nos assets, visto que se carrega-lo ao final do documento, não será possível utiliza-lo no meio do <body>, então carrego o jquery 3.4.1 no da view application/views/master.php

// Bootstrap 4.3.1$config['bootstrap'] = [
'css' => [ 'https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css',
site_url('assets/vendors/bootstrap-datepicker-1.9.0-dist/css/bootstrap-datepicker.min.css')
],
'js' => [
'https://unpkg.com/popper.js/dist/umd/popper.min.js',
'https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js',
site_url('assets/vendors/bootstrap-datepicker-1.9.0-dist/js/bootstrap-datepicker.min.js')
]
];
// Toastr notification$config['toastr'] = [
'css' => [
site_url('assets/vendors/toastr/toastr.min.css')
],
'js' => [
site_url('assets/vendors/toastr/toastr.min.js')
]
];
/** * ==================================== * ADICIONAR OS PLUGINS NO ARRAY ABAIXO * ==================================== */// Plugins localizados na pasta assets/vendors$config['vendors'] = [
'css' => [
],
'js' => [
]
];
// Ultimo módule a ser carregado$config['custom'] = [
'css' => [ site_url('assets/css/style.css'),
],
'js' => [ site_url('assets/js/functions.js'), ]
];

Essa $config é carregada no método construtuor do Template Para exibir os css/js são utilizados as funções print_css() e print_js() do Template

Biblioteca Template

Essa classe tem como função principal auxiliar no fluxo MVC e possue métodos para carregar os assets(módulos), renderizar views, definir o title da página e carregar informações do Controller => View.

class Template {
// instancia do codeigniterpublic$ci;
// arquivos de css para carregar na páginapublic$css;
// arquivos de js para carregar na páginapublic$js;
// as views que serão carregadaspublic$views = array();
// modulos para carregarpublic$modules = array();
// adiciona uma variavel a ser carregada na viewpublic$data = array();
// pagina a ser carregadapublic$p_page = 'home';
// guardpublic$guard;
// titulo da paginapublic$title = '';
// método construtorpublicfunction__construct() {
// pega a instancia do ci$this->ci =& get_instance();
// pega a biblioteca de configuração$this->ci->config->load( 'assets' );
// pega a biblioteca de guard$this->ci->load->library( 'Guard' );
$this->guard = $this->ci->guard;
// carrega os módulos padrão$this->loadDefault();
}
}

Métodos

  • set_title()
  • print_title()
  • loadDefault()
  • use_module()
  • loadModules()
  • set()
  • item()
  • addCss()
  • addJs()
  • print_js()
  • print_css()
  • view()
  • print_view()
  • page()
  • print_component()
  • print_page()
  • render()

Não explicarei todos os métodos, pois muitos deles são apenas funções auxiliares e acabam nunca sendo utilizadas na prática pelo desenvolvedor.

Métodos principais

  • set()
/** * set * * seta o valor para uma variavel *  * @param String $chave * @param String $valor * @return void */publicfunctionset( $chave, $valor ) {
$this->data[$chave] = $valor;
}

Essa função deve ser utilizada nos controllers para enviar informação para as views

Exemplo

class Usuario extends MY_Controller {
publicfunction__construct() {
parent::__construct();
$this->load->model('Usuarios_model');
}
publicfunctionindex(){
$usuarios = $this->Usuarios_model->getAll(); // busca todos os usuarios no bd$this->template->set("usuarios", $usuarios); // seta os usuarios ($usuarios) encontrados para a posição 'usuarios' do array do template
}
}
  • item()
/** * item * * pega o valor de uma varivel *  * @param String * @return mixed [Retorna o objeto do array indicado pela $chave ou null caso não exista] */publicfunctionitem( $chave ) {
return ( isset( $this->data[$chave] ) ) ? $this->data[$chave] : null;
}

Essa função deve ser utilizada nas views para recuperar informações enviadas pelo controller.

Exemplo

$usuarios = $this->template->item('usuarios'); //Armazena em $usuarios os dados adicionados anteriormente no controllerforeach ($usuariosas$user) {
echo$user['nome'] . '<br>';
}
  • set_title()
/** * set_title * * Define o titulo da página html *  * @param String $title [Titulo da página] * @return void */publicfunctionset_title( $title ) {
$this->title = $title;
}

Essa função deve ser utilizada nos controllers para definir o título da página que será carregada.

Exemplo

class Home extends MY_Controller {
publicfunction__construct() {
parent::__construct();
}
publicfunctionindex(){
$this->template->set_title("Página inicial"); // Seta o titulo da pagina
}
}
  • print_title()
/** * print_title * * Exibe o titulo atual *  * @return void */publicfunctionprint_title() {
echo$this->title;
}

Essa função deve ser utilizada nas views para printar o titulo da página uma vez que este tenha sido definido no controller pela função set_title. Deve ser chamada na view master.php a qual carrega a estrutura do HTML.

Exemplo

<!DOCTYPE html><htmllang="pt-br"><head><metahttp-equiv="Content-Type" content="text/html; charset=UTF-8"><!-- Meta, title, CSS, favicons, etc. --><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible" content="IE=edge"><metaname="viewport" content="width=device-width, initial-scale=1"><metahttp-equiv="Content-Language" content="pt-br"><!-- TITLE --><title><?PHP $template->print_title(); ?></title><!-- Exibe na tela o title setado no controller -->
.
.
.
  • print_js()
/** * print_js * * Imprime o js *  * @return void */publicfunctionprint_js() {
if(count($this->js) > 0){
foreach( $this->jsas$js ) {
if(ENVIRONMENT == 'production')
echo'<script src="'.$js.'" type="text/javascript"></script>';
else{
echo'<script src="'.$js.'?version='.time().'" type="text/javascript"></script>';
}
}
}
}

Essa função deve ser utilizada nas views para imprimir na tela os arquivos JS definidos nos Assets. Deve ser chamada na view master.php a qual carrega a estrutura do HTML.

Exemplo

.
.
.
<!-- PRINTJS - CONFIGIN config/assets.php -->
<?php$template->print_js(); ?>
</body>
</html>
  • print_css()
/** * print_css * * Imprime o css *  * @return void */publicfunctionprint_css() {
if(count($this->css) > 0){
foreach( $this->cssas$css ) {
if(ENVIRONMENT == 'production'){
echo'<link href="'.$css.'" rel="stylesheet" media="screen"/>';
}
else{
echo'<link href="'.$css.'?version='.time().'" rel="stylesheet" media="screen"/>'; }
}
}
}

Essa função deve ser utilizada nas views para imprimir na tela os arquivos CSS definidos nos Assets. Deve ser chamada na view master.php a qual carrega a estrutura do HTML.

Exemplo

<!DOCTYPE html><htmllang="pt-br"><head><metahttp-equiv="Content-Type" content="text/html; charset=UTF-8"><!-- Meta, title, CSS, favicons, etc. --><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible" content="IE=edge"><metaname="viewport" content="width=device-width, initial-scale=1"><metahttp-equiv="Content-Language" content="pt-br"><title><?PHP $template->print_title(); ?></title><!-- Exibe na tela o title setado no controller --><?PHP $template->print_css(); ?></head>
.
.
.

Note que nas funções print_css e print_js possuem uma verificação de ENVIRONMENT a qual define o estágio que está o projeto, possuindo os valores: production, testing e development. Quando não estivermos em ambiente de produção, a URL do arquivo recebe um sufixo ?version='.time().', para que o navegador seja sempre forçado a baixar o arquivo evitando problemas de cache.

  • print_component()
/** * page * * carrega um componente *  * @param String * @param Array $var [Array de dados a serem enviados para a view] * @return void */publicfunctionprint_component( $component , $var = false) {
// carrega a pagina$this->ci->load->view( 'components/'.$component, $var);
}

Essa função deve ser utilizada nas views para imprimir um componente existente em application/views/components/

  • print_page()
/** * print_page * * Carrega uma view salva em views/pages/[view].php *  * @param String * @return void */publicfunctionprint_page( $page = false ){
// verifica se o usuário deseja carregar uma pagina em especifico$this->p_page = $page ? $page : $this->p_page;
// carrega a pagina$this->ci->load->view( 'pages/'.$this->p_page );
}

Essa função deve ser utilizada nas views para imprimir uma página existente em application/views/pages/

  • render()

Deve ser utilizado como um substituto do $this->load->view() do codeigniter para carregar páginas completas, dê uma olhada na view master para entender melhor o fluxo de carregamento.

/** * render * * Renderiza a página escolhida em um layout escolhido (master.php) *  * @param String $layout * @param String $page * @return void */publicfunctionrender( $layout = false, $page = false ) {
// carrega os modulos$this->loadModules();
// verifica se o usuário deseja carregar uma pagina em especifico$this->p_page = $page ? $page : $this->p_page;
// carrega a view$this->ci->load->view( $layout, [ 'template' => $this ] );
}

Essa função deve ser utilizada nos controllers para exibir uma página existente em application/views/pages/ dentro do layout application/views/master.php com seus respectivos módulos de css/js.

Exemplo

class Home extends MY_Controller {
publicfunction__construct() {
parent::__construct();
}
publicfunctionindex(){
$this->template->set_title("Página inicial"); // Seta o titulo da pagina$this->template->render('master', 'home'); // Carrega a view /views/pages/home.php dentro do layout views/master.php
}
}

Biblioteca Guard

Essa classe tem como função facilitar a manipulação da variável de sessão do usuário, utiliza-se as funções do Session Library do Codeigniter.

É restrito apenas à sessão de usuário ($_SESSION['user'] ou $this->session->user);

class Guard {
// instancia do codeigniterpublic$ci;
// dados do usuario logadopublic$user = false;
// método construtorpublicfunction__construct() {
// pega a instancia do ci$this->ci =& get_instance();
// carrega a librarie de sessao$this->ci->load->library( 'session' );
// pega os dados do usuarioif ( $user = $this->ci->session->userdata( 'user' ) ) {
$this->user = $user;
}
}

Métodos

  • logged()
/** * logged * * Verifica se o usuário está logado ou não *  * @return Boolean */publicfunctionlogged(){
return$this->user ? true : false;
}

Exemplo

if($this->guard->logged()){
echo'Usuário logado';
}
else{
echo'Usuário deslogado';
}
  • item()
/** * item * * Retorna um item do array $user salvo na sessão *  * @param String $key [Campo do array $user] * @return Object or NULL */publicfunctionitem( $key ) {
returnisset( $this->user[$key] ) ? $this->user[$key] : null;
}

Exemplo

$nome = $this->guard->item('nome');
echo$nome;
// Fulano da Silva
  • login()
/** * login * * Tenta fazer o login do usuario através de um e-mail e senha inseridos *  * @param String $email [E-mail para logar] * @param String $senha [Senha para logar] * @return Boolean */publicfunctionlogin( $email, $senha ) {
// carrega a model de usuários$this->ci->load->model( 'Usuarios_model' );
// faz o loginif ( $user = $this->ci->Usuarios_model->validate( $email ) ) {
// Valida a senha do usuário// Para cadastrar a senha no banco utilize a função password_hash() do PHPif(password_verify($senha, $user['senha'])){ // guarda na sessao$this->ci->session->set_userdata( 'user', $user ); // guarda no atributo$this->user = $user;
returntrue;
}
}
returnfalse;
}

Percebam que nessa função é utilizado o método validate() do model de Usuarios. Essa função é responsável por fazer a busca através do email e da senha informados como parâmetros e retornar as tuplas referente ao usuário buscado ou false caso não encontre. Outro ponto importante é que deve ser utilizado hash para criptografar as senhas, sendo necessário o uso da função password_hash para inserir a senha no banco e password_verify para validar a senha no momento do login.

Exemplo

$email = 'fulano@example.com';
$senha = '123456';
if($this->guard->login($email, $senha)){
echo'Bem-vindo!';
}
else{
echo'Credenciais inválidas';
}
  • update()
/** * update * * Busca o usuario no banco de dados e atualiza a sessão com os dados 'novos' *  * @return Boolean */publicfunctionupdate() {
// verifica se existe um usuário logadoif ( !$this->user ) returnfalse;
// carrega a model de usuários$this->ci->load->model( 'Usuarios_model' );
// pega os dados do perfil do usuario logadoif ( $user = $this->ci->Usuarios_model->getById( $this->user['id_usuario'] ) ) {
// seta a sessao$this->ci->session->set_userdata( 'user', $user );
// seta o usuario$this->user = $user;
returntrue;
} elsereturnfalse;
}

Exemplo

echo$this->guard->item('nome'); // Fulano da Silva$dados = ['id' => $id_usuario, 'nome' => 'Bernardo']; //Seta os dados para o update$this->Usuarios_model->update($dados); // Atualiza o nome do usuario com id = $id_usuarioecho$this->guard->item('nome'); // Fulano da Silva$this->guard->update(); // Atualiza a sessão com os valores do bancoecho$this->guard->item('nome'); // Bernardo
  • getShortName()
/** * getShortName * * @param String $nome [Nome completo do usuario] * @return String [Concatena o primeiro e o ultimo nome do usuario] */publicfunctiongetShortName($nome = false){
if(!$nome)
$nome = $this->user['nome'];
$nomes = explode("", $nome);
if(count($nomes) > 1)
$nome = $nomes[0] . "" . $nomes[count($nomes)-1]; else$nome = $nomes[0];
return$nome;
}

Exemplo

echo$this->guard->item('nome'); // Fulano da Silvaecho$this->guard->getShortName(); // Fulano Silvaecho$this->guard->getShortName('Fulano de Oliveira da Silva'); // Fulano Silva
  • logout()
/** * logout * * Limpa a sessão 'user' *  * @return void */publicfunctionlogout() {
$this->ci->session->unset_userdata('user');
}

Exemplo

$this->guard->logout();

Core MY_Controller

Localizado em application/core/MY_Controller.php

Essa classe acaba sendo mais simples, pois cada controller é muito específico. Contudo é no método construtor que carregamos as bibliotecas Template e Guard.

Todos os controllers devem herdar o MY_Controller através da palavra chave extends do PHP.

class MY_Controller extends CI_Controller {
// médoto construtorpublicfunction__construct() {
parent::__construct();
// Carrega o Template e Guard$this->load->library( 'Template' );
$this->load->library( 'Guard' );
}
}

Core MY_Model

Localizado em application/core/MY_Model.php

Essa classe é responsável por permitir a reutilização de funções que são comuns em aplicações web que utilizam SQL para manipular um banco de dados.

Nota: O MY_Model não substitui o Query Builder, então se você tem que usar alguma query complexa, não utilize o MY_Model para isso.

class MY_Model extends CI_Model {
/** * table * * nome da tabela no model * * @protected */protected$table;
/** * table_id * * chave da tabela no model * * @protected */protected$table_id;
publicfunction__construct() {
parent::__construct();
}
}

Basicamente a mágica acontece ao utilizar-se do conceito de herança da Programação Orientada a Objetos. Dessa forma os models a serem criados pelo desenvolvedor devem herdar essa classe através da palavra chave extends.

O $table(nome da tabela) e $table_id(chave primária) são atributos essenciais para isso, pois ambas representam as variáveis de qualquer consulta SQL básica, dessa forma podemos reutilizar funções como create, update e delete que ja existem no CI e além disso criar algumas novas como getAll() ou getAllLimit() para todos os models básicos.

É obrigatório a inicialização destas variáveis em todos os models que herdarem esta classe.

  • Exemplo Model para tabela de usuarios cuja a chave primária é id_usuario
class Usuarios_model extends MY_Model {
/** * table * * nome da tabela no model * * @protected */protected$table = 'usuarios';
/** * table_id * * chave da tabela no model * * @protected */protected$table_id = 'id_usuario';
// metodo construtorpublicfunction__construct() {
parent::__construct();
}
}

Métodos

  • create()
/** * create *  * insere um novo dado * * @param Array $dados [Dados a serem inseridos na tabela] * @return Boolean [Retorna true caso os dados tenham sido inseridos e false caso contrario] */publicfunctioncreate( $dados ){
return$this->db->insert( $this->table, $dados );
}

Exemplo

$this->load->model('Usuarios_model');
$dados = [
'nome' => 'Fulano da Silva',
'email' => 'fulano@example.com',
'senha' => '123456',
'sexo' => 'masculino',
'data_nasc' => '1996-04-03'
]; if($this->Usuarios_model->create($dados)){
echo'Usuário cadastrado com sucesso!';
}
else{
echo'Houve um erro no servidor.';
}
  • update()
/** * update *  * atualiza um dado * * @param Array $dados [Dados a serem atualizados. *O campo 'id' deve ser passado obrigatoriamente] * @return Boolean [Retorna true caso os dados tenham sido atualizados e false caso tenha algum erro de lógica no SQL] */publicfunctionupdate( $dados ) {
// prepara os dados$this->db->where( $this->table_id, $dados['id']);
// deleta o id
unset( $dados['id'] );
if ( isset( $dados[$this->table_id] ) ) unset( $dados[$this->table_id] );
// faz o updatereturn$this->db->update($this->table, $dados); }

O campo id do array é obrigatório

Exemplo

$this->load->model('Usuarios_model');
$dados = [
'id' => 1,
'nome' => 'Fulano da Silva',
'email' => 'fulano@example.com',
'senha' => '123456',
'sexo' => 'masculino',
'data_nasc' => '1996-04-03'
]; if($this->Usuarios_model->update($dados)){
echo'Usuário atualizado com sucesso!';
}
else{
echo'Houve um erro no servidor.';
}

Perceba que não importa o nome da sua chave primária, o array com dados para update deve sempre conter um campo chamado id!

  • delete()
/** * delete *  * deleta um dado * * @param mixed $id [Chave primária da tabela] * @return Boolean [Retorna true caso remova a linha ou false caso contrario] */publicfunctiondelete( $id ) {
$this->db->where( $this->table_id, $id );
return$this->db->delete( $this->table ); }

Exemplo

$this->load->model('Usuarios_model');
if($this->Usuarios_model->delete(1)){
echo'Usuário deletado com sucesso!';
}
else{
echo'Houve um erro no servidor.';
}
  • getById()
/** * getById *  * pega um dado por id * * @param $id [Chave primária da tabela] * @return mixed [Retorna um array com os dados requisitados ou false caso não encontre nada] */publicfunctiongetById( $id ){
// faz a busca$this->db->select( '*' )
->from( $this->table )
->where( [$this->table_id => $id ] );
$query = $this->db->get();
// verifica se existem resultadosreturn ( $query->num_rows() > 0 ) ? $query->result_array()[0] : false;
}

Exemplo

$this->load->model('Usuarios_model');
$user = $this->Usuarios_model->getById(1);
if($user){
echo$user['nome']; //Fulano da Silva
}
else{
echo'Usuário não encontrado';
}
  • getAll()
/** * getAll *  * pega todos os registros * * @param mixed $where [Opcional: Condições da consulta] * @param String $fields [Opcional: Campos do SELECT da consulta] * @param mixed $orderby [Opcional: Ordenação da consulta] * @return mixed [Retorna a coleção de dados requisitadas em uma matriz] */publicfunctiongetAll( $where = false, $fields = '*', $orderby = false) {
if($orderby){
$orderby = explode("", $orderby);
$order = $orderby[1];
$order_colum = $orderby[0];
}
else{
$order = 'asc';
$order_colum = $this->table_id;
}
// monta a busca$this->db->select( $fields );
$this->db->from( $this->table );
//verifica se existe um whereif ( $where ) $this->db->where( $where );
$this->db->order_by($order_colum, $order);
// pega os dados do banco$query = $this->db->get();
// verifica se existem resultadosreturn ( $query->num_rows() > 0 ) ? $query->result_array() : false;
} 

Exemplo 1:

$this->load->model('Usuarios_model');
$users = $this->Usuarios_model->getAll(); // Busca todas as tuplas da tabela `usuarios`if($users){
foreach ($usersas$user) {
echo$user['nome'] . '<br>';
}
}
else{
echo'Usuário não encontrado';
}

Exemplo 2:

$this->load->model('Usuarios_model');
$users = $this->Usuarios_model->getAll('sexo = masculino', 'usuarios.nome', 'nome asc'); // Será feita a consulta na tabela `usuarios` atrás das tuplas que possuem o sexo definido como masculino e retornará todos os nomes em ordem crescente.if($users){
foreach ($usersas$user) {
echo$user['nome'] . '<br>';
}
}
else{
echo'Usuário não encontrado';
}

Exemplo 3:

$this->load->model('Usuarios_model');
$users = $this->Usuarios_model->getAll(false, 'usuarios.nome', 'nome asc'); // Será feita a consulta na tabela `usuarios` e retornara todos os nomes dos usuarios ordenados pelo nome crescente.if($users){
foreach ($usersas$user) {
echo$user['nome'] . '<br>';
}
}
else{
echo'Usuário não encontrado';
}
  • getAllLimit()
/** * getAllLimit *  * @param int $limit [Inteiro que define a quantidade máxima de resultados da consulta] * @return Array[] [Retorna a coleção de dados requisitadas em uma matriz]  *  */publicfunctiongetAllLimit($limit){
$this->db->from($this->table)
->select('*')
->limit($limit);
$busca = $this->db->get();
return ($busca->num_rows() > 0) ? $busca->result_array() : array();
}

Exemplo

$this->load->model('Usuarios_model');
$users = $this->Usuarios_model->getAllLimit(5); // Será feita a consulta na tabela `usuarios` e retornará as 5 primeiras linhas.if($users){
foreach ($usersas$user) {
echo$user['nome'] . '<br>';
}
}
else{
echo'Usuário não encontrado';
}

Esta função foi feita apenas para auxiliar no desenvolvimento da aplicação, dificilmente você usará ela em produção. Deve ser utilizada quando você queira testar uma listagem de dados e possa limitar a quantidade de resultados, porém sem poder filtra-los.

Notificações

O sistema de notificações deste template utiliza a biblioteca javascript Toastr juntamente com a função nativa do Codeigniter SESSION Flashdata.

Utilizaremos a função notifyUser() para exibir as notificações através do javascript.

/*** notifyUser* * notifica o usuario** @param String type [Tipo de notificação]* @param String text [Conteúdo da notificação]* @param Int delay [Tempo para a notificação sumir]*/functionnotifyUser(type,text,delay=8000){varicon="";vartitle="";// Toastr configtoastr.options={"closeButton": false,"debug": false,"newestOnTop": false,"progressBar": true,"positionClass": "toast-top-right","preventDuplicates": true,"onclick": null,"showDuration": 300,"hideDuration": 1000,"timeOut": delay,"extendedTimeOut": 1000,"showEasing": "swing","hideEasing": "linear","showMethod": "fadeIn","hideMethod": "fadeOut"}switch(type){case'success':
toastr.success(text);break;case'error':
toastr.error(text);break;case'warning':
toastr.warning(text);break;case'info':
toastr.info(text);break;case'loading':
icon="<i class='fa fa-spin fa-spinner'></i>&ensp;";toastr.options.timeOut=0;toastr.options.extendedTimeOut=0;toastr.info("<i class='fa fa-spin fa-spinner'></i>&ensp;"+text);break;default:
toastr.error('Houve um erro ao exibir a notificação');break;}};

Para trazermos notificações de um Controller para uma View após realizarmos um redirect utilizaremos o conceito de SESSION FLASHDATA, o qual permite armazenar informações válidas somente na próxima requisição e após isso serão apagadas automaticamente.

Exemplo de como criar uma notificação no Controller.

publicfunctionlogin(){
$post = $this->input->post();
if($this->guard->login($post['email'], $post['senha'])){
$this->session->set_flashdata('success', 'Bem vindo!');
}
else$this->session->set_flashdata('error', 'Credenciais inválidas.');
redirect(site_url(),'location');
}

O arquivo application/views/components/alerts.php contém a ligação entre o PHP e o Javascript:

<?phpif($this->session->flashdata('success')): ?>
<script>
$(document).ready(function(){
notifyUser('success', '<?phpecho$this->session->flashdata('success') ?>');
});
</script>
<?phpendif; ?><?phpif($this->session->flashdata('error')): ?>
<script>
$(document).ready(function(){
notifyUser('error', '<?phpecho$this->session->flashdata('error') ?>');
});
</script>
<?phpendif; ?><?phpif($this->session->flashdata('warning')): ?>
<script>
$(document).ready(function(){
notifyUser('warning', '<?phpecho$this->session->flashdata('warning') ?>');
});
</script>
<?phpendif; ?><?phpif($this->session->flashdata('info')): ?>
<script>
$(document).ready(function(){
notifyUser('info', '<?phpecho$this->session->flashdata('info') ?>');
});
</script>
<?phpendif; ?><?phpif($this->session->flashdata('loading')): ?>
<script>
$(document).ready(function(){
notifyUser('loading', '<?phpecho$this->session->flashdata('loading') ?>');
});
</script>
<?phpendif; ?>

A função notifyUser() está definida em assets/js/functions.js

Existem duas formas de se exibir uma notificação para o usuário

  • PHP

No controller, antes do redirect(), deve-se criar uma session flashdata com o índice definido como sendo um dos cinco tipos citados abaixo.

$this->session->set_flashdata('success', 'Muito bom, sua ação foi concluída com sucesso!');
  • Javascript

Em qualquer view basta chamar a função notifyUser passando como primeiro parâmetro o tipo da notificação e segundo a mensagem que desejar.

notifyUser('success','Muito bom, sua ação foi concluída com sucesso!');

Existem cinco tipos de notificações pré-definidas: success, error, warning, info e loading.

  • success:

Deve ser utilizada para notificações de sucesso.

  • error:

Deve ser utilizada para notificações de erros ou falhas do sistema

  • warning:

Deve ser utilizada para notificações de atenção ao usuário

  • info:

Deve ser utilizada para dar informações extras ao usuário

  • loading:

Deve ser utilizada para funções que utilizem ajax chamando a função notifyUser na beforeSend() para que passe para o usuário a sensação de que algo está acontecendo visto que o ajax é dinâmico e não é percebido pelo usuário final.

Exemplo de notificação loading:

$.ajax({url: '/path/to/file',type: 'POST',dataType: 'json',data: data,beforeSend: function(){notifyUser('loading','Carregando informações...');}}).done(function(response){PNotify.removeAll();//Remove todas as notificaçõesconsole.log("success");}).fail(function(xhr,status){console.log("error");}).always(function(){console.log("complete");});
  • Remover as notificações ativas

Para fazer com que as notificações desapareçam basta usar a função do Toastr:

toastr.clear();

Plugins JS

Localizados em assets/vendors/

Contribuição

Desenvolvido por Bernardo Camargo @bernacamargo

Licença

MIT

About

Core MY_Controller/MY_Model, bibliotecas, plugins e muito mais para facilitar o uso do framework PHP Codeigniter 3

Topics

Resources

Stars

5 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages