106 lines
2.2 KiB
PHP
106 lines
2.2 KiB
PHP
<?php
|
|
namespace Opencart\Catalog\Controller\Startup;
|
|
/**
|
|
* Class SeoUrl
|
|
*
|
|
* @package Opencart\Catalog\Controller\Startup
|
|
*/
|
|
class SeoUrl extends \Opencart\System\Engine\Controller {
|
|
/**
|
|
* @return void
|
|
*/
|
|
public function index(): void {
|
|
// Add rewrite to URL class
|
|
if ($this->config->get('config_seo_url')) {
|
|
$this->url->addRewrite($this);
|
|
|
|
$this->load->model('design/seo_url');
|
|
|
|
// Decode URL
|
|
if (isset($this->request->get['_route_'])) {
|
|
$parts = explode('/', $this->request->get['_route_']);
|
|
|
|
// remove any empty arrays from trailing
|
|
if (oc_strlen(end($parts)) == 0) {
|
|
array_pop($parts);
|
|
}
|
|
|
|
foreach ($parts as $part) {
|
|
$seo_url_info = $this->model_design_seo_url->getSeoUrlByKeyword($part);
|
|
|
|
if ($seo_url_info) {
|
|
$this->request->get[$seo_url_info['key']] = html_entity_decode($seo_url_info['value'], ENT_QUOTES, 'UTF-8');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param string $link
|
|
*
|
|
* @return string
|
|
*/
|
|
public function rewrite(string $link): string {
|
|
$url_info = parse_url(str_replace('&', '&', $link));
|
|
|
|
// Build the url
|
|
$url = '';
|
|
|
|
if ($url_info['scheme']) {
|
|
$url .= $url_info['scheme'];
|
|
}
|
|
|
|
$url .= '://';
|
|
|
|
if ($url_info['host']) {
|
|
$url .= $url_info['host'];
|
|
}
|
|
|
|
if (isset($url_info['port'])) {
|
|
$url .= ':' . $url_info['port'];
|
|
}
|
|
|
|
parse_str($url_info['query'], $query);
|
|
|
|
// Start changing the URL query into a path
|
|
$paths = [];
|
|
|
|
// Parse the query into its separate parts
|
|
$parts = explode('&', $url_info['query']);
|
|
|
|
foreach ($parts as $part) {
|
|
[$key, $value] = explode('=', $part);
|
|
|
|
$result = $this->model_design_seo_url->getSeoUrlByKeyValue((string)$key, (string)$value);
|
|
|
|
if ($result) {
|
|
$paths[] = $result;
|
|
|
|
unset($query[$key]);
|
|
}
|
|
}
|
|
|
|
$sort_order = [];
|
|
|
|
foreach ($paths as $key => $value) {
|
|
$sort_order[$key] = $value['sort_order'];
|
|
}
|
|
|
|
array_multisort($sort_order, SORT_ASC, $paths);
|
|
|
|
// Build the path
|
|
$url .= str_replace('/index.php', '', $url_info['path']);
|
|
|
|
foreach ($paths as $result) {
|
|
$url .= '/' . $result['keyword'];
|
|
}
|
|
|
|
// Rebuild the URL query
|
|
if ($query) {
|
|
$url .= '?' . str_replace(['%2F'], ['/'], http_build_query($query));
|
|
}
|
|
|
|
return $url;
|
|
}
|
|
} |