Jump to content

Неправильно строится дерево категорий


mrcappuccino

Recommended Posts

После обновления до 1.6.0.6 заметил ошибку

При добавлении новой категории она не показывается в дереве категорий при добавлении/редактировании категории и при привязке товара к категориям. 

В списке категорий в админке и на в меню на сайте все категории отображаются

Link to comment
Share on other sites

  • 4 weeks later...

После обновления до 1.6.0.6 заметил ошибку

При добавлении новой категории она не показывается в дереве категорий при добавлении/редактировании категории и при привязке товара к категориям. 

В списке категорий в админке и на в меню на сайте все категории отображаются

 

Всего скорее дело в некорректном дереве вложенных множеств - колонки n_left и n_right. У меня было подобное, хлебные крошки сходили с ума. Исправил скриптом, который либо по расписанию либо запуском вручную исправляет значения прямо в базе.

Link to comment
Share on other sites

Всего скорее дело в некорректном дереве вложенных множеств - колонки n_left и n_right. У меня было подобное, хлебные крошки сходили с ума. Исправил скриптом, который либо по расписанию либо запуском вручную исправляет значения прямо в базе.

Похоже на то. Кодом не поделитесь? Или хотя бы алгоритмом

Link to comment
Share on other sites

Похоже на то. Кодом не поделитесь? Или хотя бы алгоритмом

 

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

Алгоритм так опишу - выбираем диапазон min и max по умолчанию, например 50, затем рекурсией проходим по дереву категорий и по простым правилам укладываем те категории что есть в данный диапазон (присваиваем left и right). Если првило на каком то этапе не выполняется или категории не влезают в диапазон, то все начинаем сначала до тех пор пока не влезет.

Жалко выкладывать халявой, просто сам разработал все писал и испытал, а такое видимо редко кто просто так выкладывает.

Link to comment
Share on other sites

понял, значит тут подойдет алгоритм пересчета границ примерно как в Битрикс 

function ReSort($IBLOCK_ID, $ID=0, $cnt=0, $depth=0, $ACTIVE="Y")
	{
		global $DB;
		$IBLOCK_ID = IntVal($IBLOCK_ID);

		if($ID > 0)
		{
			$DB->Query("
				UPDATE
					b_iblock_section
				SET
					TIMESTAMP_X=".($DB->type=="ORACLE"?"NULL":"TIMESTAMP_X")."
					,RIGHT_MARGIN=".IntVal($cnt)."
					,LEFT_MARGIN=".IntVal($cnt)."
				WHERE
					ID=".IntVal($ID)
			);
		}

		$strSql = "
			SELECT BS.ID, BS.ACTIVE
			FROM b_iblock_section BS
			WHERE BS.IBLOCK_ID = ".$IBLOCK_ID."
			AND ".($ID>0? "BS.IBLOCK_SECTION_ID=".IntVal($ID): "BS.IBLOCK_SECTION_ID IS NULL")."
			ORDER BY BS.SORT, BS.NAME
		";

		$cnt++;
		$res = $DB->Query($strSql);
		while($arr = $res->Fetch())
			$cnt = CIBlockSection::ReSort($IBLOCK_ID, $arr["ID"], $cnt, $depth+1, ($ACTIVE=="Y" && $arr["ACTIVE"]=="Y" ? "Y" : "N"));

		if($ID==0)
		{
			$obIBlockRights = new CIBlockRights($IBLOCK_ID);
			$obIBlockRights->Recalculate();
			return true;
		}

		$DB->Query("
			UPDATE
				b_iblock_section
			SET
				TIMESTAMP_X=".($DB->type=="ORACLE"?"NULL":"TIMESTAMP_X")."
				,RIGHT_MARGIN=".IntVal($cnt)."
				,DEPTH_LEVEL=".IntVal($depth)."
				,GLOBAL_ACTIVE='".$ACTIVE."'
			WHERE
				ID=".IntVal($ID)
		);

		return $cnt+1;
	}

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

Link to comment
Share on other sites

понял, значит тут подойдет алгоритм пересчета границ примерно как в Битрикс 

