Skip to content

josemalcher/CodeIgniter-II-MaisTecnicas-e-BoasPraticas

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 

Repository files navigation

CodeIgniter II - Mais técnicas e boas práticas



  • proj01/application/views/produtos/index.php
 <h1>Produtos</h1>
        <table class="table">
            <?php foreach ($produtos as $produto) : ?>
                <tr>
                    <td><?= anchor("produtos/mostra?id={$produto['id']}", $produto["nome"])?></td>
                    <td><?= numeroEmReais($produto["preco"]); ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
        <hr>
  • proj01/application/controllers/Produtos.php
    public function mostra(){
        $id = $this->input->get("id");
        $this->load->model("produtos_model");
        $produto = $this->produtos_model->busca($id);
        $dados = array("produto" => $produto);
        $this->load->helper("typography");
        $this->load->view("produtos/mostra",$dados);
    }
  • proj01/application/models/produtos_model.php
   public function busca($id){
        return $this->db->get_where("produtos", array(
            "id" => $id
        ))->row_array();
    }

Voltar ao Índice


  • proj01/application/config/routes.php
$route['produtos/(:num)'] = "produtos/mostra/$1";
  • proj01/application/controllers/Produtos.php
 public function mostra($id){
        //$id = $this->input->get("id"); // mudança para recebimento via parametro ao inves de GET
        $this->load->model("produtos_model");
        $produto = $this->produtos_model->busca($id);
        $dados = array("produto" => $produto);
        $this->load->helper("typography");
        $this->load->view("produtos/mostra",$dados);
    }
  • proj01/application/views/produtos/index.php
  <h1>Produtos</h1>
        <table class="table">
            <?php foreach ($produtos as $produto) : ?>
                <tr>
                    <td><?= anchor("produtos/{$produto['id']}", $produto["nome"])?></td>
                    <td><?= character_limiter($produto["descricao"],10) ?></td>
                    <td><?= numeroEmReais($produto["preco"]); ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
        <hr>
  • proj01/application/views/produtos/mostra.php
<div class="container">
    NOME: <?= $produto["nome"]; ?> <br>
    PREÇO: <?= $produto["preco"]; ?> <br>
    DESCRIÇÃO: <?= auto_typography(html_escape($produto["descricao"])); ?> <br>
</div>

Voltar ao Índice


  • proj01/application/controllers/Produtos.php
public function novo()
    {
        $this->load->library("form_validation");
        $this->form_validation->set_rules("nome","nome","required|min_length[5]");
        $this->form_validation->set_rules("preco","preco","trim|required|min_length[10]");
        $this->form_validation->set_rules("descricao","descricao","trim | required|min_length[10]");

        $this->form_validation->set_error_delimiters("<p class='alert alert-danger'>", "</p>");

        $sucesso = $this->form_validation->run();

        if ($sucesso) {
            $usuarioLogado = $this->session->userdata("usuario_logado");
            $produto = array(
                "nome" => $this->input->post("nome"),
                "preco" => $this->input->post("preco"),
                "descricao" => $this->input->post("descricao"),
                "usuario_id" => $usuarioLogado["id"]
            );
            $this->load->model("produtos_model");
            $this->produtos_model->salva($produto);
            $this->session->set_flashdata("success", "Produto Salvo com sucesso");
            redirect('/');
        } else {
            $this->load->view("produtos/formulario");
        }
    }
  • proj01/application/views/produtos/formulario.php
 <div class="container">
            <h1>Cadastro de Itens</h1>
            <?= validation_errors("<p class='alert alert-danger'>", "</p>") ?>
            <?php

            echo form_open("produtos/novo");
            echo form_label("Nome:", "nome");
            echo form_input(array(
                "name" => "nome",
                "id" => "nome",
                "class" => "form-control",
                "value" => set_value("nome",""),
                "maxlength" => "255"
            )); echo form_error("nome");

            echo form_label("Preço", "preco");
            echo form_input(array(
                "name" => "preco",
                "id" => "preco",
                "class" => "form-control",
                "maxlength" => "255",
                "value" => set_value("preco",""),
                "type" => "number"
            ));echo form_error("preco");

            echo form_textarea(array(
                "name" => "descricao",
                "id" => "descricao",
                "value" => set_value("descricao", ""),
                "class" => "form-control"
            )); echo form_error("descricao");
            echo form_button(array(
                "class" => "btn btn-primary",
                "content" => "Cadastrar",
                "type" => "submit"
            ));
            echo form_close();

            ?>
