Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida no Ex. 3 da Aula 1 - Mostrando um produto e a tipografia

No curso somos orientados a passar o id do produto via get. Mas lendo sobre o assunto é orientado passar o nome do produto pelo parâmetro, para assim facilitar a busca do Google até nosso site, pois o nosso produto vai ser a palavra chave, e com o id isso não é possivel, como eu poderia desenvolver essa parte.

<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 }?>
            </table>
4 respostas

você já testou o código abaixo?

View

<h1>Produtos </h1>
            <table class="table">
                <?php foreach ($produtos as $produto) { ?>
                <tr>
                    <td><?= anchor("produtos/mostra?id={$produto['id']}"&nome=$produto['nome'])?></td>                    
                    <td><?= numeroEmReais($produto["preco"])?></td>
                </tr>
                <?php }?>
            </table>

Controller

public function mostra(){

        $id = $this->input->get("id");
        $nome = $this->input->get("nome");

        $this->load->model("produtos_model");
        $produto = $this->produtos_model->buscarPelaIdENome($id , $nome);
        $dados = array("produto" => $produto);
        $this->load->helper(array("typography","conversor"));
        $this->load->view("produtos/mostra" , $dados);

    }

Model

public function buscarPelaIdENome($id , $nome) {
   return $this->db->get_where("produtos", array(
        "id" => $id , "nome"=>$nome))->row_array();
}

Que agora sua view envia os dados da maneira correta via GET, no Controller você lê os dados enviados, processa o id e nome no model, e depois carrega a view mostra que está na pasta produtos.

Olá Raniere, consegui fazer de um jeito diferente, imaginei uma lógica observando o site Submarino. Primeiro configurei o action do form:

<td><?= anchor("produtos/{$produto['id']}/". html_escape(converte($produto["nome"])),character_limiter(html_escape($produto["nome"]), 15))?></td>

Como viu o nome do produto tem que ser convertido para um modelo que irá se adaptar na Url, para isso criei um helper para isso:

<?php 

    function converte($nome)
    {    
        $nome = str_replace('"','',$nome);
        $nome = str_replace(" - ",'-',$nome);
        $nome = str_replace("<",'',$nome);
        $nome = str_replace(">",'',$nome);
        $nome = str_replace("/",'',$nome);
        $nome = str_replace("|",'',$nome);
        $nome = str_replace("+",'',$nome);
        $nome = str_replace("(",'',$nome);
        $nome = str_replace(")",'',$nome);
        $nome = str_replace("*",'',$nome);
        $nome = str_replace("&",'',$nome);
        $nome = str_replace("¨",'',$nome);
        $nome = str_replace("%",'',$nome);
        $nome = str_replace("#",'',$nome);
        $nome = str_replace("@",'',$nome);
        $nome = str_replace("!",'',$nome);
        $nome = str_replace("&",'',$nome);
        $nome = str_replace(", ",'-',$nome);
        $nome = str_replace(",",'-',$nome);
        $nome = str_replace(".",'-',$nome);
        $nome = str_replace(";",'-',$nome);
        $nome = str_replace(":",'-',$nome);
        $nome = str_replace("=",'-',$nome);
        $nome = str_replace("$",'-',$nome);
        $nome = str_replace("§",'-',$nome);
        $nome = str_replace("{",'-',$nome);
        $nome = str_replace("}",'-',$nome);
        $nome = str_replace("[",'-',$nome);
        $nome = str_replace("]",'-',$nome);
        $nome = str_replace("ª",'',$nome);
        $nome = str_replace("º",'-',$nome);
        $nome = str_replace("´",'',$nome);
        $nome = str_replace("`",'',$nome);
        $nome = str_replace("^",'',$nome);
        $nome = str_replace("~",'',$nome);
        $nome = str_replace("?",'',$nome);
        $nome = str_replace("°",'',$nome);
        $nome = str_replace("'",'',$nome);
        $nome = str_replace('á','a',$nome);
        $nome = str_replace('â','a',$nome);
        $nome = str_replace('Á','a',$nome);
        $nome = str_replace('Â','a',$nome);
        $nome = str_replace('à','a',$nome);
        $nome = str_replace('À','a',$nome);
        $nome = str_replace('Ã','a',$nome);
        $nome = str_replace('ã','a',$nome);
        $nome = str_replace('è','e',$nome);
        $nome = str_replace('é','e',$nome);
        $nome = str_replace('ê','e',$nome);
        $nome = str_replace('É','e',$nome);
        $nome = str_replace('Ê','e',$nome);
        $nome = str_replace('í','i',$nome);
        $nome = str_replace('Î','i',$nome);
        $nome = str_replace('î','i',$nome);
        $nome = str_replace('Í','i',$nome);
        $nome = str_replace('ó','o',$nome);
        $nome = str_replace('õ','o',$nome);
        $nome = str_replace('ô','o',$nome);
        $nome = str_replace('Ô','o',$nome);
        $nome = str_replace('Õ','o',$nome);
        $nome = str_replace('Ó','o',$nome);
        $nome = str_replace('ú','u',$nome);
        $nome = str_replace('û','u',$nome);
        $nome = str_replace('Û','u',$nome);
        $nome = str_replace('Ú','u',$nome);
        $nome = str_replace('ç','c',$nome);
        $nome = str_replace('Ç','c',$nome);
        $nome = str_replace('ñ','n',$nome);
        $nome = str_replace('Ñ','n',$nome);
        $nome = preg_replace("/ /", "-", $nome);
        $nome = strtolower($nome);
        return $nome;
    }

 ?>

Depois alterei a rota que o CI deveria executar

$route['produtos/(:num)/:any'] = 'produtos/mostra/$1';

E por fim fiquei com um resultado assim:

http://localhost/projetos/mercado/produtos/16/bolsa-de-cosmeticos

Depois de "produtos" é informado o id, e depois do id eu envio o nome do produto tratado, mas ele é digamos que apenas para deixar a url mais amigável, apenas de "infeite".

solução!

Oi Douglas,

Na verdade o que esses sites e grandes empresas fazem é bem simples. O id do produto fica apenas no banco, mas eles utilizam outro valor como sendo campo único. O banco deles seria algo assim:

Tabela Produto:

id
nome
preco
chave

A ideia é que essa chave seja única para toda a tabela de produtos, e cada produto tem uma chave, que pode até ser produzida automaticamente com um método parecido com o seu acima. Mas o banco entende a chave como um índice, assim, ao invés de buscar ou mesmo exibir para o usuário o ID ele só passa essa chave.

A URL fica parecida com: .../produto/carro-conversivel-irado

Isso ajuda as buscas do google sim e também é o que chamamos de URL amigável.

Na busca eles fazem algo parecido com:


public function buscaPelaChave($key) {
   return $this->db->get_where("produtos", array("chave"=>$key))->row_array();
}

Espero que tenha ajudado a melhorar sua solução.

Abraço

Muito bacana Paulo, bem observado. Valeu!