function ReSort($IBLOCK_ID, $ID=0, $cnt=0, $depth=0, $ACTIVE="Y")
	{
		global $DB;
		$IBLOCK_ID = IntVal($IBLOCK_ID);

		if($ID > 0)
		{
			$DB->Query("
				UPDATE
					b_iblock_section
				SET
					TIMESTAMP_X=".($DB->type=="ORACLE"?"NULL":"TIMESTAMP_X")."
					,RIGHT_MARGIN=".IntVal($cnt)."
					,LEFT_MARGIN=".IntVal($cnt)."
				WHERE
					ID=".IntVal($ID)
			);
		}

		$strSql = "
			SELECT BS.ID, BS.ACTIVE
			FROM b_iblock_section BS
			WHERE BS.IBLOCK_ID = ".$IBLOCK_ID."
			AND ".($ID>0? "BS.IBLOCK_SECTION_ID=".IntVal($ID): "BS.IBLOCK_SECTION_ID IS NULL")."
			ORDER BY BS.SORT, BS.NAME
		";

		$cnt++;
		$res = $DB->Query($strSql);
		while($arr = $res->Fetch())
			$cnt = CIBlockSection::ReSort($IBLOCK_ID, $arr["ID"], $cnt, $depth+1, ($ACTIVE=="Y" && $arr["ACTIVE"]=="Y" ? "Y" : "N"));

		if($ID==0)
		{
			$obIBlockRights = new CIBlockRights($IBLOCK_ID);
			$obIBlockRights->Recalculate();
			return true;
		}

		$DB->Query("
			UPDATE
				b_iblock_section
			SET
				TIMESTAMP_X=".($DB->type=="ORACLE"?"NULL":"TIMESTAMP_X")."
				,RIGHT_MARGIN=".IntVal($cnt)."
				,DEPTH_LEVEL=".IntVal($depth)."
				,GLOBAL_ACTIVE='".$ACTIVE."'
			WHERE
				ID=".IntVal($ID)
		);

		return $cnt+1;
	}

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

 

К сожалению не знаком с битрикс как разработчик. Да, так в идеале. Только я применил немного другой подход, который подразумевает, что в дереве  множества могут быть пустые места, что практически безвредно для рабочей выборки по нлефт и райт. Тогда можно задать диапазон сразу, потом рекурсивно проходя по дереву каждому вглубь, на каждом подуровне делить диапазон на количество подкатегорий и соответственно присваивать лефт и райт, на каждомом следующем подуровене - присваиваем номера границы оставшегося промежутка не парясь о том что остаются неиспользуемые номера. Не знаю понятно ли объяснил. Мне так было проще - за два вечера все заработало.

Link to comment
Share on other sites

К сожалению не знаком с битрикс как разработчик. Да, так в идеале. Только я применил немного другой подход, который подразумевает, что в дереве  множества могут быть пустые места, что практически безвредно для рабочей выборки по нлефт и райт. Тогда можно задать диапазон сразу, потом рекурсивно проходя по дереву каждому вглубь, на каждом подуровне делить диапазон на количество подкатегорий и соответственно присваивать лефт и райт, на каждомом следующем подуровене - присваиваем номера границы оставшегося промежутка не парясь о том что остаются неиспользуемые номера. Не знаю понятно ли объяснил. Мне так было проще - за два вечера все заработало.

при этом если вдруг в каком то месте дерева номеров не хватило, то начинаем все с самого начала новую итерацию увеличив диапазон

Link to comment
Share on other sites

Вы бредите все!!!

 

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

 

Первое что делаем лезем в "ps_configuration"  и смотрим на значение полей:

 

PS_ROOT_CATEGORY = 1
PS_HOME_CATEGORY = 2
Далее лезим в ps_category:

 

Первые три строчки должны быть такими:

 

post-231092-0-06680600-1399900353_thumb.jpg

 

Ключевые параметры там это id_parent, level_depth и is_root_category

 

Далее в ps_category_group для категории с id = 1 не должно быть не чего задано.

 

Далее в ps_category_lang должно быть так указано:

 

post-231092-0-69735600-1399900507_thumb.jpg

 

Далее пожалуй самая важная таблица, это ps_shop, там должно быть вот так:

 

post-231092-0-54452000-1399900592_thumb.jpg

 

Т.е. там указывается ID корня категории, это всегда ID = 2, т.е. home (домашняя) категория.

 

Если все будет как на скринах то все будет работать!

Edited by Kerm (see edit history)
Link to comment
Share on other sites

Вы бредите все!!!

 

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

 

Первое что делаем лезем в "ps_configuration"  и смотрим на значение полей:

 

