Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

ремонт дерева категорий


ambalocha69
 Поделиться

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

нашел бяку, которая есть во всех версиях

функция восстановления дерева категорий

	public function repairCategories($parent_id = 0) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category WHERE parent_id = '" . (int)$parent_id . "'");

имеем ситуацию - см скрин

parent_id = 43

но категории с таким ID нет - чьи то шаловливые или неопытные ручки ее удалили.

и все 

эти категории нигде не отображаются и не поддаются лечению, так как выборка идет по  $parent_id = 0

требуется чистка мусора:

	public function repairCategories($parent_id = 0) {
    if ($parent_id == 0) {
      // ПРОВЕРИТЬ ВСЕ parent_id НА СУЩЕСТВОВАНИЕ И ПРИ ОТРИЦАТЕЛЬНОМ РЕЗУЛЬТАТЕ ОБНУЛИТЬ
		  $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category WHERE parent_id != 0");
  		foreach ($query->rows as $category) {
			   $ask = $this->db->query("SELECT * FROM `" . DB_PREFIX . "category` WHERE category_id = '" . (int)$category['parent_id'] . "'");
         if (!$ask->row) {
            $this->db->query("UPDATE `" . DB_PREFIX . "category` SET parent_id=0 WHERE category_id = '" . (int)$category['category_id'] . "'");
            }
          }
      }

		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category WHERE parent_id = '" . (int)$parent_id . "'");

 

category_error.jpg

  • +1 2
Ссылка на комментарий
Поделиться на других сайтах

4 часа назад, Soong сказал:

да не удалял , точно говорю )))

дело не в том, что удалял или нет, а в том что Опенкарт не умеет обрабатывать подобную ошибку в данных

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

19 часов назад, ambalocha69 сказал:

нашел бяку, которая есть во всех версиях

Поясните

 

 

19 часов назад, ambalocha69 сказал:

имеем ситуацию - см скрин

parent_id = 43

если ее нет, та и нет доступа к child.

Т.е. возможно по прямой ссыдке доступна.

во фронте эта таблица не используется, только в админке ( я имею ввиду дефолт) - могу ошибаться.

Я сейчас точно не помню причиниу, давно было.
Я предлагал в методе repair, сначала делать truncate, а затем восстановление

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

9 минут назад, chukcha сказал:

если ее нет, та и нет доступа к child.

именно! а чилдренов было около 800 и ни один из них в списке категорий не отображался

11 минут назад, chukcha сказал:

Я предлагал в методе repair, сначала делать truncate, а затем восстановление

а смысл делать очистку category_path? проблема не в ней

первым отрабатывает запрос:

		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category WHERE parent_id = 0");

далее идет рекурсия по найденным в этом запросе

а те чилдрены у которых прописаны несуществующие паренты (не 0) не попадают в поле зрения функции - по ним нет никаких действий

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

41 минуту назад, ambalocha69 сказал:

а чилдренов было около 800 и ни один из них в списке категорий не отображался

Но ведь кто-то родителя грохнул

Это мог быть кривой экспорт..
Случайно удалить не получится - система закричит
Значит - потусторонние силы..

То, что архитектура опенкарта несбоеустойчива известно.

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

3 минуты назад, chukcha сказал:

Но ведь кто-то родителя грохнул

кто то грохнул. расследование проводить нет смысла - это время\деньги

5 минут назад, chukcha сказал:

То, что архитектура опенкарта несбоеустойчива известно.

так вот и предлагаю еще один камушек для укрепления фундамента :-)

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

14 минут назад, ambalocha69 сказал:

так вот и предлагаю еще один камушек для укрепления фундамента 

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

 

UPDATE `oc_category` c1
LEFT JOIN `oc_category` c2
ON c1.parent_id = c2.category_id

SET  c1.parent_id = 0
where c1.parent_id <>0
AND c2.category_id is null

 

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

я над оптимизацией не думал - нужно было быстро решить проблему

наверное стоит сделать OCMOD с этим фиксом - мало ли кому еще понадобится

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

Кстати о

 

14 часов назад, Soong сказал:

да не удалял , точно говорю )))


 

CREATE TABLE `oc_product_reward` (
  `product_reward_id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL DEFAULT '0',
  `customer_group_id` int(11) NOT NULL DEFAULT '0',
  `points` int(8) NOT NULL DEFAULT '0',
  PRIMARY KEY (`product_reward_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

также возможен дубль

  `product_id` int(11) NOT NULL DEFAULT '0',
  `customer_group_id` int(11) NOT NULL DEFAULT '0',

Нужен UNIQUE INDEX

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

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

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

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