Перейти к содержанию
yandex-lexa

[БАГ] *Fix Проблема в ЧПУ: лишний контент в категориях

Рекомендуемые сообщения

Версия магазина: ОС 1.4.8

Изменений вносилось очень много )

Хостинг у хостера.

Проблема (Баг)

Все еще началось с этого

Создал категории

категория/подкатегория 1/производитель/

категория/подкатегория 2/производитель/

категория/подкатегория 3/производитель/

Последние 2 создал, пожже на пару дней, но сути это не меняет дела, потому что ID у них всеравно будет выше первой

Добавляем товары в категория/подкатегория 1/производитель/ и получаем товары сразу в 3х подкатегориях

категория/подкатегория 1/производитель/товары

категория/подкатегория 2/производитель/товары

категория/подкатегория 3/производитель/товары

потому что у них псевдоним (производитель) одинаковый, ко всему по схеме работы СЕО в ОС мы можем получить доступ к товарам и как

категория/подкатегория 1/производитель/товары

категория/подкатегория 1/товары

подкатегория 1/товары

категория/товары

Ну и все различные вариации этой комбинации.

Добавляем товары в категория/подкатегория 2/производитель/ и получаем ...

А ничего мы не получаем. В модуле последние, товары есть, ссылки рабочие, а вот зайдя в категорию товара нет, только тот товар что мы добавили в подкатегория 1 (потому что у них общий производитель)

Так же происходит с 3й подкатегорией, ну и по ходу так далее.

Если добавить товар из подкатегории 2 (он должен быть в ней) в подкатегорию 1 или дополнительно к ней добавить 1ю подкатегорию, соответственно он появится опять в 3х местах.

З.Ы. В общем я постарался максимально детально выложить проблему. Если надо что то разъяснить спрашивайте. Просто хочу этот вопрос решить, муляет, понимаю что есть менее радикальные решения, типа как то менять имя производителя и будет мне счастье. Но как то это не хочется делать т.к. это же имя производителя и оно должно и так работать. Если кому то этот вопрос тоже интересен и есть возможность протестить у себя в магазине, буду благодарен.

Интуитивно догадываюсь что все решение в:

/catalog/controller/common/seo_url.php

l/catalog/model/tool/seo_url.php

В проверке формирования адреса, что тут можно решить сразу обе проблемы. Но PHP я не силен, по этому решить этот вопрос сил и знаний у меня не хватит.

Давайте решим этот трабл вместе :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по моему это баг не опенкарта, а баг пользователя, который пытается присвоить 1 псевдоним 2м или более разным категориямстатьямтоварампроизводителям. А решение тут наверно такое: сделать поле keywords в таблице url_alias уникальным, чтоб даже если сильно захотелось сделать одинаковый псевдоним опенкарт бы не дал сделать этого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему это баг пользователя? Как это так, если один производитель не может быть в двух разных категориях товара? Сами рассудите. Если к примеру кто то будет продавать технику и его будут такие бренды как самсунг ЛДЖи т.д. ведь это бренды которые грубо говоря производят все, начиная от батареек заканчивая процессорами и микроконтроллерами. И что людям делать, как разделять товар?Но это лирика. Можно подробнее о возможном решении на счет уникальности keywords в таблице url_alias ?Каким образом его сделать уникальным? Сделать auto_increment не для url_alias_id а для url_alias? Или добавить к PRIMARY еще и keywords?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему это баг пользователя? Как это так, если один производитель не может быть в двух разных категориях товара? Сами рассудите. Если к примеру кто то будет продавать технику и его будут такие бренды как самсунг ЛДЖи т.д. ведь это бренды которые грубо говоря производят все, начиная от батареек заканчивая процессорами и микроконтроллерами. И что людям делать, как разделять товар?

делайте одинаковое название, но разные псевдонимы

Но это лирика. Можно подробнее о возможном решении на счет уникальности keywords в таблице url_alias ?Каким образом его сделать уникальным? Сделать auto_increment не для url_alias_id а для url_alias? Или добавить к PRIMARY еще и keywords?

вы мне сейчас мозг просто разорвали.Лучше пока не заходите в СУБД, пока не ознакомитесь с основными принципами базы данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

делайте одинаковое название, но разные псевдонимы

Это не решение. Если есть производитель к примеру Samsung, то он должен им быть во всех категориях, на то они ЧПУСпасибо за помощь :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И так, предлагаю решение данной проблемы, т.к. решение использовать разные псевдонимы это не решение.

Решение

В файле /catalog/controller/common/seo_url.php

меняем

public function index() {		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] == '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];						}					}
на

public function index() {		if (isset($this->request->get['_route_'])) {			$parts = explode('/', $this->request->get['_route_']);			$parent_category_id = 0;						foreach ($parts as $part) {				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");											if ($query->num_rows) {					$row = $query->row;										if($query->num_rows > 1) {												foreach($query->rows as $cur_row) {							$url = explode('=', $cur_row['query']);							if ($url[0] == 'category_id') {								$query_category_id = $this->db->query("SELECT * FROM " . DB_PREFIX . "category WHERE parent_id = " . $parent_category_id . " AND category_id = " . $url[1]);																if($query_category_id->num_rows) {									$row = $cur_row;									break;								}							} else if($url[0] == 'manufacturer_id') {								$row = $cur_row;							}						}											}									$url = explode('=', $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];						}						$parent_category_id = $url[1];					}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.