</div>

Voltar ao Índice


04 - alidação customizada e mensagens em português

  • proj01/application/controllers/Produtos.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');

class Produtos extends CI_Controller
{

    public function index()
    {

        //$this->output->enable_profiler(true);

        $this->load->helper(array('url', 'currency', 'form'));

        $this->load->model('produtos_model');
        $produtos = $this->produtos_model->buscaTodos();
        $dados = array("produtos" => $produtos);

        $this->load->view("produtos/index.php", $dados);
    }

    public function formulario()
    {
        $this->load->view("produtos/formulario");
    }

    public function novo()
    {
        $this->form_validation->set_rules("nome", "nome", "required|min_length[5]|callback_nao_tenha_a_palavra_melhor");
        $this->form_validation->set_rules("preco", "preco", "trim|required|min_length[2]");
        $this->form_validation->set_rules("descricao", "descricao", "trim|required|min_length[10]");

        $this->form_validation->set_error_delimiters("<p class='alert alert-danger'>", "</p>");

        $sucesso = $this->form_validation->run();

        if ($sucesso) {
            $usuarioLogado = $this->session->userdata("usuario_logado");
            $produto = array(
                "nome" => $this->input->post("nome"),
                "preco" => $this->input->post("preco"),
                "descricao" => $this->input->post("descricao"),
                "usuario_id" => $usuarioLogado["id"]
            );
            $this->load->model("produtos_model");
            $this->produtos_model->salva($produto);
            $this->session->set_flashdata("success", "Produto Salvo com sucesso");
            redirect('/');
        } else {
            $this->load->view("produtos/formulario");
        }
    }

    public function mostra($id)
    {
        //$id = $this->input->get("id"); // mudança para recebimento via parametro ao inves de GET
        $this->load->model("produtos_model");
        $produto = $this->produtos_model->busca($id);
        $dados = array("produto" => $produto);
        $this->load->helper("typography");
        $this->load->view("produtos/mostra", $dados);
    }

    public function nao_tenha_a_palavra_melhor($nomeProduto)
    {
        $posicao = strpos($nomeProduto, "melhor");
        if ($posicao == FALSE) {
            return TRUE;
        } else {
            $this->form_validation->set_message("nao_tenha_a_palavra_melhor", "O campo '%s' não pode conter a palavra melhor");
            return FALSE;
        }
    }

}
  • proj01/application/views/produtos/formulario.php
<!DOCTYPE html>
<html lang="pt_BR">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="description" content="Curso CI">
    <meta name="author" content="José Malcher Jr.">
    <link href="<?= base_url('assets/css/bootstrap.min.css') ?>" rel="stylesheet">
    <title>Site Institucional - Cadastro de itens</title>
</head>
<body>
<div class="container">
    <h1>Cadastro de Itens</h1>
    <?php

    echo form_open("produtos/novo");
    echo form_label("Nome:", "nome");
    echo form_input(array(
        "name" => "nome",
        "id" => "nome",
        "class" => "form-control",
        "value" => set_value("nome", ""),
        "maxlength" => "255"
    ));
    echo form_error("nome");

    echo form_label("Preço", "preco");
    echo form_input(array(
        "name" => "preco",
        "id" => "preco",
        "class" => "form-control",
        "maxlength" => "255",
        "value" => set_value("preco", ""),
        "type" => "number"
    ));
    echo form_error("preco");

    echo form_textarea(array(
        "name" => "descricao",
        "id" => "descricao",
        "value" => set_value("descricao", ""),
        "class" => "form-control"
    ));
    echo form_error("descricao");
    echo form_button(array(
        "class" => "btn btn-primary",
        "content" => "Cadastrar",
        "type" => "submit"
    ));
    echo form_close();

    ?>
</div>
<script src="<?= base_url('assets/js/jquery-3.3.1.min.js') ?>"></script>
<script src="<?= base_url('assets/js/bootstrap.min.js') ?>"></script>
<script src="<?= base_url('assets/js/ie10-viewport-bug-workaround.js') ?>"></script>
</body>
</html>
</body>
</html>

Voltar ao Índice


  • proj01/application/config/migration.php
