Всем привет! Тоже мучаюсь с ЧПУ для раздела новости. На каждую отдельную новость чпу работает, а вот раздел новости вот так - index.php?route=information/news Это если в меню нажимать, а если в хлебных крошках кликнуть, то /news, но ведёт на главную страницу =/ Вот Seo_url.php: PHP: <?phpclass ControllerCommonSeoUrl extends Controller {public function index() {// Add rewrite to url classif ($this->config->get('config_seo_url')) {$this->url->addRewrite($this);} // Decode URLif (isset($this->request->get['_route_'])) {$parts = explode('/', $this->request->get['_route_']); 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] == 'news_id') {$this->request->get['news_id'] = $url[1];}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];}} else {if ($part[0] == 'news') { $this->request->get['route'] = 'information/news';} else { $this->request->get['route'] = 'error/not_found';}}} 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['news_id'])) {$this->request->get['route'] = 'information/news';} elseif (isset($this->request->get['information_id'])) {$this->request->get['route'] = 'information/information';} if (isset($this->request->get['route'])) {return $this->forward($this->request->get['route']);}}} public function rewrite($link) {if ($this->config->get('config_seo_url')) {$url_data = parse_url(str_replace('&', '&', $link)); $url = ''; $data = array(); parse_str($url_data['query'], $data); if ($data['route'] == 'information/news' AND !isset($data['news_id'])) {$url .= '/' . 'news';unset($data['route']);} foreach ($data as $key => $value) {if (isset($data['route'])) {if (($data['route'] == 'information/news' && $key == 'news_id') || ($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) {$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) {$url .= '/' . $query->row['keyword'];}} unset($data[$key]);}}} if ($url) {unset($data['route']); $query = ''; if ($data) {foreach ($data as $key => $value) {$query .= '&' . $key . '=' . $value;} if ($query) {$query = '?' . trim($query, '&');}} return $url_data['scheme'] . '://' . $url_data['host'] . (isset($url_data['port']) ? ':' . $url_data['port'] : '') . str_replace('/index.php', '', $url_data['path']) . $url . $query;} else {return $link;}} else {return $link;}}}?>
Добрый вечер. Друзья помогите разобраться... у меня оперкарт 2.1 установлен модуль сео про и дедкоу сео..... ЧПУ на сайте работает но вот переходя в категорию производители пишет вот такой урл (/index.php?route=product/manufacturer) я заходил в бд делал запросы вот такого типа INSERT INTO oc_url_alias (query, keyword) VALUES ('account/wishlist', 'wishlist'); INSERT INTO oc_url_alias (query, keyword) VALUES ('account/account', 'my-account'); INSERT INTO oc_url_alias (query, keyword) VALUES ('checkout/cart', 'shopping-cart'); INSERT INTO oc_url_alias (query, keyword) VALUES ('checkout/checkout', 'checkout'); INSERT INTO oc_url_alias (query, keyword) VALUES ('account/login', 'login'); INSERT INTO oc_url_alias (query, keyword) VALUES ('account/logout', 'logout'); INSERT INTO oc_url_alias (query, keyword) VALUES ('account/order', 'order-history'); вроде как подобавлялось но ничего не изменилось что делать ????? спасите заблудшую душу(((((
Тоже проблема со стандартными новостями. Рубрика /news/ открывается. А новость уже /index.php?route=information/news/info&news_id=14 мой файл /catalog/controller/startup/seo_pro.php PHP: <?phpclass ControllerStartupSeoPro extends Controller { private $cache_data = null; public function __construct($registry) { parent::__construct($registry); $this->cache_data = $this->cache->get('seo_pro'); if (!$this->cache_data) { $query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias ORDER BY url_alias_id"); $this->cache_data = array(); foreach ($query->rows as $row) { if (isset($this->cache_data['keywords'][$row['keyword']])){ $this->cache_data['keywords'][$row['query']] = $this->cache_data['keywords'][$row['keyword']]; continue; } $this->cache_data['keywords'][$row['keyword']] = $row['query']; $this->cache_data['queries'][$row['query']] = $row['keyword']; } $this->cache->set('seo_pro', $this->cache_data); } } public function index() { // Add rewrite to url class if ($this->config->get('config_seo_url')) { $this->url->addRewrite($this); } else { return; } // Decode URL if (!isset($this->request->get['_route_'])) { $this->validate(); } else { $route_ = $route = $this->request->get['_route_']; unset($this->request->get['_route_']); $parts = explode('/', trim(utf8_strtolower($route), '/')); list($last_part) = explode('.', array_pop($parts)); array_push($parts, $last_part); $rows = array(); foreach ($parts as $keyword) { if (isset($this->cache_data['keywords'][$keyword])) { $rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]); } } if (isset($this->cache_data['keywords'][$route])){ $keyword = $route; $parts = array($keyword); $rows = array(array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword])); } if (count($rows) == sizeof($parts)) { $queries = array(); foreach ($rows as $row) { $queries[utf8_strtolower($row['keyword'])] = $row['query']; } reset($parts); foreach ($parts as $part) { if(!isset($queries[$part])) return false; $url = explode('=', $queries[$part], 2); if ($url[0] == 'category_id') { if (!isset($this->request->get['path'])) { $this->request->get['path'] = $url[1]; } else { $this->request->get['path'] .= '_' . $url[1]; } } elseif (count($url) > 1) { $this->request->get[$url[0]] = $url[1]; } } } else { $this->request->get['route'] = 'error/not_found'; } if (isset($this->request->get['product_id'])) { $this->request->get['route'] = 'product/product'; if (!isset($this->request->get['path'])) { $path = $this->getPathByProduct($this->request->get['product_id']); if ($path) $this->request->get['path'] = $path; } } 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'; } elseif(isset($this->cache_data['queries'][$route_])) { header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently'); $this->response->redirect($this->cache_data['queries'][$route_]); } else { if (isset($queries[$parts[0]])) { $this->request->get['route'] = $queries[$parts[0]]; } } $this->validate(); if (isset($this->request->get['route'])) { return new Action($this->request->get['route']); } } } public function rewrite($link) { if (!$this->config->get('config_seo_url')) return $link; $seo_url = ''; $component = parse_url(str_replace('&', '&', $link)); $data = array(); parse_str($component['query'], $data); $route = $data['route']; unset($data['route']); switch ($route) { case 'product/product': if (isset($data['product_id'])) { $tmp = $data; $data = array(); if ($this->config->get('config_seo_url_include_path')) { $data['path'] = $this->getPathByProduct($tmp['product_id']); if (!$data['path']) return $link; } $data['product_id'] = $tmp['product_id']; if (isset($tmp['tracking'])) { $data['tracking'] = $tmp['tracking']; } } break; case 'product/category': if (isset($data['path'])) { $category = explode('_', $data['path']); $category = end($category); $data['path'] = $this->getPathByCategory($category); if (!$data['path']) return $link; } break; case 'product/product/review': case 'information/information/info': return $link; break; default: break; } if ($component['scheme'] == 'https') { $link = $this->config->get('config_ssl'); } else { $link = $this->config->get('config_url'); } $link .= 'index.php?route=' . $route; if (count($data)) { $link .= '&' . urldecode(http_build_query($data, '', '&')); } $queries = array(); if(!in_array($route, array('product/search'))) { foreach($data as $key => $value) { switch($key) { case 'product_id': case 'manufacturer_id': case 'category_id': case 'information_id': case 'order_id': $queries[] = $key . '=' . $value; unset($data[$key]); $postfix = 1; break; case 'path': $categories = explode('_', $value); foreach($categories as $category) { $queries[] = 'category_id=' . $category; } unset($data[$key]); break; default: break; } } } if(empty($queries)) { $queries[] = $route; } $rows = array(); foreach($queries as $query) { if(isset($this->cache_data['queries'][$query])) { $rows[] = array('query' => $query, 'keyword' => $this->cache_data['queries'][$query]); } } if(count($rows) == count($queries)) { $aliases = array(); foreach($rows as $row) { $aliases[$row['query']] = $row['keyword']; } foreach($queries as $query) { $seo_url .= '/' . rawurlencode($aliases[$query]); } } if ($seo_url == '') return $link; $seo_url = trim($seo_url, '/'); if ($component['scheme'] == 'https') { $seo_url = $this->config->get('config_ssl') . $seo_url; } else { $seo_url = $this->config->get('config_url') . $seo_url; } if (isset($postfix)) { $seo_url .= trim($this->config->get('config_seo_url_postfix')); } else { $seo_url .= '/'; } if(substr($seo_url, -2) == '//') { $seo_url = substr($seo_url, 0, -1); } if (count($data)) { $seo_url .= '?' . urldecode(http_build_query($data, '', '&')); } return $seo_url; } private function getPathByProduct($product_id) { $product_id = (int)$product_id; if ($product_id < 1) return false; static $path = null; if (!isset($path)) { $path = $this->cache->get('product.seopath'); if (!isset($path)) $path = array(); } if (!isset($path[$product_id])) { $query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . $product_id . "' ORDER BY main_category DESC LIMIT 1"); $path[$product_id] = $this->getPathByCategory($query->num_rows ? (int)$query->row['category_id'] : 0); $this->cache->set('product.seopath', $path); } return $path[$product_id]; } private function getPathByCategory($category_id) { $category_id = (int)$category_id; if ($category_id < 1) return false; static $path = null; if (!isset($path)) { $path = $this->cache->get('category.seopath'); if (!isset($path)) $path = array(); } if (!isset($path[$category_id])) { $max_level = 10; $sql = "SELECT CONCAT_WS('_'"; for ($i = $max_level-1; $i >= 0; --$i) { $sql .= ",t$i.category_id"; } $sql .= ") AS path FROM " . DB_PREFIX . "category t0"; for ($i = 1; $i < $max_level; ++$i) { $sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)"; } $sql .= " WHERE t0.category_id = '" . $category_id . "'"; $query = $this->db->query($sql); $path[$category_id] = $query->num_rows ? $query->row['path'] : false; $this->cache->set('category.seopath', $path); } return $path[$category_id]; } private function validate() { if (isset($this->request->get['route']) && $this->request->get['route'] == 'error/not_found') { return; } if (ltrim($this->request->server['REQUEST_URI'], '/') =='sitemap.xml') { $this->request->get['route'] = 'feed/google_sitemap'; return; } if(empty($this->request->get['route'])) { $this->request->get['route'] = 'common/home'; } if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { return; } if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) { $config_ssl = substr($this->config->get('config_ssl'), 0, $this->strpos_offset('/', $this->config->get('config_ssl'), 3) + 1); $url = str_replace('&', '&', $config_ssl . ltrim($this->request->server['REQUEST_URI'], '/')); $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), true)); } else { $config_url = substr($this->config->get('config_url'), 0, $this->strpos_offset('/', $this->config->get('config_url'), 3) + 1); $url = str_replace('&', '&', $config_url . ltrim($this->request->server['REQUEST_URI'], '/')); $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), false)); } if (rawurldecode($url) != rawurldecode($seo)) { header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently'); $this->response->redirect($seo); } } private function strpos_offset($needle, $haystack, $occurrence) { // explode the haystack $arr = explode($needle, $haystack); // check the needle is not out of bounds switch($occurrence) { case $occurrence == 0: return false; case $occurrence > max(array_keys($arr)): return false; default: return strlen(implode($needle, array_slice($arr, 0, $occurrence))); } } private function getQueryString($exclude = array()) { if (!is_array($exclude)) { $exclude = array(); } return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude)))); } }?>
В ОК нет стандартных новостей! Это у вас какой-то модуль (возможно, впиленный в сборку). Если у вас работает /news, то вы не там смотрите, потому что в том файле, который вы выложили нет кода и для этого. Смотрите версию в кеше модификаторов, а заодно поищите и модификатор от модуля новостей, который вносит правку.