Перейти к содержанию
remix8080

Вывод в breadcrumbs при клике на товар

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

Подскажите, как добиться, чтобы при клике на товар (напр. Товар1) из модулей (напр. последние поступления, хиты продаж и т.д.) в "хлебных крошках" отображался полный путь к товару, а не "Главная" - "Товар1".

Например Главная - Категория1 - Товар1.

П.С. Каждый товар входит только в одну категорию.

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


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

Эта ошибка обмусоливалась не однократно. В текущий момент штатными средствами к сожалению ни как :((

В будущих версиях будет исправлено.

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


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

Эта ошибка обмусоливалась не однократно. В текущий момент штатными средствами к сожалению ни как :((

В будущих версиях будет исправлено.

Понятно. А внештатными можно как-то (пока не выйдет новая версия)?

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


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

Понятно. А внештатными можно как-то (пока не выйдет новая версия)?

можно

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


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

можно

:-)

Вы с таким сталкивались? Конкретнее можете подсказать что/где править?

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


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

Не сталкивался, но учитывая, что

Каждый товар входит только в одну категорию.

сделать не сложно.

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

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


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

Оччччень нужно!

Подскажите, плз, что/где/как...

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


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

Ребята, неужели никто у себя такого не реализовывал? :mellow:

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


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

сейчас напишу, как сделать.

UPD

решение для товаров, которые входят только в одну категорию

Обновление от 2011.02.08 - 12:01

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

  • + исправлена ошибка проявляющаяся при большой вложенности категорий;
  • + исправлено формирование ссылок на категории в "крошках".

1. Открываем файл

catalog/controller/product/product.php
меняем

if (isset($this->request->get['path'])) {
			$path = '';
			
			foreach (explode('_', $this->request->get['path']) as $path_id) {
				$category_info = $this->model_catalog_category->getCategory($path_id);
				
				if (!$path) {
					$path = $path_id;
				} else {
					$path .= '_' . $path_id;
				}
				
				if ($category_info) {
					$this->document->breadcrumbs[] = array(
						'href'      => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $path),
						'text'      => $category_info['name'],
						'separator' => $this->language->get('text_separator')
					);
				}
			}
		}
на

/* webme - fix for product breadcrumbs - part_#1 - start */
		$wRestoreBreadcrumbs = "0";
		/* webme - fix for product breadcrumbs - part_#1 - end */
		
		if (isset($this->request->get['path'])) {
			$path = '';
			
			foreach (explode('_', $this->request->get['path']) as $path_id) {
				$category_info = $this->model_catalog_category->getCategory($path_id);
				
				if (!$path) {
					$path = $path_id;
				} else {
					$path .= '_' . $path_id;
				}
				
				if ($category_info) {
					$this->document->breadcrumbs[] = array(
						'href'      => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $path),
						'text'      => $category_info['name'],
						'separator' => $this->language->get('text_separator')
					);
				}
			}
		} else { /* webme - fix for product breadcrumbs - part_#2 - start */
			$wRestoreBreadcrumbs = "1";
		} /* webme - fix for product breadcrumbs - part_#2 - end */
мотаем ниже.

перед

$product_info = $this->model_catalog_product->getProduct($product_id);
вставляем

/* webme - fix for product breadcrumbs - part_#3 - start */
		if ($wRestoreBreadcrumbs == "1") {
			$wcat = $this->model_catalog_product->getCategories($product_id);
			if (count($wcat) == 1) {
				$w_category_id = $wcat['0']['category_id'];
				$w_BreadCrumbs = $this->model_catalog_product->wbm_getPath($w_category_id);
				
				$w_totalCrumbs = count($w_BreadCrumbs);
				foreach ($w_BreadCrumbs as $pos => $w_BreadCrumb) {
					
					$w_BreadCrumb_href = "";
					$w_i = 0;
					for($w_i = 0; $w_i <= $pos; $w_i++) {
						if (empty($w_BreadCrumb_href)) {
							$w_BreadCrumb_href .= $w_BreadCrumbs[$w_i]["category_id"];
						} else {
							$w_BreadCrumb_href .= "_".$w_BreadCrumbs[$w_i]["category_id"];
						}
					}
					
					$this->document->breadcrumbs[] = array(
						'href'      => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $w_BreadCrumb_href),
						'text'      => $w_BreadCrumb['name'],
						'separator' => $this->language->get('text_separator')
					);
				}
			}
		}
		/* webme - fix for product breadcrumbs - part_#3 - end */
сохраняем, закрываем.

2. Открываем файл

