Утилита "Ремонтник Деревьев"

3066

Утилита "Ремонтник Деревьев"

Посвящение.Эту утилиту я посвящаю биологине, красавице и молодой маме Ленке Леонидовне Шишловской.
Эта утилита представляет собой "костыль", написанный на скорую руку. Меня прижала эта проблема на проекте, над которым я сейчас работаю. На форуме я встречал упоминания об аналогичных проблемах у других пользователей, поэтому делюсь этой утилиткой.

Как утилита работает

Утилита показывает и исправляет все дерево целиком. В отличие от phpMyAdmin, где отредактировать можно только одну запись, здесь меняется вся таблица. Это позволяет охватить все дерево одним взглядом, что не в пример удобнее. Пользуясь утилитой, я исправил дерево на своем сайте за пару минут, хотя перед этим через "еш твою медь" пытался сделать это в phpMyAdmin целый вечер))). Скриншот можно увидеть чуть ниже, где приведены примеры.

Безопасность и прочие предупреждения.

Поскольку писалась утилита для админа, который и так имеет доступ к своему сайту через FTP и к БД через phpMyAdmin, я посчитал излишним делать эту утилиту в расчете "на дурака". Утилита не содержит никаких проверок на правильность введенных данных - что ввели, то она и запишет, если сервер БД с вами согласится. Поэтому не заполняйте поля ерундой, это же ваш сайт! Не оставляйте утилиту в корне вашего сайта, после того, как закончили с ней работу. Закончили - удаляйте!

И естественно, я не принимаю никаких претензий, если вы, спьяну или сдуру, обвалите свой сайт моей утилитой. Это - инструмент админа, который просто делает вашу работу удобной, но решение принимаете вы сами!

Настройки

Все настройки внутри файла trees_repairer_icms_1_10_3.php. Открывайте любым редактором и настраивайте. В файле все настройки снабжены комментариями, а в архиве подробнейшая инструкция.

Как работать с утилитой.

Подробная инструкция внутри архива. Скачайте архив, распакуйте куда нибудь, и перебросьте в корень сайта файл trees_repairer_icms_1_10_3.php. Затем наберите в браузере http://адрес_сайта.ru/trees_repairer_icms_1_10_3.php и работайте. Поработали - удаляйте!

Дизайн

Я не дизайнер, поэтому претензии на плохой дизайн утилиты не принимаю. Нечего ею любоваться - выполнили работу - удаляйте!

Примеры правильных и неправильных деревьев.

Ниже показан пример правильного дерева свежеустановленного сайта. Как видим, родительская категория Фото с id=20 имеет две дочерние категории Новые фото(id=42) и Лучшие фото (id=43). Каждая из них ссылается на родителя и имеет parent_id=20. Родитель имеет NSLevel 1, дети каждый по 2. Теперь смотрим на поля NSLeft и NSRight. Невооруженным взглядом видно, что эти значения идут подряд, причем родитель "охватывает" своими значениями значения детей. То есть первое значение NSLeft у родителя 14, затем идут NSLeft 15 и NSRight 16 первого ребенка, затем 17 и 18 второго ребенка и наконец, идет NSRight родителя со значением 19:
""
Изображение уменьшено. Щелкните, чтобы увидеть оригинал.


Теперь более сложный пример. Тоже правильное дерево. Родитель Статьи с id=21 имеет четырех детей с id 39, 40, 41 и 44. Родитель имеет уровень 1, дети 2. NSLeft и NSRight тоже идут у них подряд: (4(5,6)(7,8)(9,10)(11,12) 13). Как видим, родитель опять охватывает детей своими NSLeft и NSRight:
""
Изображение уменьшено. Щелкните, чтобы увидеть оригинал.


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

Ну, и наконец, неправильный пример. Взято с моего проекта, над которым я сейчас работаю. Такое дерево образовалось после того, как я немного подвигал пункты меню вверх вниз в админке, а потом, когда увидел сообщение об ошибках деревьев, сдуру нажал на кнопку "исправить ошибки". Утилиты у меня тогда не было - и вот что получилось:
""
Изображение уменьшено. Щелкните, чтобы увидеть оригинал.

Как скачать.

Скачать можно тут.

Куда говорить спасибо

яд 410011913797936
wmr 342960323367

