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

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


Recommended Posts

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

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

	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

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

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

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

Important Information

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