Отображать действия только для определенных папок

#plone

#plone

Вопрос:

Я добавил пользовательское действие CMF в /mysite/portal_actions /object /rename. Значение поля «Условие (выражение)» равно python:plone_context_state.is_folderish() or plone_context_state.is_default_page() , что делает действие видимым на вкладке каждой папки. Я хочу, чтобы это отображалось только на вкладках folder1, folder2 и folder3. Что я должен использовать для поля условия?

Ответ №1:

У вас есть несколько вариантов; выражение условия может быть расширено почти бесконечно.

По идентификатору папки

Очевидным тестом было бы проверить набор идентификаторов папок:

 python:(plone_context_state.is_folderish() or plone_context_state.is_default_page()) and
        folder.getId() in ('folder1', 'folder2', 'folder3')
  

Использовать collective.flag

коллективный.флаг позволяет вашим редакторам контента определять, где должна отображаться вкладка. Это добавляет простой логический флажок к вашему содержимому, и вы можете легко проверить, установлен ли этот флаг в ваших папках. Флаг отображается только для типов контента, которые имеют правильный интерфейс, так что вы могли бы легко это сделать

 python:(plone_context_state.is_folderish() or plone_context_state.is_default_page()) and 
        folder.restrictedTraverse('@@plone_interface_info').provides('collective.flag.interfaces.IFlaggableObject')
  

Используйте тест скрипта

Вы можете использовать любой доступный метод для вашего теста, включая скрипт на Python в оболочке. Не лучшая практика, но это может просто дать вам дополнительную гибкость, в которой вы нуждаетесь.

 python:(plone_context_state.is_folderish() or plone_context_state.is_default_page()) and
        folder.yourScriptName()
  

Просто не забудьте проверить условия на folder .

Ответ №2:

python:(plone_context_state.is_folderish() и (object.getId() == ‘folder1’ или object.getId() == ‘folder2’ или object.getId() == ‘folder3’)) или (plone_context_state.is_default_page() и (plone_context_state.parent.getId() == ‘folder1’ или plone_context_state.parent.getId() == ‘папка 2’ или plone_context_state.parent.getId() == ‘папка 3’))

что-то вроде этого. Вы можете использовать путь к папке, чтобы убедиться, что это именно те папки, а не только папки с этими идентификаторами.

Комментарии:

1. 2 проблемы с этим выражением: во-первых, если это страница по умолчанию, она никогда не будет соответствовать, поскольку идентификатор страницы по умолчанию отличается от идентификатора папки, и, во-вторых, вы должны использовать, .getId() поскольку .id это почти всегда атрибут, но иногда это функция. .getId() является официальным API.

2. вот почему я указал «что-то вроде этого». Что касается страницы по умолчанию, мы должны изменить в: python:(plone_context_state.is_folderish() и (object.getId() == ‘folder1’ или object.getId() == ‘folder2’ или object.getId() == ‘folder3’)) или (plone_context_state.is_default_page() и (plone_context_state.parent.getId() == ‘папка 1’ или plone_context_state.parent.getId() == ‘папка 2’ или plone_context_state.parent.getId() == ‘папка 3’)). Мартини, ты теперь счастливее? 🙂

3. Почему бы просто не использовать folder ? В конце концов, это либо текущий объект, либо ближайший родительский объект, который является папкой! 🙂 Кроме того, почему бы не использовать .getId() в (set-of-ids)?

4. Потому что я не помнил об этом 🙂 о «.getId() в (наборе идентификаторов)» Я согласен, это лучше.