PS_ROOT_CATEGORY = 1
PS_HOME_CATEGORY = 2
Далее лезим в ps_category:

 

Первые три строчки должны быть такими:

 

attachicon.gifcate.JPG

 

Ключевые параметры там это id_parent, level_depth и is_root_category

 

Далее в ps_category_group для категории с id = 1 не должно быть не чего задано.

 

Далее в ps_category_lang должно быть так указано:

 

attachicon.gifgfhfgh.JPG

 

Далее пожалуй самая важная таблица, это ps_shop, там должно быть вот так:

 

attachicon.gifdfgdf.JPG

 

Т.е. там указывается ID корня категории, это всегда ID = 2, т.е. home (домашняя) категория.

 

Если все будет как на скринах то все будет работать!

 

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

Link to comment
Share on other sites

А модуль категорий стандартный? не делали не чего с ним? чистили кеш престы и кеш браузера? в коде страницы тоже пусто? может там с ксс что то..

Link to comment
Share on other sites

А модуль категорий стандартный? не делали не чего с ним? чистили кеш престы и кеш браузера? в коде страницы тоже пусто? может там с ксс что то..

проблема не в публичке, а в админке, в публичке всё отображается

 

новые категории не показываются в дереве для выбора категорий при добавлении товара/категории

Link to comment
Share on other sites

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

 

Я юзаю 1.6.0.5, все ок, обновлять рабочий сайт боюсь теперь еще больше. Стоит ли обновлять до 0.6? чем она отличается от 0.5 в двух словах не скажете?

Link to comment
Share on other sites

Вы бредите все!!!

 

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

 

Первое что делаем лезем в "ps_configuration"  и смотрим на значение полей:

 

PS_ROOT_CATEGORY = 1
PS_HOME_CATEGORY = 2
Далее лезим в ps_category:

 

Первые три строчки должны быть такими:

 

attachicon.gifcate.JPG

 

Ключевые параметры там это id_parent, level_depth и is_root_category

 

Далее в ps_category_group для категории с id = 1 не должно быть не чего задано.

 

Далее в ps_category_lang должно быть так указано:

 

attachicon.gifdfgdf.JPG

 

Далее пожалуй самая важная таблица, это ps_shop, там должно быть вот так:

 

attachicon.gifgfhfgh.JPG

 

Т.е. там указывается ID корня категории, это всегда ID = 2, т.е. home (домашняя) категория.

 

Если все будет как на скринах то все будет работать!

 

 

На счет бреда не согласен. Я измуудрился со скриптом таким от того что у мня скрипт из файла xml создает прямо в базе товар с комбинациями, с производителями и категориями, генерирует предварительное массовое СЕО, не используя контроллеры и классы престы конечно. Естественно нужно самому скрипту править дерево. А то что на вы пишете, у мен например было так изначально и не влияло на то что с категориями беда была.

Link to comment
Share on other sites

Я юзаю 1.6.0.5, все ок, обновлять рабочий сайт боюсь теперь еще больше. Стоит ли обновлять до 0.6? чем она отличается от 0.5 в двух словах не скажете?

Заметил, что исправили невозможность добавить категорию в 1.6.0.5 и множество исправлений в верстке админки

Ну и куча обновлений модулей, которые и без обновления системы, наверное, могут обновиться.

Link to comment
Share on other sites

Вы бредите все!!!

 

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

 

Первое что делаем лезем в "ps_configuration"  и смотрим на значение полей:

 

PS_ROOT_CATEGORY = 1
PS_HOME_CATEGORY = 2
Далее лезим в ps_category:

 

Первые три строчки должны быть такими:

 

attachicon.gifcate.JPG

 

Ключевые параметры там это id_parent, level_depth и is_root_category

 

Далее в ps_category_group для категории с id = 1 не должно быть не чего задано.

 

Далее в ps_category_lang должно быть так указано:

 

attachicon.gifdfgdf.JPG

 

Далее пожалуй самая важная таблица, это ps_shop, там должно быть вот так:

 

attachicon.gifgfhfgh.JPG

 

Т.е. там указывается ID корня категории, это всегда ID = 2, т.е. home (домашняя) категория.

 

Если все будет как на скринах то все будет работать!

 

Пишите нужно залесть в "ps_configuration"  и как туда залесть? Где эти все файлы лежат?

Link to comment
Share on other sites

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