Удачи в программировании!
Создание механизма "спасения" статьей из удаляемого раздела | Утилита "Генератор плагина"
Теги: утилиты
Комментарии (34)
Imran 4 февраля 2014 в 18:42 +1
small user social cms
огромный + за утилиту
lokanaft 4 февраля 2014 в 20:32 -1
small user social cms
Можно было бы обновить phpMyAdmin - там поля редактируются и сохраняются по клику на поле, не переходя в редактирование scratch
Кирилл Эдуардович (Странник) 5 февраля 2014 в 14:15 +4
small user social cms
Конечно можно, кто спорит? Вот только пока сидишь и анализируешь проблему, кончается время сессии, и хостер предлагает еще раз ввести пароль. Естественно, все изменения, что внес, испаряются в астрал, а у тебя на душе добавляется позитива. Мне табличку "Сарказм" поднимать?
Я для чего, думаете, утилиту писал, от того, что мне делать нечего? С утилитой подобной проблемы нет.
lokanaft 5 февраля 2014 в 18:23 -2
small user social cms
Какой астрал, если на аяксе сохранение происходит. Мне Вам опять видео демонстрацию записать?
lokanaft 5 февраля 2014 в 18:28 -2
small user social cms
Хотя даже снимать не надо: http://www.youtube.com/watch?feature=player_detailpage&v=g21zYqfHCkw#t=6
Су-27 4 февраля 2014 в 20:44 +1
no profile
Спасибо коллега + hoho
Max 4 февраля 2014 в 23:08 +1
small user social cms
Недавно была аналогичная проблема, пришлось переделывать все меню в ручную. Сейчас количество пунктов меню выросло в несколько раз.
Выполнил в админке проверку деревьев, были найдены ошибки в дереве меню, хотя сами меню работают нормально.
Вопрос к уважаемым специалистам: как эти ошибки могут повлиять на работу сайта если визуально все ок?
Кирилл Эдуардович (Странник) 5 февраля 2014 в 11:39 +2
small user social cms
Я когда исправил дерево на своем проекте (своей же утилитой естессно), сообщение об ошибке дерева пропало. Дерзайте, но не забывайте перед началом работы снять с таблицы дамп.
Крот 5 февраля 2014 в 06:39 +2
small user social cms
кривая архитектура приводит ко многим костылям)

за утилитку плюсанул, удобство ускоряет работу
Кирилл Эдуардович (Странник) 5 февраля 2014 в 11:42 0
small user social cms
для удобства (себя любимого) утилита и создавалась! не знаю, как кому, а я был доволен, когда за четыре минуты решил проблему, над которой страдал три вечера в phpMyAdmine))
lezginka.ru 5 февраля 2014 в 11:53 +1
small user social cms
+
навряд ли я смогу воспользоваться, но из-за кривых/битых деревьев пару раз пришлось сайт с нуля инсталлировать и добавлять вручную контент
Lora 5 февраля 2014 в 22:21 +1
small user social cms
Спасибо, странник.Молодец.Сказал-сделал.Мужчина.
Кирилл Эдуардович (Странник) 6 февраля 2014 в 20:35 +2
small user social cms
Мне Oll велела утилиту называть "Садоводом"!
Димитриус 6 февраля 2014 в 20:55 +1
small user social cms
А разве это не ОН ? =)
Димитриус 6 февраля 2014 в 20:56 +2
small user social cms
=) точно
Azura 9 февраля 2014 в 18:27 +1
small user social cms
Супер! Уже скачала! На первой ветке системы эта утилита то что надо!
Кирилл Эдуардович (Странник) 9 февраля 2014 в 18:36 0
small user social cms
собственно, проблемы начались с 1.10.3. я тикет написал, надеюсь Fuse пофиксит к 1.10.4
VopisUVD 16 февраля 2014 в 23:00 0
small user social cms
эта проблема еще с 1.8 тащится... И создает порой много проблем.
Сенкс за утилиту...
Кирилл Эдуардович (Странник) 17 февраля 2014 в 17:17 0
small user social cms
Может быть и с более раннего времени...Потому что, в отличии от Джумлы, в Инстанте можно создать любое количество уровней вложения. Лично я столкнулся с этой траблой вот сейчас. И исправил проблему, как умею - подперев хромую ногу костылем)))
vicoder 24 февраля 2014 в 15:40 0
no avatar
Я заметил, что ломка деревьев происходит из-за ошибки в функции $ns->MoveNode при перемещении раздела сверху вниз.

саму ошибку, не нашел. однако написал такой костыль: (вызывается после $ns->MoveNode в коде с перемещением раздела)

