#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() в (наборе идентификаторов)» Я согласен, это лучше.