如何在Plone中注入模板代码?
我的目标是在每篇 Plone 文章的前面插入一些 HTML 代码,也就是在页面的标题和第一段之间。我现在使用的是 Plone 4。有没有人能给我一些建议,怎么实现这个?
还有一个问题是:有没有办法在每篇 Plone 文章中随机放一些 HTML 代码?
2 个回答
也许你可以从JavaScript的角度来考虑这个问题?很多应用都有一个全局的JavaScript文件,这个文件会在所有页面中被引入。你可以从这个文件入手,轻松地修改网页的结构和内容。
可以使用视图小部件(viewlets)来处理这两种情况。视图小部件可以插入到页面的不同部分,这取决于你将它注册到哪个视图小部件管理器,以及这个视图小部件适用于哪些接口。
视图小部件管理器决定了视图小部件插入的位置,而你为视图小部件注册的接口则决定了它会在什么样的URL上可见。如果你注册为"*"
,那么它会在任何地方显示;如果注册为"Products.ATContentTypes.interfaces.IATDocument"
,那么它只会在查看页面时可见。
要查看有哪些视图小部件管理器可用,以及在特定URL下注册了哪些视图小部件,只需在URL后面加上“/@@manage-viewlets”。在这里你可以看到有plone.abovecontent
和plone.abovecontenttitle
这两个视图小部件管理器,它们可以让你在这些位置插入HTML。大多数这些管理器是在plone.app.layout
包中定义的,你需要在那个包中找到注册的接口(可以在你的buildout的egg目录中找到)。
你需要使用ZCML来注册视图小部件,所以你需要先有一个为你的网站加载的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
模板的视图小部件已经为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>
你还可以添加一个完整的浏览器视图类来支持这个视图小部件,模板可以通过“view/”命名空间访问这个类,因此你可以在这里添加一个方法来返回随机文本进行插入。
你可以通过前面提到的'/@@manage-viewlets' URL手动启用视图小部件,或者使用GenericSetup配置文件,在viewlets.xml中管理视图小部件的注册和顺序:
<?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上的视图小部件教程。