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
- Codeigniter 3 Docs(docs)
- Awesome codeigniter(A list of awesome CodeIgniter core, helpers, hooks, language, libraries, third_party and other cool resources for CodeIgniter.)
- Codeigniter Ion Auth 3(Simple and lightweight authentication for your CodeIgniter apps)
- FUEL CMS(The content management system for premium-grade websites)
- Instalando
- Configurando
- Assets
- Helper functions
- Biblioteca Template
- Biblioteca Guard
- Core MY_Controller
- Core MY_Model
- Notificações
- Plugins JS
- Licença MIT
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.
Credenciais do banco configuradas em application/config/database.php
- Troque os valores
YOURHOST,DB_USERNAME,DB_PASSWORDeDB_NAMEpelo 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
);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()
- 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 . ')';
}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 arquivosfunctions.jsestyle.cssdevem 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
customdeve 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')
]
];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 ojquery 3.4.1no da viewapplication/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çõesprint_css()eprint_js()do 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();
}
}- 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.
- 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 viewmaster.phpa 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.phpa 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.phpa 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_csseprint_jspossuem uma verificação deENVIRONMENTa qual define o estágio que está o projeto, possuindo os valores:production,testingedevelopment. 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 layoutapplication/views/master.phpcom 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
}
}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;
}
}- 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();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_Controlleratravés da palavra chaveextendsdo 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' );
}
}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
usuarioscuja 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();
}
}- 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
iddo 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.
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> ";toastr.options.timeOut=0;toastr.options.extendedTimeOut=0;toastr.info("<i class='fa fa-spin fa-spinner'></i> "+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 emassets/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();Localizados em assets/vendors/
- animate.css
- animsition
- autosize textarea
- bootstrap-4.1.3-dist
- bootstrap-daterangepicker
- bootstrap-datetimepicker
- bootstrap-wysiwyg(Text editor)
- Chart.js
- countdown.js
- cropper
- css-hamburgers
- datatables.net
- datatables.net-buttons
- datatables.net-fixedheader
- datatables.net-keytable
- datatables.net-responsive
- datatables.net-scroller
- DateJS
- devbridge-autocomplete
- dropzone(Drag'n'drop files)
- eve
- fastclick
- Flot
- flot.curvedlines
- fullcalendar
- gauge.js
- google-code-prettify
- iCheck
- ion.rangeSlider
- jquery.easy-pie-chart
- jquery.hotkeys
- jquery.inputmask
- jquery.tagsinput
- jquery-knob
- jquery-mousewheel
- jQuery-Smart-Wizard
- jquery-sparkline
- jqvmap
- kartik-v-bootstrap-fileinput
- malihu-custom-scrollbar-plugin
- mjolnic-bootstrap-colorpicker
- mocha
- moment
- morris.js
- normalize-css
- nprogress
- parsleyjs
- pdfmake
- perfect-scrollbar
- pnotify
- requirejs
- select2
- skycons
- starrr
- switchery
- toastr notification
- transitionize
- validator
- maskMoney
Desenvolvido por Bernardo Camargo @bernacamargo