catalog/model/catalog/product.php
в конец файла, перед

}
?>
вставляем

/* webme - fix for product breadcrumbs - part_#1 - start */
	public function wbm_getPath($category_id) {
		$productPath = array();
		
		$result = $this->wbm_getProductCategoryInfo($category_id);
		
		$productPath2 = array();
		if ($result['parent_id'] > 0) {
			$productPath2 = $this->wbm_getPath($result['parent_id']);
			
			foreach ($productPath2 as $productPath2_item) {
				array_push($productPath, $productPath2_item);
			}
		}
		array_push($productPath, $result);
		
		return $productPath;
	}
	
	public function wbm_getProductCategoryInfo($catID) {
		$sql = "SELECT DISTINCT c.category_id as category_id, c.parent_id as parent_id, cd.name as name FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.category_id = '" . (int)$catID . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1'";
		
		$query = $this->db->query($sql);
		
		return $query->row;
	}
	
	public function wbm_getParentCategory($catID) {
		$sql = "SELECT DISTINCT c.parent_id as parent_id, cd.name as name FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.parent_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.category_id = '" . (int)$catID . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1'";
		
		$query = $this->db->query($sql);
		
		return $query->row;
	}
	/* webme - fix for product breadcrumbs - part_#1 - end */
сохраняем, закрываем.

3. Пользуемся :)

Возможно в модель запихнул лишнюю функцию (которая не используется).

Однако ужасно устал, поэтому принимайте "как есть".

Изменено пользователем afwollis
UPD, обновлен код
  • +1 3

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


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

сейчас напишу, как сделать.

Спасибо. Буду ждать с нетерпением... :rolleyes:

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


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

Еще одно решение для вывода breadcrumbs на странице товара, даже если покупатель пришёл на страницу с товаром по ссылке из любого модуля и пр.

Открываем: catalog/model/tool/seo_url.php

После:

class ModelToolSeoUrl extends Model {
Вставляем:

public function get_cat_alias($cid)
  {
    $cid=intval($cid);
    $query='
      SELECT
        c.parent_id,
        a.keyword
      FROM
        '.DB_PREFIX.'category AS c,
        '.DB_PREFIX.'url_alias AS a,
        '.DB_PREFIX.'product_to_category AS pc
      WHERE
        c.category_id='.$cid.' && a.query="category_id='.$cid.'"
      LIMIT 1
    ';
    $result=$this->db->query($query);
    $results=array();
    foreach($result->rows as $row)
    {
      if(intval($row['parent_id'])!==0)$results[]=$this->get_cat_alias($row['parent_id']);
      if(isset($row['keyword']))$results[]=$row['keyword'];
    }
    return $results;
  }
  function output_cat_alias($array)
  {
    $result=array();
    foreach($array as $keyword)
    {
      if(is_array($keyword))
      {
        $result[]=$this->output_cat_alias($keyword);
      }else
      {
        $result[]=$keyword;
      }
    }
    return implode('/',$result);
  }
В этом же файле, после
if (($key == 'product_id') || ($key == 'manufacturer_id') || ($key == 'information_id')) {
Вставляем:

if($key == 'product_id')
          {
            $query='
              SELECT
                c.parent_id,
                c.category_id
              FROM
                '.DB_PREFIX.'category AS c,
                '.DB_PREFIX.'url_alias AS a,
                '.DB_PREFIX.'product_to_category AS pc
              WHERE
                pc.product_id='.$value.' &&
                pc.category_id=c.category_id
              LIMIT 1
            ';
            $cat_current=$this->db->query($query);
            $query='
              SELECT
                a.keyword
              FROM
                '.DB_PREFIX.'url_alias AS a
              WHERE
                a.query="category_id='.$cat_current->row['category_id'].'"
              LIMIT 1
            ';
            $cat_current_key=$this->db->query($query);
            $url=$this->get_cat_alias($cat_current->row['parent_id']);
            $url=array(0=>$url,1=>$cat_current_key->row['keyword']);
            $url='/'.$this->output_cat_alias($url);
          }

P.S. - решение полноценно работает только для товаров, находящихся только в одной категории. Ссылка на тему на англоязычном форуме - ссылка

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


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

Еще одно решение для вывода breadcrumbs на странице товара, даже если покупатель пришёл на страницу с товаром по ссылке из любого модуля и пр.

Спасибо за вариант, serega-lomik, пока пользуюсь решением от afwollis

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


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

Пофиксил ошибки и обновил код в сообщении.

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

спасибо.

Изменено пользователем afwollis

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


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

Пофиксил ошибки и обновил код в сообщении.

Спасибо. Завтра попробую и отпишусь.

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


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

по многочисленным просьбам, вида

Хотелось бы видеть, что-бы открытая страница выводилась в крошках текстом

решение для тех, кто так и не смог этого сделать:

catalog/view/theme/ВАША_ТЕМА/template/common/header.tpl
меняем

<?php  foreach ($breadcrumbs as $breadcrumb) { ?>
        <?php  echo $breadcrumb['separator']; ?><a href="<?php echo str_replace('&', '&', $breadcrumb['href']); ?>"><?php echo $breadcrumb['text']; ?></a>
        <?php  } ?>
на

<?php
        	$w_bc_total = count($breadcrumbs);
        	if ($w_bc_total > 0) {
        		$w_bc_last = $w_bc_total - 1;
        		foreach ($breadcrumbs as $i => $breadcrumb) { ?>
        		<?php if ($i == $w_bc_last) { break; } ?>
        		<?php echo $breadcrumb['separator']; ?><a href="<?php echo str_replace('&', '&', $breadcrumb['href']); ?>"><?php echo $breadcrumb['text']; ?></a>
        		<?php } ?>
        	<?php echo $breadcrumbs[$w_bc_last]['separator']; ?><?php echo $breadcrumbs[$w_bc_last]['text']; ?>
        <?php } ?>
  • +1 6

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


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

afwollis а нельзя ли ваш споспоб как-то переделать чтобы путь к товарам был полным ,если из модуля (например "последние товары") включать товар т.к. сейчас этоn путь выглядит примерно так:

Главная>>товар1

а хочется видеть вот так Главная>>категория1>>товар1

Впринципи способ от serega-lomik делает то чего не достает в первом способе,но почему-то у меня при использовании этого способа слетает кодировка русских букв на главной странице и выдает сверху ошибку

Notice: Undefined index: category_id in Z:\home\localhost\www\myweb\catalog\model\tool\seo_url.php on line 79Notice: Undefined index: parent_id in Z:\home\localhost\www\myweb\catalog\model\tool\seo_url.php on line 84Notice: Undefined index: keyword in Z:\home\localhost\www\myweb\catalog\model\tool\seo_url.php on line 86

Странно то что на других страницах все нормально работает.Никто не посооветует где искать проблему?

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


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

страннно но пути в крошках вида Главная>>категория1>>товар1 все-таки появились,правда я не понял что случилось,наверно опять ступил где-то))

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


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

