提供高级plone.app.theming集成的插件
项目描述
plone.app.theming 支持插件,允许主题作者将更高级的功能与其主题捆绑在一起。此包包含两个这样的插件
在启用主题时覆盖特定Zope页面模板的能力
在启用主题时,使用Zope页面模板注册提供自定义标记的视图的能力
这两个功能 仅 用于在文件系统上分发的主题(无论是Python包还是全局 themes 资源目录中的),即不适用于通过ZIP存档通过网页导入的主题。话虽如此,这些插件提供的功能在构建“客户”网站(文件系统开发可能是常态)方面可能比在分发通用主题(通过网页ZIP导入更具吸引力)更有用。
安装
依赖于以下插件的主题即使在未安装此包的情况下也能正常工作:插件配置将被简单地忽略。
要启用这些插件,必须在buildout中启用 plone.app.themingplugins 包。您可以通过以下两种方式之一实现这一点
通过在您的 buildout.cfg 文件中使用的 Zope 实例的 eggs 列表中列出 plone.app.themingplugins。
通过将 plone.app.themingplugins 添加到 setup.py 文件中的 install_requires 列表,该文件用于您 buildout 中安装的包,例如用于存放您的主题或站点的策略的包。
快速示例
假设您正在开发一个名为 my.theme 的 diazo 主题,当您的 diazo 主题被激活时,执行以下操作以覆盖 logo 视图:
将 plone.app.themingplugins 添加到 src/my.theme/setup.py 中的 install_requires 列表。
要覆盖 logo 视图,请将 plone.app.layout.viewlets.logo.pt 添加到 src/my.theme/my/theme/theme/overrides 中,并根据需要修改。
插件
Diazo 主题通过转换由 Plone(或另一个系统)生成的内容来工作。只要输出要求信息,就可以几乎无限地将其转换为主题输出。
然而,如果信息不存在,您需要以某种方式提取它,通常是通过页面模板。这可以使用标准 Python 分发的视图来完成,但 plone.app.themingplugins 提供了两种简化的机制,只需了解 TAL(Zope 页面模板语法)即可。
覆盖Zope页面模板
当在文件系统上的资源目录中分发主题时,当主题启用时,可以临时覆盖现有的 Zope 页面模板模板。如果需要更改 Plone 在视图、视图小部件或其他基于模板的资源中提供的数据,这可能很有用。
此功能依赖于 z3c.jbot。要使用它,请将一个名为 overrides 的目录添加到主题资源目录的根目录。在此目录中,可以使用命名约定 <package>.<filename>.pt 放置页面模板文件以覆盖在包 <package> 中最初找到的 <filename>.pt 模板。
例如,要覆盖 plone.app.layout.viewlets 中的 logo.pt,该文件位于 plone/app/layout/viewlets/logo.pt 内的 plone.app.layout 发行版中,您需要将 logo.pt 复制到 overrides 目录中,命名为 plone.app.layout.viewlets.logo.pt。然后您可以根据需要修改它。
注意:模板在 Zope 启动时加载。在调试模式下,模板更改会即时反映,但您需要重新启动 Zope 以获取新模板。
如果需要,可以在主题的 manifest.cfg 文件中更改 overrides 目录的名称。
[theme:overrides] directory = template-overrides
目录名称相对于主题目录。
从Zope页面模板注册新视图
当在文件系统上的资源目录中分发主题时,可以注册基于 Zope 页面模板的新视图,这些视图在主题启用时可用。
这可以用于根据 Plone 内容或设置生成额外的动态标记,通常用于主题规则中的 href,例如生成自定义导航结构或其他动态内容。
注意:这种视图注册方式不打算包含复杂逻辑。对于更高级的使用案例,建议创建一个 Python 发行版并注册标准浏览器视图。
要创建新视图,请将一个名为 views 的目录添加到您的主题资源目录的根目录,并在此处放置任意数量的 *.pt 文件。
例如,假设您在 views 目录中有一个名为 custom-menu.pt 的文件,其中包含(一个有些轻率示例)
<ul id="menu"> <li class="menuItem" tal:repeat="item context/values"> <a tal:attributes="href item/absolute_url" tal:content="item/title_or_id" /> </li> </ul>
(变量 context 和 request 在页面模板中会正常工作。)
然后你可以使用如下规则
<replace css:theme="#menu" css:content="#menu" href="./@@custom-menu" />
这将用 #menu 模板中的 #menu 替换主题中的 #menu。
注意: 如果在主题未启用时调用 @@custom-menu 视图,您将收到 404 NOT FOUND 错误。这是因为该视图注册到了为主题动态生成的浏览器层,并且仅在启用主题时自动应用。
默认情况下,视图名称是模板名称,不带 .pt 扩展名。该视图需要标准 View 权限(zope2.View),并且对所有上下文(for="*")可用。
可以通过在 views 目录中放置一个名为 views.cfg 的文件来覆盖这些默认设置。该文件应包含每个模板的一个部分,其中部分名称是模板名称,不带 .pt 扩展名。每个部分中的有效选项有
name,用于更改视图名称
permission,用于提供不同的权限名称
for,用于更改视图的上下文
class,允许视图重用现有的视图类
例如
# for my-view.pt: [my-view] name = my-view-at-root for = Products.CMFCore.interfaces.ISiteRoot permission = cmf.ManagePortal class = some.package.browser.MyView
所有选项都是可选的,包括 views.cfg 文件本身。
注意:模板在 Zope 启动时加载。在调试模式下,模板更改会即时反映,但您需要重新启动 Zope 以获取新模板。
如果需要,可以在主题的 manifest.cfg 文件中更改视图目录的名称
[theme:views] directory = template-views
目录名称相对于主题目录。
变更日志
1.1 (2019-04-26)
Python 3 兼容,代码风格。 [jensens]
1.0 (2015-08-20)
修复了视图插件设置的解析 [tlyng]
在 REAMDE 中添加了 快速示例 部分 [djowett]
1.0b1
从 plone.app.theming 分离出来的初始版本 [optilude]