Link to comment
Share on other sites

это таблица в базе данных

 

Как в таблицу-то попасть? Напишите пожалуйста по-русски, куда зайти.. что нажать..

 

И я ничего не обновляла, я сразу установила 1.6.0.6. Создаю новые категории, но их не видно когда добавляешь товар. т. е. не получается сделать привязку. Я создала новое меню (она же категорию) и мне нужно что бы в нем отображались товары. Но связь сделать с ним не получается, т.к. созданные категории не отображаются в связи.. Хотя если я захожу в товар, который был уже создан как демо, там отображаются новые категории в Связях. какой есть выход для решения этой проблемы, кроме написания скрипта?  

Link to comment
Share on other sites

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

 

А кроме стеба что-нибудь полезного можете написать?

Link to comment
Share on other sites

Как в таблицу-то попасть? Напишите пожалуйста по-русски, куда зайти.. что нажать..

 

И я ничего не обновляла, я сразу установила 1.6.0.6. Создаю новые категории, но их не видно когда добавляешь товар. т. е. не получается сделать привязку. Я создала новое меню (она же категорию) и мне нужно что бы в нем отображались товары. Но связь сделать с ним не получается, т.к. созданные категории не отображаются в связи.. Хотя если я захожу в товар, который был уже создан как демо, там отображаются новые категории в Связях. какой есть выход для решения этой проблемы, кроме написания скрипта?  

я пока сам не нашел источник ошибки

насчет таблиц, расписывать не буду, в интернете достаточно информации.

только направлю, использовать нужно, напр., phpMyAdmin http://www.phpmyadmin.net/home_page/index.php

Link to comment
Share on other sites


сделайте простенький скрипт, вставьте туда эти функции и вызовите refreshLevelDepth


function massupdate ($table, $update_column, $id_column, $data, $index)

{

if(!is_array ($data) or !is_array ($index)){

echo "Arguments is not array"; break;

};

 

$table = _DB_PREFIX_.$table;

return Db::getInstance()->Execute(

"UPDATE $table SET $update_column = CASE $id_column \n"

.implode('', $data).

"END WHERE $id_column IN (".implode(',', $index).")");

}

 

function real_level_depth($id_category, & $level_depth)

{

$sql = "SELECT `id_parent` FROM `"._DB_PREFIX_."category` WHERE `id_category` = ".(int)$id_category; $id_parent = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);

//p($result);

if($id_parent <> $id_category)

{

real_level_depth($id_parent, $level_depth); $level_depth++;

}

}

function refreshLevelDepth()

{

/* Gets all children */

$categories = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT id_category FROM '._DB_PREFIX_.'category ');

/* Updates level_depth for all children */

foreach($categories as $sub_category)

{

$id_category = (int)$sub_category['id_category']; $level_depth = - 1; real_level_depth($id_category,$level_depth); $data[] = " WHEN '$id_category' THEN '$level_depth' "; $index[] = "'$id_category'";

}

massupdate ("category", "level_depth", "id_category", $data, $index);

}

 

Edited by savvato (see edit history)
Link to comment
Share on other sites

Как в таблицу-то попасть? Напишите пожалуйста по-русски, куда зайти.. что нажать..

 

И я ничего не обновляла, я сразу установила 1.6.0.6. Создаю новые категории, но их не видно когда добавляешь товар. т. е. не получается сделать привязку. Я создала новое меню (она же категорию) и мне нужно что бы в нем отображались товары. Но связь сделать с ним не получается, т.к. созданные категории не отображаются в связи.. Хотя если я захожу в товар, который был уже создан как демо, там отображаются новые категории в Связях. какой есть выход для решения этой проблемы, кроме написания скрипта?

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

Link to comment
Share on other sites

Попробуйте пощелкать языки в админке. В настройках где пароль менять можно.  Была такая же проблема. На русском не отображалось, на английском все норм.

Link to comment
Share on other sites

Может вы в админке не заметили этой галочки и кнопки что показаны на скриншоте так же:

 

attachicon.gifdf4.JPG

Великое биг мерси вам! Категории были просто свернуты... я их развернула и все собственно на месте, на всех языках.. А то я уж было расстроилась совсем.. долго выбирала на чем магаз делать и тут такая засада образовалась.. Спасибо всем за помощь и отзывчивость!

Link to comment
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
×
×
  • Create New...