villord

"Хлебные крошки" при переходе с модуля

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

villord    13

Здравствуйте, понимаю что эта тема уже не раз поднималась на форуме, но перечитав все темы так и не нашел решение проблемы.

Собственно проблема в том что при переходе из модуля "Последние добавленные" получаю путь вида:

Главная->Товар

А хотелось бы как и при переходе из меню путь типа:

Главная->Категория->Товар

или

Главная->Категория->Подкатегория->Товар

соответственно.

Пробовал сам разобраться, но посмотрев код понял что там запросы полностью отличаются и данные берутся из разных таблиц

Модуль не обращается к таблице category_to_store, а при переходе из категории я так понял именно из это таблицы берется id категории.

В контроллере модуля попробовал добавить данные из этой таблицы, вроде как таблица видна, но все равно не срабатывает как надо.

Кто разобрался с данной проблемой подскажите в правильном ли направлении вообще копаю? Может есть уже где-то наработки, которых мне не удалось найти...

Версия движка ocStore 1.5.3.1

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


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

Запросы? Там где-то есть условие типа

if ($this->request->post) {
  ... бла-бла-бла
  $this->redirect($this->url->link('тут_указан_модуль', 'token=' . $this->session->data['token'] . $url, 'SSL'));
}
Что делает функция redirect думаю понятно. Проверьте. Может я прав.

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


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

возможно я не понял о чем речь, но не припомню таких запросов в файлах которые редактировал....

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


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

Соль в том, что "запрос" это получение данных из БД, а в OC генерация URL не имеет к БД никакого отношения. Все делает метод link в контроллере нужного модуля. Если Вас беспокоит именно редирект, то см. предыдущий пост, если именно хлебные крошки, то найдите в контроллере массив $this->data['breadcrumbs'] и добавьтеизмените нужное значение.

P.S.

И не надо ничего пытаться "припомнить". Вы же заинтересованная сторона - ищите, проверяйте, пробуйте.

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


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

Без обид, разумеется я заинтересованная сторона и буду экспериментировать))

вот у меня тут и была заморочка, подставлял нужно значение, но все равно как надо не срабатывало. Сейчас уже отключаюсь и не в состоянии проверять. Утром попробую еще и если не разберусь, то более детально опишу что делал и что конкретно не получается.

В любом случае спасибо за наводку, мне в принципе это и нужно.

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


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

Итак, а теперь собственно конкретные вопросы, так как насчет подставить нужный путь была у меня мысль, но ничего путного не вышло.

Во-первых касательно $this->data['breadcrumbs'] в контроллере модуля отсутствует и как я понимаю там оно и не надо, мне нужно правильно сформироваьт ссылку на товар и посдтавить ее там где нужно. Просмотре файла вида нашел что ссылка на товар и в категории и в модуле такая:

<?php echo $product['href']; ?>

Но формируется она по разному.

Например в контроллере категории category.php нашел такую строчку:

'href'		=> $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'])

а контроллере модуля тот же product['href'] формируется так:

'href'		 => $this->url->link('product/product', 'product_id=' . $result['product_id']),

сразу видно в чем отличие, в категории есть

'path=' . $this->request->get['path']

вот только никак не соображу откуда этот самый path взять. В контроллере категории он есть перед breadcrumbs, но каким боком он относится к products['href'] непонятно.

Пробовал подставлять его и так и эдак, но все равно id категории получить не удается...

Пока продолжаю эксперименты

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


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

Меня тоже это очень интересует, пробывал, ковырял, пока ни к чему не пришел, буду благодарен за помощь.

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


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

Все еще борюсь, как только найду решение отпишусь о результате.

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


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

Итак, появилась возможность снова вернуться к задаче и кое-чего добился, хотя подозреваю что это не совсем правильно. Суть в том что отказался от формирования ссылок из GET-запроса и заменил на формирование из базы.

Для этого внес изменения в 5-ти файлах.

Итак в файле /catalog/controller/module/latest.php находим строчку

$results = $this->model_catalog_product->getProducts($data);

и меняем на

$results = $this->model_catalog_product->getLatestProducts(10);

дальше открываем файл /catalog/controller/product/product.php находим в нем строчку

$this->load->model('catalog/category');

и добавляем после нее

$this->load->model('catalog/product');

далее, сразу за этой строчкой идет такой код:

if (isset($this->request->get['path'])) {
   $path = '';
  
   foreach (explode('_', $this->request->get['path']) as $path_id) {
	if (!$path) {
	 $path = $path_id;
	} else {
	 $path .= '_' . $path_id;
	}
  
	$category_info = $this->model_catalog_category->getCategory($path_id);
  
	if ($category_info) {
	 $this->data['breadcrumbs'][] = array(
	  'text'	  => $category_info['name'],
	  'href'	  => $this->url->link('product/category', 'path=' . $path),
	  'separator' => $this->language->get('text_separator')
	 );
	}
   }
  }

и удалим или закомментируем этот кусок кода и добавим следующее:

$path = '';
  $prod_id = $this->request->get['product_id'];
  $getPath = $this->model_catalog_product->getPath($prod_id);

  foreach (explode('_', $getPath) as $path_id) {
   if (!$path) {
	$path = $path_id;
   } else {
	$path .= '_' . $path_id;
   }
  
   $category_info = $this->model_catalog_category->getCategory($path_id);
  
   if ($category_info) {
	$this->data['breadcrumbs'][] = array(
	 'text'	  => $category_info['name'],
	 'href'	  => $this->url->link('product/category', 'path=' . $path),
	 'separator' => $this->language->get('text_separator')
	);
   }
  }

и последнее находим файл /catalog/controller/model/product.php

и там сразу после class ModelCatalogProduct extends Model { добавляем вот такой запрос:

public function getPath($product_id) {
  $sql = "SELECT p2c.category_id AS cat FROM ".DB_PREFIX."product p
	LEFT JOIN ".DB_PREFIX."product_to_category p2c ON (p.product_id = p2c.product_id)
	WHERE p.product_id=".$product_id."";

  $query = $this->db->query($sql);
  $categories = $query->rows;
  
  if($categories) {
   $path = '';
   foreach($categories as $category_id) {
	if (!$path) {
	 $path = $category_id['cat'];
	} else {
	 $path .= '_' . $category_id['cat'];
	}
   }
   return $path;
  } else {
   return false;
  }
}

дальше находим функцию getProduct и заменяем в ней запрос базы

$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");

на вот такой:

$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order
		 FROM " . DB_PREFIX . "product p
		 LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)
		 LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
		 LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id)
		 WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "'
		 AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");

а чуть ниже в функции getProducts заменим запрос к базе на такой:

$sql = "SELECT p.product_id, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating
	 FROM " . DB_PREFIX . "product p
	 LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)
	 LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)";

и последняя правка меняем в getLatestProducts запрос на

if (!$product_data) {
   $sql = "SELECT p.product_id, p2c.category_id FROM " . DB_PREFIX . "product p
	 LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
	 LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id)
	 WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'
	 ORDER BY p.date_added DESC LIMIT " . (int)$limit;
   $query = $this->db->query($sql);

в итоге мы получаем ссылку на товар вида:

http://site.ru/index.php?route=product/product&product_id=XXX

и хлебные крошки с полным путем к товару, но так как при переходе из каталога ссылка имеет вид

http://site.ru/index.php?route=product/product&path=xx&product_id=xxx

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

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

С радостью выслушаю замечания и исправления от опытных пользователей. Знаю что говнокод, но нигде на форуме решения лучше не найдено, поэтому выкладываю то что есть.

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


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

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

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

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

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

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

Войти

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

Войти


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

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