Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

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


Recommended Posts

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

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

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

Link to post
Share on other sites

  • 1 month later...

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

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

Понятно. А внештатными можно как-то (пока не выйдет новая версия)?
Link to post
Share on other sites

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

можно
Link to post
Share on other sites

можно

:-)

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

Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites
  • 2 weeks later...

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

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. Пользуемся :)

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

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

Edited by afwollis
UPD, обновлен код
  • +1 3
Link to post
Share on other sites

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

Спасибо. Буду ждать с нетерпением... :rolleyes:
Link to post
Share on other sites

Еще одно решение для вывода 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. - решение полноценно работает только для товаров, находящихся только в одной категории. Ссылка на тему на англоязычном форуме - ссылка

Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

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

спасибо.

Edited by afwollis
Link to post
Share on other sites

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

Спасибо. Завтра попробую и отпишусь.
Link to post
Share on other sites

afwollis, все красиво работает.

СПАСИБО!

Link to post
Share on other sites

  • 3 weeks later...

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

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

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

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
Link to post
Share on other sites
  • 2 weeks later...

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

товары в одной категории или в нескольких?
  • +1 1
Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

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

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

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

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

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

afwollis, спасибо!

Edited by monax
Link to post
Share on other sites

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

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites
  • 4 weeks later...

А как зделать чтоб при выборе товара из модуля тупи был виден не только в хлебных крошках, а и в модуле категори?

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.