Portuguese (Português) translation by Erick Patrick (you can also view the original English article)
Nesse tutorial, veremos os por menores de URLs customizáveis e amigáveis. É um aspecto importante que você deve levar em conta ao desenvolver módulos customizados, já que afeta a posição do site em motores de busca.
Usaremos a versão mais recente do OpenCart, então tenha certeza de tê-la instalada para pode acompanhar.
O Que Faremos—Em Resumo
Eis um resumo dos passos que precisaremos para conseguir URLs customizadas no OpenCart:
- Primeiro, precisaremos entender como funciona na base do OpenCart.
- Passaremos pelas mudanças requeridas nos arquivos base.
- Também veremos, rapidamente, as consultas SQL para inserir nossos mapeamentos de URL customizados.
- Cobriremos o uso de funções embutidas de reescrita de URLs.
Assim, isso é o que faremos. Movamos para o primeiro tópico.
O Mapeamento de URL na Base de Dados
Primeiro, é importante entender como URLs amigáveis funcionam no código base do OpenCart.
Vá em frente e explore os registros na tabela "url_alias" do MySQL, usando o phpMyAdmin ou algo similar. Você verá mapas como esse.
product_id=48 ipod-classic category_id=20 desktops manufacturer_id=8 apple information_id=6 delivery
Há duas colunas importantes a se notar, aqui. A primeira é a coluna query, que guarda o caminho atual, e a outra é a keyword, que guarda o apelido amigável para aquela URL.
Como pode ver, há mapas para entidades diferentes, como produto, categoria, informação e fabricante. Toda vez que qualquer entidade for salva no back-end do OpenCart, um registro assocido é adicionado a essa tabela.
No front-end, toda vez que o usuário acessa a URL, o OpenCart encontra o mapeamento relacionado na tabela "url_alias". Dessa forma, a entidade atual é mapeada para a URL amigável.
Abra o arquivo catalog/controller/common/seo_url.php
e exploremos o trecho de código a seguir do método index
.
public function index() { // Add rewrite to url class if ($this->config->get('config_seo_url')) { $this->url->addRewrite($this); } // Decode URL if (isset($this->request->get['_route_'])) { $parts = explode('/', $this->request->get['_route_']); // remove any empty arrays from trailing if (utf8_strlen(end($parts)) == 0) { array_pop($parts); } foreach ($parts as $part) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'"); if ($query->num_rows) { $url = explode('=', $query->row['query']); if ($url[0] == 'product_id') { $this->request->get['product_id'] = $url[1]; } if ($url[0] == 'category_id') { if (!isset($this->request->get['path'])) { $this->request->get['path'] = $url[1]; } else { $this->request->get['path'] .= '_' . $url[1]; } } if ($url[0] == 'manufacturer_id') { $this->request->get['manufacturer_id'] = $url[1]; } if ($url[0] == 'information_id') { $this->request->get['information_id'] = $url[1]; } if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') { $this->request->get['route'] = $query->row['query']; } } else { $this->request->get['route'] = 'error/not_found'; break; } } if (!isset($this->request->get['route'])) { if (isset($this->request->get['product_id'])) { $this->request->get['route'] = 'product/product'; } elseif (isset($this->request->get['path'])) { $this->request->get['route'] = 'product/category'; } elseif (isset($this->request->get['manufacturer_id'])) { $this->request->get['route'] = 'product/manufacturer/info'; } elseif (isset($this->request->get['information_id'])) { $this->request->get['route'] = 'information/information'; } } if (isset($this->request->get['route'])) { return new Action($this->request->get['route']); } } }
Como pode ver, estamos buscando o registro relacionado na tabela "url_alias". Após isso, o parâmetro da consulta é analisado e um caminho interno associado é retornado.
É assim que funciona no código base. Infelizmente, funciona apenas para URLs base—para URLs customizadas, precisamos alterar o código base. É isso que faremos na próxima parte.
As Mudanças no Código Base
Vá e abra o arquivo catalog/controller/common/seo_url.php
e substitua o método rewrite
pelo código abaixo.
public function rewrite($link) { $url_info = parse_url(str_replace('&', '&', $link)); $url = ''; $data = array(); parse_str($url_info['query'], $data); foreach ($data as $key => $value) { if (isset($data['route'])) { if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } elseif ($key == 'path') { $categories = explode('_', $value); foreach ($categories as $category) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; } else { $url = ''; break; } } unset($data[$key]); // OUR CUSTOM CODE } else { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $data['route'] . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; } else { $url = ''; break; } } // OUR CUSTOM CODE } } if ($url) { unset($data['route']); $query = ''; if ($data) { foreach ($data as $key => $value) { $query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value); } if ($query) { $query = '?' . str_replace('&', '&', trim($query, '&')); } } return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query; } else { return $link; } }
O método rewrite
é usado para converter uma URL interna em uma URL amigável. Mas, apenas para URLs internas. Assim, precisamos de código extra para fazê-lo funcionar para módulos customizados também. Em nossa mudança, tivemos de prover o último else que carrega o mapeamento para módulos customizados. Ainda não adicionamos nosso mapeamento customizado, então, façamos isso.
Embora tenhamos modificado o código base diretamente, fizemos apenas como exemplo. Você deve usar OCMOD para alterá-lo sem modificar seus arquivos diretamente.
Adicione Registros MySQL
Nessa parte, adicionaremos nosso mapa de URL amigáveis para nosso módulo. Novamente, SQL puro para exemplificar—você pode obter esse efeito, usando os scripts de instalação de módulo.
INSERT INTO `url_alias` (`query`, `keyword`) VALUES ('custom/custom', 'custom-rewrite');
Vá em frente e execute-o na base de dados do OpenCart.
Na próxima parte, a final, veremos como usar a função auxiliar para criar links/URLs amigáveis.
Como Funciona
Crie o arquivo catalog/controller/custom/custom.php
com o conteúdo a seguir.
<?php class ControllerCustomCustom extends Controller { function index() { $data['customlink'] = $this->url->link('custom/custom'); $this->response->setOutput('<a href="'.$data['customlink'].'">Custom URL Rewrite Link</a>'); } }
Agora, no front-end, abra a URL http://www.yourstore.com/index.php?route=custom/custom.
Sim, uma tela em branco com apenas um link, que é, exatamente, o que queríamos. O importante a notar aqui é a URL daquele link—é uma URL amigável! Clique nele e ele carregara a mesma página, já que adicionamos esse mapeamento na tabela "url_alias".
Assim, esse é o conceito completo, demonstrado bem simples. Você pode extendê-lo e criar um modelo para inserir links amigáveis para seu módulo customizado.
Conclusão
Hoje, discutimos um tópico importante no OpenCart—URLs amigáveis customizadas. Usamos uma abordagem bem simples para explicá-lo e espero que tenha sido útil para você.
Se estiver procurando outras ferramentas, utilitários, extensões e mais para OpenCart, de modo que possa usar em seus próprios projetos ou apenas para aprender mais, não esqueça de ver o que tem na loja oficial.
Sinta-se a vontade para publicar dúvidas e sugestões usando a seção de comentários abaixo.
Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post