PHPackages                             bernacamargo/template\_codeigniter-3.1.10 - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. bernacamargo/template\_codeigniter-3.1.10

ActiveProject

bernacamargo/template\_codeigniter-3.1.10
=========================================

Template for the CodeIgniter framework

v1.2(6y ago)5121MITPHPPHP &gt;=5.3.7CI failing

Since Jun 4Pushed 5y ago2 watchersCompare

[ Source](https://github.com/bernacamargo/codehead)[ Packagist](https://packagist.org/packages/bernacamargo/template_codeigniter-3.1.10)[ RSS](/packages/bernacamargo-template-codeigniter-3110/feed)WikiDiscussions master Synced 2mo ago

READMEChangelog (3)Dependencies (2)Versions (2)Used By (0)

CodeHead - Template para Codeigniter 3
======================================

[](#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](https://getbootstrap.com.br/docs/4.1/getting-started/introduction/), [JQuery 3.4.1](https://jquery.com/), [Font-awesome 5.8.1](http://fontawesome.io/icons), [Toastr](https://codeseven.github.io/toastr/), [Core System Classes](https://www.codeigniter.com/userguide3/general/core_classes.html) e [Bibliotecas](https://www.codeigniter.com/userguide3/libraries/loader.html) para manipular funções do [Codeigniter 3](https://www.codeigniter.com/userguide3/index.html).

- Links úteis
    - [Codeigniter 3 Docs](https://www.codeigniter.com/userguide3/index.html)(docs)
    - [Awesome codeigniter](https://github.com/codeigniter-id/awesome-codeigniter)(A list of awesome CodeIgniter core, helpers, hooks, language, libraries, third\_party and other cool resources for CodeIgniter.)
    - [Codeigniter Ion Auth 3](https://github.com/benedmunds/CodeIgniter-Ion-Auth)(Simple and lightweight authentication for your CodeIgniter apps)
    - [FUEL CMS](https://www.getfuelcms.com/home)(The content management system for premium-grade websites)

Sumário
-------

[](#sumário)

- [Instalando](#instalando)
- [Configurando](#configurando)
- [Assets](#assets)
- [Helper functions](#helper-functions)
- [Biblioteca Template](#biblioteca-template)
    - [Métodos](#m%C3%A9todos)
    - [Métodos principais](#m%C3%A9todos-principais)
- [Biblioteca Guard](#biblioteca-guard)
    - [Métodos](#m%C3%A9todos-1)
- [Core MY\_Controller](#core-my_controller)
- [Core MY\_Model](#core-my_model)
    - [Métodos](#m%C3%A9todos-2)
- [Notificações](#notifica%C3%A7%C3%B5es)
- [Plugins JS](#plugins-js)
- [Licença MIT](#license)

Instalando
----------

[](#instalando)

Faça o [download como ZIP](https://github.com/bernacamargo/codehead/archive/master.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
------------

[](#configurando)

### Conectando ao Banco de Dados

[](#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
----------------

[](#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

[](#funções)

- debug()

```
/**
 * debug
 *
 * Exibe o conteúdo detalhado e identado de uma variável no PHP
 *
 * @param  Array $arry
 * @return void
 */
function debug($arry) {
	echo '' . var_export($arry, TRUE) . '';
}
```

- str\_slug()

```
/**
 * str_slug
 *
 * Normaliza uma string removendo todos os caracteres especiais, espaços e acentos.
 *
 * @param  String $str
 * @return String
 */
function str_slug($str) {
    return url_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
 */
function format_money($money) {
    $money = floatval($money);
    echo number_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
 */
function validate_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";
    } else if (preg_match($cardtype['mastercard'], $number)) {
        $type = "mastercard";
    } else if (preg_match($cardtype['amex'], $number)) {
        $type = "amex";
    } else if (preg_match($cardtype['diners'], $number)) {
        $type = 'diners';
    } else if (preg_match($cardtype['bankcard'], $number)) {
        $type = 'bankcard';
    } else if (preg_match($cardtype['jcb'], $number)) {
        $type = 'jcb';
    } else if (preg_match($cardtype['enroute'], $number)) {
        $type = 'enroute';
    } else if (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](https://www.geeksforgeeks.org/luhn-algorithm/) 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
 */

function time_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 ($condition as $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
 */
function hextorgba($hex, $transp = 1) {
    list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x");
    echo 'rgba(' . $r . ',' . $g . ',' . $b . ', ' . $transp . ')';
}
```

Assets
------

[](#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)

[](#carregado-por-padrãobootstrap-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 ``, 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](#biblioteca-template)Para exibir os css/js são utilizados as funções `print_css()` e `print_js()` do [Template](#biblioteca-template)

Biblioteca Template
-------------------

[](#biblioteca-template)

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

```
class Template {

    // instancia do codeigniter
    public $ci;

    // arquivos de css para carregar na página
    public $css;

    // arquivos de js para carregar na página
    public $js;

    // as views que serão carregadas
    public $views = array();

    // modulos para carregar
    public $modules = array();

    // adiciona uma variavel a ser carregada na view
    public $data = array();

    // pagina a ser carregada
    public $p_page = 'home';

    // guard
    public $guard;

    // titulo da pagina
    public $title = '';

    // método construtor
    public function __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

[](#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

[](#métodos-principais)

- set()

```
    /**
     * set
     *
     * seta o valor para uma variavel
     *
     * @param String $chave
     * @param String $valor
     * @return void
     */
    public function set( $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 {

    public function __construct() {
        parent::__construct();
        $this->load->model('Usuarios_model');
    }

    public function index(){
        $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]
     */
    public function item( $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 controller

foreach ($usuarios as $user) {
    echo $user['nome'] . '';
}
```

- set\_title()

```
    /**
     * set_title
     *
     * Define o titulo da página html
     *
     * @param String $title [Titulo da página]
     * @return void
     */
    public function set_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 {

    public function __construct() {
        parent::__construct();
    }

    public function index(){
        $this->template->set_title("Página inicial"); // Seta o titulo da pagina
    }
}
```

- print\_title()

```
    /**
     * print_title
     *
     * Exibe o titulo atual
     *
     * @return void
     */
    public function print_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

```
>

        print_title(); ?>
        .
        .
        .
```

- print\_js()

```
    /**
     * print_js
     *
     * Imprime o js
     *
     * @return void
     */
    public function print_js() {
        if(count($this->js) > 0){
            foreach( $this->js as $js ) {
                if(ENVIRONMENT == 'production')
                echo '';
                else{
                    echo '';
                }
            }
        }
    }
```

> Essa função deve ser utilizada nas views para imprimir na tela os arquivos JS definidos nos [Assets](#config-assets). Deve ser chamada na view `master.php` a qual carrega a estrutura do HTML.

Exemplo

```
        .
        .
        .

```

- print\_css()

```
    /**
     * print_css
     *
     * Imprime o css
     *
     * @return void
     */
    public function print_css() {
        if(count($this->css) > 0){
            foreach( $this->css as $css ) {
                if(ENVIRONMENT == 'production'){
                    echo '';
                }
                else{
                    echo '';
                }

            }
        }
    }
```

> Essa função deve ser utilizada nas views para imprimir na tela os arquivos CSS definidos nos [Assets](#config-assets). Deve ser chamada na view `master.php` a qual carrega a estrutura do HTML.

Exemplo

```
>

        print_title(); ?>

        print_css(); ?>

    .
    .
    .
```

> 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
     */
    public function print_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
     */
    public function print_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](https://github.com/bernacamargo/codehead/blob/master/application/views/master.php) 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
     */
    public function render( $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 {

    public function __construct() {
        parent::__construct();
    }

    public function index(){
        $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
----------------

[](#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](https://www.codeigniter.com/userguide3/libraries/sessions.html) do Codeigniter.

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

```
class Guard {

    // instancia do codeigniter
    public $ci;

    // dados do usuario logado
    public $user = false;

    // método construtor
    public function __construct() {

        // pega a instancia do ci
        $this->ci =& get_instance();

        // carrega a librarie de sessao
        $this->ci->load->library( 'session' );

        // pega os dados do usuario
        if ( $user = $this->ci->session->userdata( 'user' ) ) {
            $this->user = $user;
        }
    }
```

### Métodos

[](#métodos-1)

- logged()

```
    /**
     * logged
     *
     * Verifica se o usuário está logado ou não
     *
     * @return Boolean
     */
    public function logged(){
        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
     */
    public function item( $key ) {
        return isset( $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
     */
    public function login( $email, $senha ) {

        // carrega a model de usuários
        $this->ci->load->model( 'Usuarios_model' );

        // faz o login
        if ( $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 PHP
            if(password_verify($senha, $user['senha'])){
                // guarda na sessao
                $this->ci->session->set_userdata( 'user', $user );

                // guarda no atributo
                $this->user = $user;

                return true;
            }
        }

        return false;
    }
```

> 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](https://www.php.net/manual/pt_BR/function.password-hash.php) para inserir a senha no banco e [password\_verify](https://www.php.net/manual/pt_BR/function.password-verify.php) 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
     */
    public function update() {

        // verifica se existe um usuário logado
        if ( !$this->user ) return false;

        // carrega a model de usuários
        $this->ci->load->model( 'Usuarios_model' );

        // pega os dados do perfil do usuario logado
        if ( $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;

            return true;

        } else return false;
    }
```

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_usuario

echo $this->guard->item('nome'); // Fulano da Silva

$this->guard->update(); // Atualiza a sessão com os valores do banco

echo $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]
     */
    public function getShortName($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 Silva

echo $this->guard->getShortName(); // Fulano Silva

echo $this->guard->getShortName('Fulano de Oliveira da Silva'); // Fulano Silva
```

- logout()

```
    /**
     * logout
     *
     * Limpa a sessão 'user'
     *
     * @return void
     */
    public function logout() {
        $this->ci->session->unset_userdata('user');
    }
```

Exemplo

```
$this->guard->logout();
```

Core MY\_Controller
-------------------

[](#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](#biblioteca-template) e [Guard](#biblioteca-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 construtor
    public function __construct() {
        parent::__construct();

        // Carrega o Template e Guard
        $this->load->library( 'Template' );
        $this->load->library( 'Guard' );
    }
}
```

Core MY\_Model
--------------

[](#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](https://www.codeigniter.com/userguide3/database/query_builder.html), 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;

    public function __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 construtor
    public function __construct() {
        parent::__construct();
    }
}
```

### Métodos

[](#métodos-2)

- 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]
   */
   public function create( $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]
   */
   public function update( $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 update
       return $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]
   */
   public function delete( $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]
   */
   public function getById( $id ){

       // faz a busca
       $this->db->select( '*' )
       ->from( $this->table )
       ->where( [$this->table_id => $id ] );
       $query = $this->db->get();

       // verifica se existem resultados
       return ( $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]
   */
   public function getAll( $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 where
       if ( $where ) $this->db->where( $where );

       $this->db->order_by($order_colum, $order);

       // pega os dados do banco
       $query = $this->db->get();

       // verifica se existem resultados
       return ( $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 ($users as $user) {
        echo $user['nome'] . '';
    }
}
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 ($users as $user) {
        echo $user['nome'] . '';
    }
}
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 ($users as $user) {
        echo $user['nome'] . '';
    }
}
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]
    *
    */
   public function getAllLimit($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 ($users as $user) {
        echo $user['nome'] . '';
    }
}
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
------------

[](#notificações)

O sistema de notificações deste template utiliza a biblioteca javascript [Toastr](https://codeseven.github.io/toastr/) juntamente com a função nativa do Codeigniter [SESSION Flashdata](https://www.codeigniter.com/userguide3/libraries/sessions.html#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]
*/
function notifyUser(type, text, delay = 8000) {
    var icon = "";
    var title = "";

    // Toastr config
    toastr.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 = "&ensp;";

        toastr.options.timeOut = 0;
        toastr.options.extendedTimeOut = 0;

        toastr.info("&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.

```
public function login(){
    $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`:

```
