如何在Plone中注入模板代码?

时间:2011-06-28 08:44:33

标签: python html templates plone zope

我的目标是在每个 Plone文章(页面标题和第一段之间)之前注入一些HTML代码?我正在运行Plone 4.有没有人对如何实现这一点有所暗示?

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

2 个答案:

答案 0 :(得分:11)

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

Viewlet管理器确定插入Viewlet的位置,以及注册Viewlet的接口确定Viewlet在哪种URL可见。注册"*"表示无处不在,并为"Products.ATContentTypes.interfaces.IATDocument"注册表示只有在查看网页时才会显示。

要查看哪些Viewlet管理器可用以及在那里注册了哪些Viewlet,对于任何给定的URL,只需在URL中添加“/ @@ manage-viewlets”即可。在那里,您可以看到有一个plone.abovecontent和一个plone.abovecontenttitle Viewlet管理器,可以让您在那里插入HTML。其中大部分是在plone.app.layout包中定义的,你需要在那里找到用该名称注册的界面(在buildout的egg目录中找到它)。

您使用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模板的视图。该模板是一个完整的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>

您还可以添加完整的浏览器视图类来备份Viewlet,模板可以通过“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>

有关详细信息,请参阅Plone.org上的viewlets tutorial

答案 1 :(得分:-1)

也许你可以通过Javascript方式解决这个问题?很多应用程序都有一个全局的js文件,它包含在所有页面中。从那开始,您可以轻松修改DOM。