☆♕ CabrinhaSexy ♕☆ 738 Posted February 16, 2015 Ora boas meu pessoal :) Como prometido, e como até recebi bastante apoio vosso pelo primeiro tutorial Parte 1, venho vos fazer a parte 2 do tutorial, onde vai ser um bocado mais hardcore e onde voces teram de se esforçar um pouco mais mas prometo que vou tentar explicar da melhor forma :P Quem ainda não tiver visto a parte 1 está AQUI Agora mãos á obra :P Reescrevendo URLs que possuem parâmetros www.omeusite.pt/carros.php?id=2 (URL Atual) www.omeusite.pt/carros/honda/2/ (URL Amigavel) Neste caso temos dois termos importantes na URL: O termo marcado em amarelo identifica de qual URL estamos tratando, no nosso caso será a URL de exibição de um produto (um possível caso pra uma loja-virtual) ou que poderia ser o mesmo caso da exibição de uma notícia ou artigo num um site com esse tipo de conteúdo, etc etc, podes existir em milhares de coisas xD O termo marcado em verde é o ID do produto… Esse é o valor que será usado internamente pelo teu carros.php para exibir o produto correto. Entendam que esse mesmo termo ou seja o ID, precisa estar presente na nova URL pois é exatamente ele que será usado pelo seu arquivo “antigo” quando a URL for redirecionada. Não sei se disse isto no tutorial anterior se não disse digo agora, lembrem se que uma Url amigavel é simplesmente uma MÁSCARA para a vossa Url interna :P E já deves tar neste altura a perguntar te para ti próprio e a reparar que adicionamos um novo “termo” (valor) que é o nome do produto… Neste caso é o (honda) Isso é meramente ESTÉTICO. Isso apenas ajuda a melhorar a URL trazendo mais informações relevantes, aumentando a pontuação da página nos sistemas de busca e "dizendo" para o gajo ou a gaja xD ,o que ele verá ao clicar naquela URL mesmo antes de entrar nela :) Bem... Assumindo que voces estão a seguir o meu raciocinio, vamos prosseguir então para a prática, aprender realmente como se faz isto no código. Agora abrindo o nosso ficheiro .htaccess para reescrever a URL anterior (da página de contacto) e essa nova URL mais complexa, ficará assim: <IfModule mod_rewrite.c> RewriteEngine On # Página de contato RewriteRule ^contato/?$ /contato.php [NC,L] # Página de exibição de um produto RewriteRule ^carros/([a-z0-9-]+)/([0-9]+)/?$ /carros.php?id=$2&nome=$1 [NC]</IfModule> Agora começar as explicaçoes de cada um dos parametros 1 por 1 :PRewriteRule ^carros/([a-z0-9-]+)/([0-9]+)/?$ /carros.php?id=$2&nome=$1 [NC] Agora vamo-nos empenhar um pouco em entender expressões regulares!!! Tudo com atenção, senão levam tau tau xD O que é uma expressão regular ? As expressões regulares ou RegExp ou ER são formas de validares uma string (texto). Suponhamos que tu precisas verificar se uma string é composta apenas por letras minúsculas. Tu podes fazer isso com a expressão regular ^[a-z]+$, e entender o que isso significa: Como em todas as linguagens, ou bem.. Isto não é bem uma linguagem mas por exemplo, quando voces começam uma linha de codigo, ele tem sempre um caracter especial que indica o seu inicio, e outro quando indica o seu fim, então pronto aqui é a mesma coisa! O circunflexo ^ significa “o começo da string” e o cifrão $ significa “o fim da string”… Então, toda a ER que estiver entre o ^ e o $ precisa “validar” para toda a string, e não apenas uma parte dela. Entre eles temos [a-z]+, isso significa: um grupo de caracteres (delimitado pelos parenteses [ ]) composto por “qualquer letra minúscula” (a-z) que tenha no mínimo 1 caractere + A expressão regular a cima iria validar strings como planeta e casa mas iria invalidar strings como casal feliz, planeta1, CaSa ou pôr-do-sol pois essas strings não possuem apenas letras de a-z minúsculas, contem espaços, e outras numeros etc, para isso usamos outras validações, que já vao perceber asseguir. Outro exemplo que podemos usar é a expressão ^[0-9]{3,9}-(.*)$ que vamos esclarece-la agora: Começamos com [0-9]{3,9} que significa um grupo de números (de 0 a 9) que tenha entre 3 e 9 dígitos, ou seja: qualquer número de 3 até 9 digitos. Depois temos um hifen - normal, nada de especial aqui. E no final da ER temos (.*) que significa, qualquer caractere! Qualquer coisa! Eu explico: o ponto . é o caractere coringa das expressões regulares, e o asterisco * signficia “nenhuma, uma ou mais de uma ‘unidade’ do caractere anterior”. Por exemplo, não sei se voces teem conhecimentos em CSS, se teem, sabem que o seletor *{} engloba propriedades para o documento INTEIRO, aqui é a mesma coisa :P (Se não tem conhecimentos de CSS e se eu vos confundi ainda mais com este exemplo, esqueçam xD) Voltando ao assunto principal, sabendo disso, podemos entender que a expressão regular ^[0-9]{3,9}-(.*)$ valida strings como 014-a8!@cas, 11111-eahuaa e 123456789-, mas não valida strings como 0-a8!@cas, -eahuaa, 8928745614-abc e 89-abc pois as mesmas não começam com “números entre 3 e 9 digitos” [0-9]{3,9} Poderiamos modificar a expressão regular para: ^[0-9]{3,9}- e ela teria o mesmo comportamento pois só precisamos verificar o começo da string :D Se quiseres perceber melhor ainda o que está a ser explicado aqui recomendo que pares uma bocado para analisar o seguinte Guia de Expressões Regulares, é muito bom e vai te ajudar a entender melhor uma das sete maravilhas da Informática que é uma Expressão Regular <3 Agora que já vos dei a seca da teoria de e o que é uma expressão regular e como ela funciona vamos voltar a nossa URL Amigável : RewriteRule ^carros/([a-z0-9-]+)/([0-9]+)/?$ /carros.php?id=$2&nome=$1 [NC] Primeiro parte : Na primeira parte em amarelos temos ^carros/([a-z0-9-]+)/([0-9]+)/?$ e o que isto significa ? Vamos lá dividir isto em 3 partes como já aprendemos até agora. ^carros/ isto significa que a URL precisa de começar com carros/ /([a-z0-9-]+)/ – A expressão regular ([a-z0-9-]+) significa “no mínimo um(a) + letra minúscula a-z OU letra maiúscula A-Z OU número 0-9 OU um hífen -” /([0-9]+)/?$ – E por fim temos ([0-9]+) que signfica “no minimo + um número 0-9” seguido de uma barra opcional /? e o fim da URL Isso tudo significa que, com a primeira parte, validamos strings como /motas/suzuki/2/, /carros/honda/89/ e /produtos/cachecol-rosa-da-2a-africa-do-sul/666/ e invalidamos strings como /produtos/palhaço/a/, /produtos/camisa/ ou /produtos/camisa fixe/187a/ Segunda Parte: Na segunda parte em verde temos /carros.php?id=$2&nome=$1 que vamos explicar agora o que significa Significa que iremos passar os valores encontrados na primeira parte para uma nova URL interna, ou seja, chamaremos o arquivo /carros.php e passaremos dois parâmetros via GET para ele: Temos o $2 o no parâmetro id, esse “cifrao dois” significa a segunda “variável” encontrada na URL, que nesse caso é a parte ([0+9]+) da expressão regular, que conterá o ID do produto. E temos o $1 no parâmetro nome, esse “sifrao um” significa a primeira “variável” encontrada na URL, que nesse caso é a parte ([a-z 0-9-]+) da expressão regular, que conterá o nome do carro! :D Com isso tudo, ao chamar a URL /carros/honda/2/ o Apache irá, malandramente e internamente, direcionar a requisição para o caminho /carros.php?id=2&nome=honda que como vos disse lá no inicio do post é a nossa url amigavel, mas "desmascarada", ou seja ela continua a existir mas não é mostrada :P Ve se entendes entao que os valores (2 e honda) foram passados para o “antigo” arquivo, cada um em seu devido lugar… Com isso, ao executar o arquivo /carros.php vais ter acesso aos dois valores que foram passados na URL Amigável utilizando a super-global $_GET: <?phpecho 'ID do produto: ' . $_GET['id']; // 2echo '<br />';echo 'Nome (slug) do produto: ' . $_GET['nome']; // camiseta-azul?> Melhor que isto é impossivel u_u E por ultimo na terceira parte: Na terceira parte, em azul claro, temos [NC], que ja foi explicado antes e significa “No Case” ou “Sem distinção de minúsculas ou maiúsculas”. :P Bem e é isto pessoal!! Só para reforçar para quem ainda não pegou a essência da coisa: Na primeira parte temos uma expressão regular que, se ela validar a URL que o visitante está acessando, a requisição vai ser redirecionada para o caminho especificado na segunda parte. Mais exemplos de URLs Amigáveis Vamos ver mais alguns exemplos que podemos colocar no nosso .htaccess e o entendimento de cada uma das regras, fica TUA sua conta: <IfModule mod_rewrite.c> RewriteEngine On # Página de contato RewriteRule ^contato/?$ /contato.php [NC,L] # Página de exibição de um produto RewriteRule ^produtos/([a-z0-9-]+)/([0-9]+)/?$ /produtos.php?id=$2&nome=$1 [NC] # Página de exibição de uma categoria de livros RewriteRule ^livro/([a-z0-9-]+)/?$ /livros.php?categoria=$1 [NC,L] # Página de exibição de um artigo com a data na URL RewriteRule ^artigo/([0-9]{4})/([0-9]{2})/([0-9]{2})/([a-z0-9-]+)/([0-9]+)/?$ /artigo.php?id=$5&nome=$4&data=$1-$2-$3 [NC]</IfModule> E pronto pessoal, espero que voces tenham gostado, desta segunda parte do tutorial, e que vos seja util em algo, nos vossos futuros projetos para que eles tenham melhor apresentação de conteudo, melhores resultados nos motores de busca e e e e .... BUES CENAS xD Vá pessoal Cumprimentos <3 6 Shad0w, zWooty, morfo2 and 3 others reacted to this Share this post Link to post Share on other sites
Shad0w 347 Posted February 16, 2015 Ora boas meu pessoal :) Como prometido, e como até recebi bastante apoio vosso pelo primeiro tutorial Parte 1, venho vos fazer a parte 2 do tutorial, onde vai ser um bocado mais hardcore e onde voces teram de se esforçar um pouco mais mas prometo que vou tentar explicar da melhor forma :P Quem ainda não tiver visto a parte 1 está AQUI Agora mãos á obra :P Reescrevendo URLs que possuem parâmetros www.omeusite.pt/carros.php?id=2 (URL Atual) www.omeusite.pt/carros/honda/2/ (URL Amigavel) Neste caso temos dois termos importantes na URL: O termo marcado em amarelo identifica de qual URL estamos tratando, no nosso caso será a URL de exibição de um produto (um possível caso pra uma loja-virtual) ou que poderia ser o mesmo caso da exibição de uma notícia ou artigo num um site com esse tipo de conteúdo, etc etc, podes existir em milhares de coisas xD O termo marcado em verde é o ID do produto… Esse é o valor que será usado internamente pelo teu carros.php para exibir o produto correto. Entendam que esse mesmo termo ou seja o ID, precisa estar presente na nova URL pois é exatamente ele que será usado pelo seu arquivo “antigo” quando a URL for redirecionada. Não sei se disse isto no tutorial anterior se não disse digo agora, lembrem se que uma Url amigavel é simplesmente uma MÁSCARA para a vossa Url interna :P E já deves tar neste altura a perguntar te para ti próprio e a reparar que adicionamos um novo “termo” (valor) que é o nome do produto… Neste caso é o (honda) Isso é meramente ESTÉTICO. Isso apenas ajuda a melhorar a URL trazendo mais informações relevantes, aumentando a pontuação da página nos sistemas de busca e "dizendo" para o gajo ou a gaja xD ,o que ele verá ao clicar naquela URL mesmo antes de entrar nela :) Bem... Assumindo que voces estão a seguir o meu raciocinio, vamos prosseguir então para a prática, aprender realmente como se faz isto no código. Agora abrindo o nosso ficheiro .htaccess para reescrever a URL anterior (da página de contacto) e essa nova URL mais complexa, ficará assim: <IfModule mod_rewrite.c> RewriteEngine On # Página de contato RewriteRule ^contato/?$ /contato.php [NC,L] # Página de exibição de um produto RewriteRule ^carros/([a-z0-9-]+)/([0-9]+)/?$ /carros.php?id=$2&nome=$1 [NC]</IfModule>Agora começar as explicaçoes de cada um dos parametros 1 por 1 :PRewriteRule ^carros/([a-z0-9-]+)/([0-9]+)/?$ /carros.php?id=$2&nome=$1 [NC] Agora vamo-nos empenhar um pouco em entender expressões regulares!!! Tudo com atenção, senão levam tau tau xD O que é uma expressão regular ? As expressões regulares ou RegExp ou ER são formas de validares uma string (texto). Suponhamos que tu precisas verificar se uma string é composta apenas por letras minúsculas. Tu podes fazer isso com a expressão regular ^[a-z]+$, e entender o que isso significa: Como em todas as linguagens, ou bem.. Isto não é bem uma linguagem mas por exemplo, quando voces começam uma linha de codigo, ele tem sempre um caracter especial que indica o seu inicio, e outro quando indica o seu fim, então pronto aqui é a mesma coisa! O circunflexo ^ significa “o começo da string” e o cifrão $ significa “o fim da string”… Então, toda a ER que estiver entre o ^ e o $ precisa “validar” para toda a string, e não apenas uma parte dela. Entre eles temos [a-z]+, isso significa: um grupo de caracteres (delimitado pelos parenteses [ ]) composto por “qualquer letra minúscula” (a-z) que tenha no mínimo 1 caractere + A expressão regular a cima iria validar strings como planeta e casa mas iria invalidar strings como casal feliz, planeta1, CaSa ou pôr-do-sol pois essas strings não possuem apenas letras de a-z minúsculas, contem espaços, e outras numeros etc, para isso usamos outras validações, que já vao perceber asseguir. Outro exemplo que podemos usar é a expressão ^[0-9]{3,9}-(.*)$ que vamos esclarece-la agora: Começamos com [0-9]{3,9} que significa um grupo de números (de 0 a 9) que tenha entre 3 e 9 dígitos, ou seja: qualquer número de 3 até 9 digitos. Depois temos um hifen - normal, nada de especial aqui. E no final da ER temos (.*) que significa, qualquer caractere! Qualquer coisa! Eu explico: o ponto . é o caractere coringa das expressões regulares, e o asterisco * signficia “nenhuma, uma ou mais de uma ‘unidade’ do caractere anterior”. Por exemplo, não sei se voces teem conhecimentos em CSS, se teem, sabem que o seletor *{} engloba propriedades para o documento INTEIRO, aqui é a mesma coisa :P (Se não tem conhecimentos de CSS e se eu vos confundi ainda mais com este exemplo, esqueçam xD) Voltando ao assunto principal, sabendo disso, podemos entender que a expressão regular ^[0-9]{3,9}-(.*)$ valida strings como 014-a8!@cas, 11111-eahuaa e 123456789-, mas não valida strings como 0-a8!@cas, -eahuaa, 8928745614-abc e 89-abc pois as mesmas não começam com “números entre 3 e 9 digitos” [0-9]{3,9} Poderiamos modificar a expressão regular para: ^[0-9]{3,9}- e ela teria o mesmo comportamento pois só precisamos verificar o começo da string :D Se quiseres perceber melhor ainda o que está a ser explicado aqui recomendo que pares uma bocado para analisar o seguinte Guia de Expressões Regulares, é muito bom e vai te ajudar a entender melhor uma das sete maravilhas da Informática que é uma Expressão Regular <3 Agora que já vos dei a seca da teoria de e o que é uma expressão regular e como ela funciona vamos voltar a nossa URL Amigável : RewriteRule ^carros/([a-z0-9-]+)/([0-9]+)/?$ /carros.php?id=$2&nome=$1 [NC] Primeiro parte : Na primeira parte em amarelos temos ^carros/([a-z0-9-]+)/([0-9]+)/?$ e o que isto significa ? Vamos lá dividir isto em 3 partes como já aprendemos até agora. ^carros/ isto significa que a URL precisa de começar com carros/ /([a-z0-9-]+)/ – A expressão regular ([a-z0-9-]+) significa “no mínimo um(a) + letra minúscula a-z OU letra maiúscula A-Z OU número 0-9 OU um hífen -” /([0-9]+)/?$ – E por fim temos ([0-9]+) que signfica “no minimo + um número 0-9” seguido de uma barra opcional /? e o fim da URL Isso tudo significa que, com a primeira parte, validamos strings como /motas/suzuki/2/, /carros/honda/89/ e /produtos/cachecol-rosa-da-2a-africa-do-sul/666/ e invalidamos strings como /produtos/palhaço/a/, /produtos/camisa/ ou /produtos/camisa fixe/187a/ Segunda Parte: Na segunda parte em verde temos /carros.php?id=$2&nome=$1 que vamos explicar agora o que significa Significa que iremos passar os valores encontrados na primeira parte para uma nova URL interna, ou seja, chamaremos o arquivo /carros.php e passaremos dois parâmetros via GET para ele: Temos o $2 o no parâmetro id, esse “cifrao dois” significa a segunda “variável” encontrada na URL, que nesse caso é a parte ([0+9]+) da expressão regular, que conterá o ID do produto. E temos o $1 no parâmetro nome, esse “sifrao um” significa a primeira “variável” encontrada na URL, que nesse caso é a parte ([a-z 0-9-]+) da expressão regular, que conterá o nome do carro! :D Com isso tudo, ao chamar a URL /carros/honda/2/ o Apache irá, malandramente e internamente, direcionar a requisição para o caminho /carros.php?id=2&nome=honda que como vos disse lá no inicio do post é a nossa url amigavel, mas "desmascarada", ou seja ela continua a existir mas não é mostrada :P Ve se entendes entao que os valores (2 e honda) foram passados para o “antigo” arquivo, cada um em seu devido lugar… Com isso, ao executar o arquivo /carros.php vais ter acesso aos dois valores que foram passados na URL Amigável utilizando a super-global $_GET: <?phpecho 'ID do produto: ' . $_GET['id']; // 2echo '<br />';echo 'Nome (slug) do produto: ' . $_GET['nome']; // camiseta-azul?> Melhor que isto é impossivel u_u E por ultimo na terceira parte: Na terceira parte, em azul claro, temos [NC], que ja foi explicado antes e significa “No Case” ou “Sem distinção de minúsculas ou maiúsculas”. :P Bem e é isto pessoal!! Só para reforçar para quem ainda não pegou a essência da coisa: Na primeira parte temos uma expressão regular que, se ela validar a URL que o visitante está acessando, a requisição vai ser redirecionada para o caminho especificado na segunda parte. Mais exemplos de URLs Amigáveis Vamos ver mais alguns exemplos que podemos colocar no nosso .htaccess e o entendimento de cada uma das regras, fica TUA sua conta: <IfModule mod_rewrite.c> RewriteEngine On # Página de contato RewriteRule ^contato/?$ /contato.php [NC,L] # Página de exibição de um produto RewriteRule ^produtos/([a-z0-9-]+)/([0-9]+)/?$ /produtos.php?id=$2&nome=$1 [NC] # Página de exibição de uma categoria de livros RewriteRule ^livro/([a-z0-9-]+)/?$ /livros.php?categoria=$1 [NC,L] # Página de exibição de um artigo com a data na URL RewriteRule ^artigo/([0-9]{4})/([0-9]{2})/([0-9]{2})/([a-z0-9-]+)/([0-9]+)/?$ /artigo.php?id=$5&nome=$4&data=$1-$2-$3 [NC]</IfModule> E pronto pessoal, espero que voces tenham gostado, desta segunda parte do tutorial, e que vos seja util em algo, nos vossos futuros projetos para que eles tenham melhor apresentação de conteudo, melhores resultados nos motores de busca e e e e .... BUES CENAS xD Vá pessoal Cumprimentos <3 Ora ai está um tutorial de se louvar... Logo vi que teve de ser postado pelo meu gayzinho :like: Share this post Link to post Share on other sites
☆♕ CabrinhaSexy ♕☆ 738 Posted February 16, 2015 Obrigado man :P 1 Shad0w reacted to this Share this post Link to post Share on other sites