$config['migration_enabled'] = TRUE;
$config['migration_type'] = 'sequential';
$config['migration_version'] = 1;
  • proj01/application/migrations/001_cria_tabela_de_vendas.php
<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Migration_Cria_tabela_de_vendas extends CI_Migration
{

    public function up()
    {
        $this->dbforge->add_field(array(
            'id' => array(
                'type' => 'INT',
                'auto_increment' => true
            ),
            'produto_id' => array(
                'type' => 'INT'
            ),
            'comprador' => array(
                'type' => 'INT'
            ),
            'data_de_entrega' => array(
                'type' => 'DATE'
            ),
        ));
        $this->dbforge->add_key('id', true);
        $this->dbforge->create_table('vendas');
    }

    public function down()
    { //voltar "atrás"
        $this->dbforge->drop_table('vendas');
    }

}
  • proj01/application/controllers/utils.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');

class Utils extends CI_Controller
{
    public function migrate(){
        $this->load->library("migration");

        if ($this->migration->current() === FALSE)
        {
            show_error($this->migration->error_string());
        }
    }
}

Voltar ao Índice


  • proj01/application/helpers/date_helper.php
<?php
function dataPtBrParaMySql($dataPtBr)
{
    $partes = explode("/", "$dataPtBr");
    return "{$partes[2]}-{$partes[1]}-{$partes[0]}";
}
  • proj01/application/models/Vendas_model.php
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');


class Vendas_model extends CI_Model
{
    public function salva($venda)
    {
        $this->db->insert("vendas", $venda);
    }
}
  • proj01/application/controllers/Vendas.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');

class Vendas extends CI_Controller
{
    public function nova()
    {
        $this->load->helper('date');
        $usuario = $this->session->userdata("usuario_logado");

        $this->load->model("vendas_model");

        $venda = array(
            "produto_id" => $this->input->post("produto_id"),
            "comprador_id"=> $usuario["id"],
            "data_de_entrega" => dataPtBrParaMySql($this->input->post("data_de_entrega"))
        );
        $this->vendas_model->salva($venda);
        $this->session->set_flashdata("success","Pedido de comprar efetuado com sucesso");
        redirect(base_url());
    }
}
  • proj01/application/views/produtos/mostra.php
<div class="container">
    NOME: <?= $produto["nome"]; ?> <br>
    PREÇO: <?= $produto["preco"]; ?> <br>
    DESCRIÇÃO: <?= auto_typography(html_escape($produto["descricao"])); ?> <br>

    <h2>Compre Agora Mesmo!</h2>
    <?php
    echo form_open("vendas/nova");

    echo form_hidden("produto_id", $produto["id"]);

    echo form_label("Data de entrega", "data_de_entrega");
    echo form_input(array(
        "name" => "data_de_entrega",
        "class" => "form-control",
        "id" => "data_de_entrega",
        "maxlength" => "255",
        "value" => ""
    ));
    echo form_button(array(
        "class" => "btn btn-primary",
        "content" => "comprar",
        "type" => "submit"
    ));

    echo form_close();

    ?>

</div>

Voltar ao Índice


  • proj01/application/migrations/002_adiciona_vendido_ao_produto.php
<?php

class Migration_adiciona_vendido_ao_produto extends CI_Migration
{
    public function up()
    {
        $this->dbforge->add_column('produtos', array(
            'vendido'=>array(
                'type'=>'boolean',
                'default'=> 0
            )
        ));
    }

    public function down()
    {
        $this->dbforge->drop_column('produtos','vendido');
    }
}
  • proj01/application/config/migration.php
$config['migration_version'] = 2;
  • proj01/application/models/Vendas_model.php
class Vendas_model extends CI_Model
{
    public function salva($venda)
    {
        $this->db->insert("vendas", $venda);
        $this->db->update("produtos",
            array("vendido" => 1),
            array("id"=> $venda["produto_id"])
        );
    }
}

LISTAR APENAS OS NÃO VENDIDOS

  • proj01/application/models/produtos_model.php
  public function buscaTodos()
    {
        $this->db->where("vendido",false);
        return $this->db->get("produtos")->result_array();
    }

Voltar ao Índice


