Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


villord

Recommended Posts

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

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

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

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

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

или

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

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

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

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

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

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

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

Надіслати
Поділитися на інших сайтах


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

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

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

P.S.

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

Надіслати
Поділитися на інших сайтах

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

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

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

Надіслати
Поділитися на інших сайтах


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

Во-первых касательно $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 категории получить не удается...

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

Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

Итак, появилась возможность снова вернуться к задаче и кое-чего добился, хотя подозреваю что это не совсем правильно. Суть в том что отказался от формирования ссылок из 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 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.