提供高级 plone.app.theming 集成的插件
项目描述
plone.app.theming支持插件,允许主题作者将更高级的功能与他们的主题捆绑在一起。这个包包含两个这样的插件:
启用主题时覆盖特定 Zope 页面模板的能力
启用主题时使用 Zope 页面模板注册提供自定义标记的视图的能力
这两个都只适用于分布在文件系统上的主题(在 Python 包中或在全局主题资源目录中),即不适用于通过网络在 ZIP 存档中导入的主题。也就是说,这些插件提供的功能更有可能用于构建“客户”站点(文件系统开发可能是常态)而不是分发通用主题(通过网络 ZIP 导入更具吸引力) )。
<nav class="contents" id="contents" role="doc-toc">内容
</nav>安装
即使未安装此软件包,依赖于下面描述的插件的主题仍然可以工作:插件配置将被忽略。
要启用这些插件,必须在构建中启用plone.app.themingplugins包。您可以通过以下两种方式之一实现此目的:
通过在您的buildout.cfg文件中的 Zope 实例使用的鸡蛋列表中列出plone.app.themingplugins 。
通过将plone.app.themingplugins添加到setup.py文件中的install_requires列表中,以获取安装在构建中的包,例如用于容纳主题或站点策略的包。
快速示例
假设您正在开发一个名为 my.theme 的重氮主题,请在激活重氮主题时执行以下操作以覆盖徽标视图:
将plone.app.themingplugins添加到src/my.theme/setup.py中的install_requires列表
要覆盖 logo viewlet,请将plone.app.layout.viewlets.logo.pt添加 到 src/my.theme/my/theme/theme/overrides 并根据需要进行修改。
插件
Diazo 主题通过转换 Plone(或其他系统)生成的内容来工作。只要输出需要的信息,几乎没有限制如何将其转换为主题输出。
但是,如果信息不存在,您将需要以某种方式提取它,通常是通过页面模板。这可以使用标准 Python 发行版中的视图来完成,但plone.app.themingplugins提供了两种简化的机制,只需要了解 TAL,即 Zope 页面模板的语法。
Zope 页面模板覆盖
在文件系统的资源目录中分发主题时,可以在启用主题时临时覆盖现有的 Zope 页面模板模板。如果您需要更改 Plone 在视图、viewlet 或其他基于模板的资源中提供的数据,这将很有用。
此功能依赖于z3c.jbot。要使用它,请将名为 overrides的目录添加到主题资源目录的根目录。在此目录中,您可以使用命名约定 <package>.<filename>.pt放置页面模板文件,以覆盖最初在 包<package>中的<filename>.pt中找到的模板。
例如,要覆盖plone.app.layout.viewlets中的logo.pt(位于plone.app.layout分布中的plone/app/layout/viewlets/logo.pt中 ),您可以将logo.pt复制到 覆盖中目录为plone.app.layout.viewlets.logo.pt。然后,您可以根据需要进行修改。
注意:模板在 Zope 启动时加载。在调试模式下,模板更改会即时反映,但您需要重新启动 Zope 以获取新模板。
如果需要,可以在主题的manifest.cfg文件中更改覆盖目录名称:
[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" />
这将在呈现custom-menu.pt模板的输出中将主题中的#menu替换为#menu 。
注意:如果您在未启用主题时调用@@custom-menu视图,您将收到404 NOT FOUND错误。这是因为视图已注册到为主题动态生成的浏览器层,并且仅在启用主题时才会自动应用。
默认情况下,视图名称是模板名称,减去.pt扩展名。该视图需要标准视图权限 ( zope2.View ),并且适用于所有上下文 ( for="*" )。
这些默认值可以通过将文件views.cfg放在 views目录中来覆盖。这应该包含每个模板一个部分,其中部分名称是模板名称减去.pt扩展名。每个部分中的有效选项是:
name,更改视图名称
权限,赋予不同的权限名称
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 兼容,代码风格。[詹森]
1.0 (2015-08-20)
修复视图插件设置的解析 [tlyng]
将快速示例部分添加到 REAMDE [djowett]
1.0b1
初始版本从 plone.app.theming [optilude] 中分离出来