Skip to content

Fix resource delete, trash restore, and nested system pages - #8

Open
Ibochkarev wants to merge 4 commits into
3.xfrom
fix/14167-form-delete-cascade-children
Open

Fix resource delete, trash restore, and nested system pages#8
Ibochkarev wants to merge 4 commits into
3.xfrom
fix/14167-form-delete-cascade-children

Conversation

@Ibochkarev

@Ibochkarev Ibochkarev commented Aug 21, 2026

Copy link
Copy Markdown
Member

Что сделано

Чекбокс Deleted в форме ресурса сохранял только сам ресурс. Дочерние оставались deleted=0, поэтому дерево показывало их живыми. Восстановление дочернего из корзины оставляло родителя удалённым, поэтому дочерний исчезал из корзины, оставаясь под удалённой папкой. Purge родителя перманентно удалял дочерних, но сообщение об успехе перечисляло только родителя. Перемещение site_start, страницы 404 или страницы unavailable под папку с последующим удалением папки обходило корневую защиту.

Resource/Update оставляет deleted без изменений при собственном save, затем запускает Resource/Delete или Resource/Undelete. Восстановление из корзины undelete цепочку предков. Purge включает id потомков в счётчик успеха. Delete падает, если ресурс или любой потомок это site_start, error_page или site_unavailable_page. Create и move отказывают для удалённого родителя.

Как проверить

  1. Создайте родителя с дочерним. Поставьте чекбокс Deleted на форме родителя и сохраните. Оба должны быть удалены с заполненными deletedon / deletedby.
  2. Восстановите только дочерний из корзины. Родитель тоже должен восстановиться.
  3. Удалите родителя с дочерним, затем purge только родителя. Счётчик в сообщении должен включать дочернего, обе строки должны исчезнуть.
  4. Переместите ресурс site_start (или 404 / unavailable) под папку и попробуйте удалить папку. Delete должен отказать. Та же проверка уже блокирует удаление такой страницы на корневом уровне.
  5. Попробуйте создать ресурс под удалённым родителем. Create должен отказать.

Gate E (этот запуск):

  • php -l на затронутых процессорах: exit 0
  • core/vendor/bin/phpunit -c _build/test/phpunit.xml --filter 'ResourceUpdateDeleteCascadeTest|ResourceTrashHierarchyTest': OK (6 тестов, 64 assertions), exit 0
  • phpcs на новых файлах: 0 ошибок
  • revolution.test: восстановление дочернего восстановило родителя (id 12438/12439); удаление папки с site_start заблокировано; создание под удалённым родителем заблокировано

Связанные

Refs modxcms#14167. Связанные: modxcms#14350 перечислял удалённых дочерних в корзине.

Совместимость

Удаление через форму требует той же политики delete / undelete ресурса, что и контекстное меню.

Удаление через форму вызывает OnBeforeDocFormDelete, OnDocFormDelete и OnResourceDelete (с дочерними), как tree Delete.

Восстановление дочернего теперь также undelete удалённых предков (и вызывает OnResourceUndelete для них).

Оригинал: modxcms#17003

The Deleted checkbox on Resource/Update only flipped the current
resource, so children stayed live in the tree. Defer the flag to
Resource/Delete and Resource/Undelete so form save matches context-menu
soft-delete, including deletedon/deletedby.
Restoring a child from trash left its deleted parent in place, and
purging a parent only mentioned the parent in the success message.
Deleting a folder that contained site_start, error_page, or
site_unavailable_page also skipped the root-level protection.

Restore now undeletes the ancestor chain. Purge counts removed
descendants. Parent delete fails if the tree includes a system page.
Creating or moving under a deleted parent is refused.
Connector actions still map Resource/Delete to Processors\Resource, so
that package cannot be renamed. Exclude the soft-reserved keyword sniff
there and in the legacy processor tests.
Codecov flagged 27 uncovered patch lines. Exercise deferred Delete
failure, weblink form delete, move under a deleted parent, nested
error_page, purge of parent+child ids, and Undelete of a child.
@Ibochkarev Ibochkarev changed the title Фикс удаления ресурса, восстановления из корзины и вложенных системных страниц Fix resource delete, trash restore, and nested system pages Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant