Не работает ЧПУ в новостях

Тема в разделе "OpenCart", создана пользователем kuklev, 13 май 2013.

  1. Ваган

    Ваган

    Регистрация:
    8 ноя 2013
    Сообщения:
    37
    Симпатии:
    1
    Как то так чтоли, попробуйте но сделайте резервную копию старого seo_url

     
  2. Brabus

    Brabus

    Регистрация:
    13 янв 2015
    Сообщения:
    12
    Симпатии:
    0
    Всем привет! Тоже мучаюсь с ЧПУ для раздела новости.
    На каждую отдельную новость чпу работает, а вот раздел новости вот так - index.php?route=information/news
    Это если в меню нажимать, а если в хлебных крошках кликнуть, то /news, но ведёт на главную страницу =/
    Вот Seo_url.php:
    PHP:
    <?php
    class ControllerCommonSeoUrl extends Controller {
    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_']);
     
    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('&amp;''&'$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;
    }
    }
    }
    ?> 
     
  3. Dima80

    Dima80

    Регистрация:
    15 дек 2016
    Сообщения:
    1
    Симпатии:
    0
    Добрый вечер. Друзья помогите разобраться... у меня оперкарт 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');
    вроде как подобавлялось но ничего не изменилось что делать ????? спасите заблудшую душу(((((
     
  4. stydent33

    stydent33

    Регистрация:
    29 июн 2016
    Сообщения:
    1
    Симпатии:
    0
    Тоже проблема со стандартными новостями.
    Рубрика /news/ открывается.
    А новость уже /index.php?route=information/news/info&news_id=14

    мой файл /catalog/controller/startup/seo_pro.php


    PHP:
    <?php
    class 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('&amp;''&'$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 .= '&amp;' urldecode(http_build_query($data'''&amp;'));
            }

            
    $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_url0, -1);
            }

            if (
    count($data)) {
                
    $seo_url .= '?' urldecode(http_build_query($data'''&amp;'));
            }

            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('&amp;''&'$config_ssl ltrim($this->request->server['REQUEST_URI'], '/'));
                
    $seo str_replace('&amp;''&'$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('&amp;''&'$config_url ltrim($this->request->server['REQUEST_URI'], '/'));
                
    $seo str_replace('&amp;''&'$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($needlearray_slice($arr0$occurrence)));
            }
        }

        private function 
    getQueryString($exclude = array()) {
            if (!
    is_array($exclude)) {
                
    $exclude = array();
                }

            return 
    urldecode(http_build_query(array_diff_key($this->request->getarray_flip($exclude))));
            }
        }
    ?>
     
  5. Ваган

    Ваган

    Регистрация:
    8 ноя 2013
    Сообщения:
    37
    Симпатии:
    1
    Кэш чистили?
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    В ОК нет стандартных новостей! Это у вас какой-то модуль (возможно, впиленный в сборку).

    Если у вас работает /news, то вы не там смотрите, потому что в том файле, который вы выложили нет кода и для этого. Смотрите версию в кеше модификаторов, а заодно поищите и модификатор от модуля новостей, который вносит правку.
     
    Baco нравится это.