Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rafa-martin

resgatar valor url amigável

Recommended Posts

boa tarde.


tenho uma função de url amigável que localizei na internet.


<?php

function url_amigavel($string)

{

$table = array(

'Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z',

'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c',

'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A',

'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',

'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I',

'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',

'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U',

'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',

'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a',

'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',

'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i',

'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o',

'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u',

'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',

'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r',

);

// Traduz os caracteres em $string, baseado no vetor $table

$string = strtr($string, $table);

// converte para minúsculo

$string = strtolower($string);

// remove caracteres indesejáveis (que não estão no padrão)

$string = preg_replace("/[^a-z0-9_\s-]/", "", $string);

// Remove múltiplas ocorrências de hífens ou espaços

$string = preg_replace("/[\s-]+/", " ", $string);

// Transforma espaços e underscores em hífens

$string = preg_replace("/[\s_]/", "-", $string);

// retorna a string

return $string;

}

var_dump(url_amigavel('Isso é um teste de ação'));

// string(23) "isso-e-um-teste-de-acao"

?>


só que a minha dúvida é como eu vou usar a mesma para poder criar meu link e resgatar o valor da url (query string) na outra página. por exemplo:


tenho uma página chamada main.php. Nessa pagina tenhos os seguintes links


<a href="index.php?pagina=home">Home</a><br>

<a href="index.php?pagina=noticia">Noticias</a><br>

<a href="index.php?pagina=contato">Contato</a><br>


minha página index.php está assim:


<?php

$pagina = $_request("pagina");

if ($pagina == "home")

{

include "home.php";

}


else if ($pagina == "noticia")

{

include "noticia.php";

}


else if ($pagina == "contato")

{

include "contato.php";

}

?>


dessa forma minha query string ficaria assim: http://meudominio.com.br/index.php?pagina=home.


só que eu preciso que fique dessa forma http://meudominio.com.br/home e na página index eu consiga resgatar o valor que está sendo passado na variável pagina.


Compartilhar este post


Link para o post
Compartilhar em outros sites

então na verdade isso pra mim agora não irá servir.

 

eu peguei um exemplo desse site http://gilbertoalbino.com/url-amigaveis-com-php-e-apache-um-padrao-de-projeto-de-software/

 

entendi como funciona. no entanto, eu queria saber como posso fazer chamado as páginas através de menus.

 

tenho a seguinte estrutura.

 

na raiz uma pasta chamada libs com o código

 

 

 
<meta charset="utf-8" />
 
<?php
 
/**
 
 * Carregamos a classe, senão a coisa não rola!
 
 */
 
require_once 'libs/roteador.php';
 
 
 
/**
 
 * Criamos uma instancia para começarmos a brincar
 
 */
 
$roteador = new Roteador();
 
 
 
/**
 
 * Teste básico de funcionamento
 
 */
 
print 'Parametro 0: ' . $roteador->controlador() . ' ( controlador )';
 
print '<br />';
 
print 'Parametro 1: ' . $roteador->acao() . ' ( acao )';
 
 
 
/**
 
 * Entender o funcionamento da socilitacao via GET
 
 */
 
print '<pre>';
 
print_r($_GET);
 
print '</pre>';
 
 
 
/**
 
 * Teste de parametro isolado
 
 */
 
 
 
print 'Parametro 2: ' . $roteador->parametro(2);
 
print '<br />';
 
print 'Parametro 3: ' . $roteador->parametro(3);
 
print '<br />';
 
print 'Parametro 4: ' . $roteador->parametro(4);
 
print '<br />';
 
print 'Parametro 5: ' . $roteador->parametro(5);
 
print '<br />';
 
 

 

tenho na raiz um arquivo index.php com menus

 

e tenho mais dois arquivos chamados produtos.php e contato.php

 

no meu menu na index, quando eu clicar em produtos ir para a página produtos.php e resgatar o id do produto e quando clicar em contato ir para a página contato.php e assim para outras páginas que tiver que criar.

 

é isso que não estou conseguindo fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Comece definindo regras no htaccess para todas as situações, atualmente você tem esse coringa que "pega tudo", a menos que você queira viver da dar explode essa é a pior forma possível de resolver a questão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

pelo exemplo que peguei no site e postei aqui, eu sei que seu eu fizer o código abaixo, eu vou pegar todos os parâmetros passados na url.

 

 

 
print 'Parametro 2: ' . $roteador->parametro(2);
 
print '<br />';
 
print 'Parametro 3: ' . $roteador->parametro(3);
 
print '<br />';
 
print 'Parametro 4: ' . $roteador->parametro(4);
 
print '<br />';
 
print 'Parametro 5: ' . $roteador->parametro(5);
 
print '<br />';
 
 

 

o que eu não estou conseguindo fazer é passar esses parâmetros em um link.

 

exemplo:

 

<a href="produtos/1">produtos/</a>

 

isso não está funcionando. teria que me redirecionar para a página de produtos e lá eu faria o get da id 1.

 

entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

pelo exemplo que peguei no site e postei aqui, eu sei que seu eu fizer o código abaixo, eu vou pegar todos os parâmetros passados na url.

 

 


print 'Parametro 2: ' . $roteador->parametro(2);
 
print '<br />';
 
print 'Parametro 3: ' . $roteador->parametro(3);
 
print '<br />';
 
print 'Parametro 4: ' . $roteador->parametro(4);
 
print '<br />';
 
print 'Parametro 5: ' . $roteador->parametro(5);
 
print '<br />';
 
 

o que eu não estou conseguindo fazer é passar esses parâmetros em um link.

 