Listagem das vendas do usuário

  • proj01/application/controllers/Vendas.php
    public function index()
    {
        $usuario = $this->session->userdata("usuario_logado");
        $this->load->model("produtos_model");
        $produtosVendidos = $this->produtos_model->buscaVendidos($usuario);
        $dados = array("produtosVendidos" => $produtosVendidos);
        $this->load->view("vendas/index", $dados);
    }
  • proj01/application/models/produtos_model.php
    public function buscaVendidos($usuario)
    {
        $id = $usuario["id"];
        $this->db->select("produtos.*, vendas.data_de_entrega");
        $this->db->from("produtos");
        $this->db->join("vendas", "vendas.produto_id = produtos.id");
        $this->db->where("vendido",true);
        $this->db->where("usuario_id",$id);
        return $this->db->get()->result_array();

    }
  • proj01/application/helpers/date_helper.php
// função para ajustar a data no view para o formato BR
function dataMysqlParaPtBr($dataMysql){
    $data = new DateTime($dataMysql);
    return $data->format("d/m/Y");
}
  • proj01/application/views/vendas/index.php
<div class="container">
    <h1>Minhas Vendas</h1>
    <table class="table">
        <?php foreach ($produtosVendidos as $produto) : ?>
            <tr>
                <td><?= $produto["nome"]; ?></td>
                <td><?= dataMysqlParaPtBr($produto["data_de_entrega"]);  ?></td>
            </tr>
        <?php endforeach; ?>
    </table>

    <hr>
</div>

Voltar ao Índice


  • proj01/application/helpers/auth_helper.php
<?php
function autoriza()
{
    $ci = get_instance();
    $usuarioLogado = $ci->session->userdata("usuario_logado");
    if (!$usuarioLogado) {
        $ci->session->set_flashdata("danger", "Você precisa estar logado!");
        redirect("/");
    }
    return $usuarioLogado;
}
  • proj01/application/controllers/Vendas.php
  • proj01/application/controllers/Produtos.php
  //$usuario = $this->session->userdata("usuario_logado");
    $usuario = autoriza(); // << - Ajuste para o helper de verificação

Voltar ao Índice


  • proj01/application/controllers/Vendas.php
public function nova()
    {
        $this->load->helper('date');
        //$usuario = $this->session->userdata("usuario_logado");
        $usuario = autoriza(); // << - Ajuste para o helper de verificação

        $this->load->model(array("vendas_model","produtos_model","usuarios_model"));

        $venda = array(
            "produto_id" => $this->input->post("produto_id"),
            "comprador" => $usuario["id"],
            "data_de_entrega" => dataPtBrParaMySql($this->input->post("data_de_entrega"))
        );
        $this->vendas_model->salva($venda);

        /* envio de emails - NÂO TESTADA!*/
        $this->load->library("email");
        $config['protocol'] = "smtp";
        $config['smtp_host'] = "ssl://smtp.gmail.com";
        $config['smtp_user'] = "malcher.malch@gmail.com";
        $config['smtp_pass'] = ""; // SENHA!
        $config['charset'] = "utf-8";
        $config['mailtype']= "html";
        $config['newline'] = "\r\n";
        $config['smtp_port'] = "465";
        $this->email->initialize($config);

        $produto = $this->produtos_model->busca($venda["produto_id"]); //busca nomes dos produtos
        $vendedor = $this->usuarios_model->busca($produto['usuario_id']);

        $dados = array("produto"=>$produto);
        $conteudo = $this->load->view("vendas/email.php",$dados, TRUE); // página modelo de email // TRUE = não renderize, devolva o conteúdo

        $this->email->from("malcher.malch@gmail.com","Mercado");
        $this->email->to(array($vendedor['email']));
        $this->email->subject("Seu produto {$produto['nome']} foi vendido");
        $this->email->message($conteudo); // mensagem separada para views/email.php
        $this->email->send();


        $this->session->set_flashdata("success", "Pedido de comprar efetuado com sucesso");
        redirect(base_url("/"));
    }
  • proj01/application/models/Usuarios_model.php
    public function busca($id)
    {
        $this->db->where("id", $id);
        return $this->db->get("usuarios")->row_array();
    }

Voltar ao Índice


  • proj01/application/core/MY_Loader.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');

class MY_Loader extends CI_Loader
{
    public function template($nome, $dados = array())
    {
        $this->view("cabecalho.php");
        $this->view($nome,$dados);
        $this->view("rodape.php");
    }
}
  • Ajustes das páginas chamar o template

Voltar ao Índice


About

Curso Alura - CodeIgniter II - Mais técnicas e boas práticas

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published