Код PHP:
  1.  
  2. //ВНИМАНИЕ!!!!!!
  3. //иногда почему то возниакет ошибка при перемещении категории в поле NSLeft неправильно проставляется значения
  4. //исправления от Vicoder
  5. $sql_select = "SELECT * FROM {$base} WHERE parent_id = {$parent_id} ORDER BY ordering";
  6.  
  7. $rs = $inDB->query($sql_select);
  8. if ($rs)
  9. {
  10. $index = 0;
  11. while($cat = $inDB->fetch_assoc($rs)) {
  12. if($index==0) $Right = (int)$cat['NSRight'];
  13. else {
  14. $inDB->query( "UPDATE {$base} SET NSLeft = ".($Right+1)." WHERE id={$cat['id']}");
  15. $Right = $cat['NSRight'];
  16. }
  17. $index++;
  18. }
  19. }
  20.  
  21.  

вроде больше не стали ломаться деревья
platon 24 февраля 2014 в 16:40 0
small user social cms
и куда это вставить
CMS Admin 18 апреля 2014 в 11:24 0
small user social cms
/admin/applets/menu.php
Андрей 1 мая 2014 в 08:32 0
small user social cms
этот хак, я так понимаю, должен решить проблему поломки дерева меню в дальнейшем, при любых операциях?
потому что очень часто поломка возникает, когда начинаешь формировать структуру и перемещаешь какой нибудь пункт на 5-6 позиций, особенно вверх...
CMS Admin 21 апреля 2014 в 14:38 0
small user social cms
Можно пояснить, что именно означают NSLeft и NSRight? Количество пунктов меню до и после текущего?
Кирилл Эдуардович (Странник) 21 апреля 2014 в 16:00 +1
small user social cms
Нет. Это "координаты" элемента на дереве.
CMS Admin 21 апреля 2014 в 16:54 +1
small user social cms
Кажись врубился, по крайней мере свое меню проблемное восстановил
Евгений Фоменко 1 мая 2014 в 01:34 0
small user social cms
Я смотрю все говорят о деревьях меню? Каталог таким образом можно лечить?
Евгений Фоменко 1 мая 2014 в 01:37 0
small user social cms
Ага, утилита лечит все и вся! Супер. Отпишусь о результате, у меня 500 рубрик до 3 уровня вложенности, заново я такую работу переделывать не буду, надеюсь просто вылечить...
Евгений Фоменко 2 мая 2014 в 02:51 0
small user social cms
Сильно много рубрик, тяжело сообразить что и после чего идёт. Завтра до обеда если не осилю, буду делать по плану Б...
Кирилл Эдуардович (Странник) 2 мая 2014 в 04:07 0
small user social cms
Рекомендую взять бумагу в клеточку и писать на ней значения NSLeft и NSRight. Причем каждый новый уровень на следующей строчке. Вы визуально увидите, как родитель охватывает детей своими значениями. Я так делал, когда исправлял деревья на своем сайте.

Хочу сделать, чтобы утилита тоже такое показывала, но катастрофически не хватает времени. Уж простите, придется вам на бумаге рисовать что-то похожее на
(1 8)
(2 5)(6 7)
(3 4)
Здесь, как видите, трехуровневое дерево, родитель 1-8 имеет двух детей 2-5 и 6-7, а 2-5, имеет ребенка 3-4. Везде принцип одинаков.
Евгений Фоменко 4 мая 2014 в 19:44 0
small user social cms
Спасибо, я как и собирался - помучился до обеда, потом плюнул. Открыл все подкатегории каждая в новой вкладке, сбросил все, проверил и потом пересохранил. Ну как-то так )) 3 часа времени ушло. А делать все руками - не вариант, совсем не вариант, поскольку я только на вписывание координат по порядку потратил минут 40 + 1 кофе + 2 перекура.

Зато сейчас откатываю сайт 2-3 раза в день, чтобы ничего не потерять. Количество рубрик удалось уменьшить до +/- 400, дальше по порядку. Сейчас буду искать Ваш клонировщик модулей, мне нужно что-то решать с индексацией, гугл на меня забил...
Кирилл Эдуардович (Странник) 4 мая 2014 в 20:38 0
small user social cms
У меня не клонировщик, а Генератор модулей

Все равно, даже с записыванием NSLeft и NSRight от руки получается быстрее, чем заново сайт делать))) Я немного выздоровею, переделаю данную утилиту, чтобы она эту таблицу, что вы от руки писали, сама рисовала....
Кирилл Эдуардович (Странник) 10 мая 2014 в 19:32 0
small user social cms
Как и обещал, выкладываю модифицироанную утилиту. Вот про нее статья - как пользоваться и где взять