[color=#222222][font='Helvetica Neue', Arial, Verdana, sans-serif][size=3][background=#f7f7f7]exemplo:[/size][/font][/color][/background] 

<a href="produtos/1">produtos/</a>

 

isso não está funcionando. teria que me redirecionar para a página de produtos e lá eu faria o get da id 1.

 

entendeu?

 

 

Entendi sim, o que eu não entendo é a dificuldade em compreender a lógica de algo tão simples, então vamos ao mobral, um exemplo prático do eu disse, vamos supor que a URL seja a que você informou: produtos/1

 

O htaccess será:

RewriteEngine On
RewriteRule ^produtos\/([0-9]+)$ produtos.php?id_produto=$1 [L,QSA]

Quando você acessar URL produtos/QUALQUER_VALOR_NUMERICO, essa URL vai casar com o expressão regular que informei acima, isto fará com que o servidor "requisite" o arquivo produtos.php e passe para ele uma querystring com índice id_produto e o valor que estiver em "QUALQUER_VALOR_NUMERICO".

 

Na página produtos.php (especificada na expressão regular), você usa o $_GET['id_produto'] para resgatar o ID e faz a query, pronto. Isto você terá que fazer com todas as variações de URL que você montar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

e se o link passar mais parametros?

 

<a href="produtos/1/camiseta/azul">produtos</a>

 

RewriteRule ^produtos\/([0-9]+)$ produtos.php?id_produto=$1&titulo=$2&cor=$3 [L,QSA]

 

e não funcionou.

 

como seria?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simples, isso é uma expressão regular:

produtos\/([0-9]+)

Se você não entender como construir e como isso funciona, fica difícil.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até daria pra usar explode(), se quiser fugir das ERs. Mas terá que fazer vários if's para identificar se é /produtos/alguma_coisa, /pagina/alguma_coisa e por aí vai.

 

Por isso sugeri o sistema de rotas. Tornaria tudo isso ainda mais simples...

Compartilhar este post


Link para o post
Compartilhar em outros sites

o grande problema é o seguinte.

 

vai ter páginas que posso ter vários parâmetros passados na url.

 

então eu fiz isso: RewriteRule ^produtos\/([0-9A-z_-]+)\/([0-9A-z_-]+)$ produtos.php?dep=$1&produto=$2&cor=$3 [QSA,L,NC]

 

só que está pegando somente os dois primeiros parâmetros. o terceiro não pega.

 

e não sei pq.

Compartilhar este post


Link para o post
Compartilhar em outros sites

problema resolvido da seguinte forma:

 

.htaccess

 

 

 
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 
RewriteRule ^produtos(.*)$ produtos.php?r=$1 [QSA,L,NC]
RewriteRule ^contato(.*)$ contato.php?r=$1 [QSA,L,NC]
 

 

index.php

 

 

 
<a href="produtos/120/camiseta/azul/roupa/<?php echo url_amigavel("azul escuro")?>">produtos</a><br>
<a href="contato/mapas/seo">contato</a>
 
 
produtos.php
 
[code]
 

<?php
require_once 'libs/roteador.php';
$roteador = new Roteador();
 
print 'Parametro 0: ' . $roteador->controlador() . ' ( controlador )';
 
print '<br />';
 
print 'Parametro 1: ' . $roteador->acao() . ' ( acao )';
 
print '<br />';
 
//print '<pre>';
//print_r($_GET);
//print '</pre>';
 
 
print 'Parametro 0: ' . $roteador->parametro(0);
 
print '<br />';
 
print 'Parametro 1: ' . $roteador->parametro(1);
 
print '<br />';
 
 
print 'Parametro 2: ' . $roteador->parametro(2);
 
print '<br />';
 
print 'Parametro 3: ' . $roteador->parametro(3);
 
print '<br />';
 
print 'Parametro 4: ' . $roteador->parametro(4);
 
print '<br />';
 
print 'Parametro 5: ' . $roteador->parametro(5);
 
print '<br />';
 
 
echo "produtos-----------";
?>
 
contato.php
 
[code]
 

<?php
require_once 'libs/roteador.php';
$roteador = new Roteador();
 
echo "contato-----------------------<br>";
 
print 'Parametro 1: ' . $roteador->parametro(1);
print '<br />';
 
print 'Parametro 2: ' . $roteador->parametro(2);
print '<br />';
 
print 'Parametro 3: ' . $roteador->parametro(3);
print '<br />';
?>
 
[/code]


 
libs/roteador.php
 
[code]
 

<?php
 
// libs/Roteador.php
 
class Roteador
 
{
 
 
 
    protected $uri = array();
 
    protected $controlador;
 
    protected $acao;
 
 
 
    public function __construct()
 
    {
 
        $this->parametros();
 
 
 
    }
 
 
 
    public function parametros()
 
    {
 
        $this->uri = ( isset( $_GET['r'] ) )
 
            ? explode( '/', $_GET['r'] )
 
            : array('');
 
 
 
    }
 
 
 
    public function parametro( $key )
 
    {
 
        if( array_key_exists( $key, $this->uri ) )
 
        {
 
            return $this->uri[$key];
 
        } else {
 
            return false;
 
        }
 
    }
 
 
 
    public function controlador()
 
    {
 
        $this->controlador = ( $this->uri[0] == NULL )
 
            ? 'index'
 
            : $this->uri[0] ;
 
 
 
        return ( is_string( $this->controlador ) )
 
            ? $this->controlador
 
            : 'index';
 
 
 
    }
 
 
 
    public function acao()
 
    {
 
        $this->acao = (
 
                isset( $this->uri[1] )
 
                && strlen( $this->uri[1] ) != 0
 
                && is_string( $this->uri[1] )
 
            )
 
            ? $this->uri[1]
 
            : 'index' ;
 
 
 
        return $this->acao;
 
 
 
    }
 
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.