Создан механизм, позволяющий "спасти" статьи из удаляемого раздела. Для версии iCMS 1.10.1
Напомню, что при удалении раздела, содержащего статьи, задается два вопроса. Первый: "Удалить раздел такой-то и подразделы?" Второй: "Удалить все вложенные статьи?". Баг заключался в том, что при ответе на второй вопрос "Нет" статьи все равно удалялись.
Я разобрался с этим вопросом и выяснил, что в модели компонента content просто-напросто отсутствует механизм, позволяющий перенести статьи либо в коренной раздел, либо в архив, либо еще куда-нибудь. Blackman-st попросил меня переносить спасаемые статьи в раздел "Удаленные", что я и делаю.
2. При нажатии на иконку "Удалить раздел" при отрицательном ответе на вопрос "Удалить все вложенные статьи?" раздел удаляется, а статьи из него переносятся в раздел "Удаленные". Если раздела нет, он автоматически создается.
Раздел "Удаленные" ничем не отличается от других разделов контента сайта. По умолчанию он неопубликован, поэтому его видит один админ. Впрочем, пройдя в редактирование свойств этого раздела, можно настроить его так, как Вам удобно.
ПРЕДУПРЕЖДЕНИЕ! Заменяются некоторые системные файлы( список файлов см. ниже). Поэтому, если Вы уже вносили в эти файлы изменения, эти файлы следует не заменить, а смержить. Подробнее о программе merge смотрите в документации на эту программу, этот вопрос уже множество раз поднимался на форуме.
admin/applets/content.php
components/content/model.php
Постановка задачи
Вчера мой друг Blackman-st создал тему, в которой сообщил об обнаруженном им баге.Напомню, что при удалении раздела, содержащего статьи, задается два вопроса. Первый: "Удалить раздел такой-то и подразделы?" Второй: "Удалить все вложенные статьи?". Баг заключался в том, что при ответе на второй вопрос "Нет" статьи все равно удалялись.
Я разобрался с этим вопросом и выяснил, что в модели компонента content просто-напросто отсутствует механизм, позволяющий перенести статьи либо в коренной раздел, либо в архив, либо еще куда-нибудь. Blackman-st попросил меня переносить спасаемые статьи в раздел "Удаленные", что я и делаю.
Техзадание на хак
1. На странице "Контент сайта" в админке (эта страница выводится при нажатии на подпункт меню "Разделы и статьи" пункта "Каталог статей"), в колонке "Действие" создать дополнительную иконку. При нажатии на иконку должен выводится вопрос, действительно ли следует эту статью перенести в раздел "Удаленные". При положительном ответе статья переносится в раздел "Удаленные". Если такого раздела нет, он создается автоматически.2. При нажатии на иконку "Удалить раздел" при отрицательном ответе на вопрос "Удалить все вложенные статьи?" раздел удаляется, а статьи из него переносятся в раздел "Удаленные". Если раздела нет, он автоматически создается.
Раздел "Удаленные" ничем не отличается от других разделов контента сайта. По умолчанию он неопубликован, поэтому его видит один админ. Впрочем, пройдя в редактирование свойств этого раздела, можно настроить его так, как Вам удобно.
Настройки
Никаких настроек хак не требует.Как установить
Скачать архив, распаковать в любое место. Залить в корень сайта с заменой.ПРЕДУПРЕЖДЕНИЕ! Заменяются некоторые системные файлы( список файлов см. ниже). Поэтому, если Вы уже вносили в эти файлы изменения, эти файлы следует не заменить, а смержить. Подробнее о программе merge смотрите в документации на эту программу, этот вопрос уже множество раз поднимался на форуме.
Список измененых файлов
templates/_default_/admin/content.phpadmin/applets/content.php
components/content/model.php
Реклама #
Dorimen 11 лет назад #
Олег Васильевич я 11 лет назад #
Олег Васильевич я 11 лет назад #
Странник 11 лет назад #
Андрей 11 лет назад #
Странник 11 лет назад #
Fuze 11 лет назад #
Странник 11 лет назад #
статья не удаляется из базы данных, но по прежнему поле category_id таблицы cms_content содержит id уже несуществующего раздела. эта статья в админке не показывается - такое впечатление, что она убилась вместе с разделом.
я же говорю - отсутствует механизм переноса (то бишь изменения id категории у статей) при удалении категории, содержащей статьи. Я по просьбе Blackman'а сделал хак, переносящий эти статьи в категорию "Удаленные", хотя в стандартном движке можно переносить либо в корневой раздел, либо в архив.
Крот 11 лет назад #
функция
2) вы записываете поля NSLeft, NSRight, NSLevel напрямую в таблицу - здесь используются nested-sets деревья, данное добавление обязательно нарушит алгоритм работы nested-sets
добавление категории лучше делать так
что-то вроде -
$ns = $inCore->nestedSetsInit('cms_category');
$category['id'] = $ns->AddNode($category['parent_id']);
вообщем пока не советую ставить хак
проблема в 1.10.2(и ранних версий) подтверждаю - при удалении категории все вложенные статьи "виснут" со старым cat_id. На сайте не тестил, смотрел только код.
lokanaft 11 лет назад #
Странник 11 лет назад #
Я еще раньше предложил заказчику переносить спасаемые статьи в корневой каталог, но он попросил в раздел "Удаленные", что я и сделал.
Тем не менее, факт остается фактом - в стандартном движке отсутствует механизм спасения статей. Если сообшество попросит, я переделаю хак, чтобы он переносил спасаемые статьи в корневой каталог, в таком случае все опасения Крота будут напрасны.
lokanaft 11 лет назад #
И вообще для этого есть:
Тогда с деревом ничего не случится.
stealthdebuger 11 лет назад #
Это плохой совет, я бы настоятельно не рекомендовал это использовать.
lokanaft 11 лет назад #
Fuze 11 лет назад #
Крот 11 лет назад #
stealthdebuger 11 лет назад #
lokanaft 11 лет назад #
stealthdebuger 11 лет назад #
Хотя подобные решения, на мой взгляд, принципиально не верны... для серьезных проектов.
Fuze 11 лет назад #
Крот 11 лет назад #
InnoDB конечно же хорошо, но особо не попользуешь на shared-хостингах
думаю, хорошо бы предусмотреть просто возможность подключения какого-либо блокиратора(плагином) при необходимости
хотя не уверен что такие сайты на инстанте уже есть
stealthdebuger 11 лет назад #
Fuze 11 лет назад #
Крот, InnoDB думаю вполне выход, если задействовать полноценно механизм транзакций.
oll 11 лет назад #
lokanaft 11 лет назад #
lokanaft 11 лет назад #
Fuze 11 лет назад #
http://trac.instantcms.ru/changeset/1314#file14
изменения в методе deleteCategory
Крот 11 лет назад #
Fuze 11 лет назад #
Андрей 11 лет назад #
сколько раз в жизни, Игорь, Вы стелили соломку, прежде чем упасть?
Крот 11 лет назад #
А то при первом использовании InstantCMS встать на грабли или гадать что будет - не комильфо
Fuze 11 лет назад #
Андрей 11 лет назад #
защита от дурака должна быть привентивной, а не работать по факту
WALTERZ 11 лет назад #
stealthdebuger 11 лет назад #
Крот 11 лет назад #
lokanaft 11 лет назад #
Крот 11 лет назад #
не думаю что она реальная
Крот 11 лет назад #
не захотел) перенести их(статьи) заранее, статьи должны попасть к родителю данной удаляемой категории (если сирота - то в корневой раздел)делается добавлением двух-трех(
ну пяти) строк в model.php в функцию удаленияА в таком виде, как у вас, использовать хак небезопасно. Если хотите переносить в "удаленные" либо заставьте пользователя руками создать раздел, либо просто поправьте код создания раздела
хотя в инстанте (даже во второй версии!!!) он активно используется
интересно, если одновременно запустить 10 процессов добавления в одну таблицу не блокируя таблицу и читать last_id сразу же после добавления записи - собьется или нет?
Крот 11 лет назад #
может разработчики сделают в новой версии, думаю нужная вещь и во многих популярных cms есть блокировки
Странник 11 лет назад #
Завтра выкину из хака код, где создается этот раздел.
Андрей 11 лет назад #
можно, при настройке хака, ручками создать раздел "Удаленные", и так же ручками вписать ИД раздела в поле базы (приналичии маломальской инструкции)
и ничего ломаться не будет
а для новой версии 1.10.3 и 2.0 сразу сделать раздел по дефолту
помоему - самый лучший варинат будет, потому как в корне тоже много чего лежит иногда
Fuze 11 лет назад #
Андрей 11 лет назад #
never 11 лет назад #
Андрей 11 лет назад #
кстати, сорри, что без попыток посмотреть, что будет со статьями пользователя, если тот удалится?
Странник 10 лет назад #