наверно опять ступил где-то))

товары в одной категории или в нескольких?
  • +1 1

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


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

товары в одной категории или в нескольких?

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

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


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

это из области "править во всех модулях ссылки на товары"

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


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

Применил решение, которое предложил serega-lomik. Возникло несколько вопросов.

Если переходить из поисковой системы по ссылке вида "www.мой_сайт.товар" - то в хлебных крошках отображается всё по-старому, без указания всего пути товара. Полный путь можно увидеть только тогда, когда в крошках кликнуть на товар. Страница обновится и тогда отображается уже полный путь к товару, с учётом каталогов.

Можно ли сделать так, чтобы при переходе из поисковика путь в крошках сразу отображался полным, с учётом каталогов. А то догадаться кликнуть в крошках на наименование товара таки не каждому дано... Для этого надо иметь пытливый ум и знать, что именно тебе надо. :) А покупатели приходят в магазин для того, чтобы совершить покупку, а не проводить эксперименты. :)

И ещё впрос. Теперь сайтмап-генератор генерит мапу с полным путём товара (т.е. "www.мой_сайт.каталог.товар", а раньше генерил вида "www.мой_сайт.товар") Если я сделаю мапу с новыми путями - в инет попадёт куча дублей страниц (даже если и не сделаю новую сайтмапу, роботы всё равно будет индексировать страницы с новыми путями (полными)). Т.е., останутся страницы со старыми путями (ссылками) и появятся с новыми. Думаю, это не совсем хорошо. Или я неправ?

Сейчас ещё пробану решение, которое предложил afwollis

Пробанул. Все вопросы сняты. В решении, предложенном afwollis, вышеперечисленных проблем нет.

afwollis, спасибо!

Изменено пользователем monax

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


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

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

Он отображается, если применить решение, которое предложил serega-lomik. Но появляются проблемы, описанные мною в предыдущем посте. Хотя, может для Вас это не проблемы... :)

Меня больше устраивает вариант, который предложил afwollis. :)

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти

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

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

×

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

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