python - 如何在Plone中注入(inject)模板代码?

标签 python html templates plone zope

我的目标是在 Plone 文章前(页面标题和第一段之间)注入(inject)一些HTML 代码?我正在运行 Plone 4。有人知道如何实现这一点吗?

另一个问题是:是否可以在每篇 Plone 文章中随机放置一些 HTML 代码?

最佳答案

使用viewlets对于这两个用例。 Viewlet 可以插入呈现页面的不同部分,具体取决于您将其注册到的 Viewlet 管理器以及 Viewlet 适用的界面。

viewlet 管理器决定了 viewlet 插入的位置,而你注册 viewlet 的接口(interface)决定了 viewlet 将在什么样的 URL 上可见。注册 "*" 意味着到处显示,注册 "Products.ATContentTypes.interfaces.IATDocument" 意味着它只会在查看页面时可见。

要查看哪些 viewlet 管理器可用以及哪些 viewlet 在那里注册,对于任何给定的 URL,只需将“/@@manage-viewlets”添加到 URL。在那里你可以看到有一个 plone.abovecontent 和一个 plone.abovecontenttitle View 管理器,可以让你在那里插入 HTML。其中大部分都在 plone.app.layout 包中定义,您需要在那里找到使用该名称注册的接口(interface)(在构建的 eggs 目录中找到它)。

您使用 ZCML 注册一个 viewlet,因此您需要已经为您的站点加载了一个 python 包。要插入任意模板,只需使用 browser:viewlet 指令注册它:

<browser:viewlet
    name="your.html.snippet"
    for="Products.ATContentTypes.interfaces.IATDocument"
    manager="plone.app.layout.viewlet.interfaces.IAboveContent"
    template="htmlsnippet.pt"
    permission="zope.Public"
    />

现在,一个基于htmlsnippet.pt 模板的viewlet 被注册到plone.abovecontent viewlet 管理器。该模板是一个完整的 zope 页面模板,因此您可以在其中使用诸如国际化之类的东西:

<div i18n:domain="your">
    <h3 i18:translate="html_snippet_header">This is a snippet of HTML that'll be injected into all Pages!</h3>
</div>

您还可以添加一个完整的浏览器 View 类来支持 View ,模板可以通过“view/”命名空间访问该类,因此您可以在那里添加一个方法来返回要插入的随机文本。

您可以通过上述“/@@manage-viewlets”URL 手动启用 viewlet,也可以使用 GenericSetup 配置文件,其中 viewlets.xml 让您管理 viewlet 的注册和排序:

<?xml version="1.0"?>
<object>
  <order manager="plone.abovecontent" skinname="My Theme"
         based-on="Plone Default">
    <viewlet name="your.html.snippet" insert-before="*"/>
  </order>
</object>

有关更多信息,请参阅 viewlets tutorial在 Plone.org 上。

关于python - 如何在Plone中注入(inject)模板代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6503861/

相关文章:

python - Pygame 显示不更新

c++ - 用于多个组件的索引技巧

python - 如何在 Google App Engine 上导入文本文件?

python - self = None 有什么作用?

python - miniconda 安装会影响标准 python 安装吗?

javascript - 箭头键在输入和文本区域中不起作用

html - 我如何摆脱网页上的多余空间?

javascript - 在提交表单之前在客户端散列密码的简单方法

c++ - 模板类 <T> 中的 std::map 键为 <T>

C++ 编译时程序范围内的唯一编号