通过使用发布后钩子将xdv交付实现与Plone集成,以转换内容
项目描述
已将XDV重命名为Diazo,此包已由plone.app.theming替换。有关更多信息,请访问Diazo网站或plone.app.theming PyPI页面。
简介
本软件包提供了一种使用XDV引擎开发和使用Plone主题的简单方法。如果您不熟悉XDV或基于规则的样式,请查看XDV文档。
安装
collective.xdv 依赖于
plone.transformchain 以将转换钩入发布者
plone.registry 和 plone.app.registry 以管理设置
plone.autoform、plone.z3cform 和 plone.app.z3cform 以渲染控制面板
five.globalrequest 和 zope.globalrequest 用于内部请求访问
XDV,包含XDV本身
lxml 执行最终转换
如果您使用 zc.buildout 并遵循安装说明,这些都将自动安装。
要将 collective.xdv 安装到您的 Plone 实例中,在文件系统中找到您的 Plone 实例目录根目录中的 buildout.cfg 文件,并使用文本编辑器打开它。找到类似以下内容的部分
# extends = http://dist.plone.org/release/3.3/versions.cfg extends = versions.cfg versions = versions
它也可能在“extends”部分有一个 URL,类似于取消注释的第一行,这取决于您是从网络还是本地拉取 Plone 配置。
要将 collective.xdv 添加到我们的设置中,我们需要一些不同版本的几个包,因此我们使用 good-py 服务的版本列表扩展基本配置,因此更改配置的这一部分,使其看起来像这样
extends = versions.cfg http://good-py.appspot.com/release/collective.xdv/1.0?plone=3.3.5 versions = versions
注意,上述 URL 的最后一部分在?之前是 xdv 版本号。在您阅读此内容时可能会有更新的版本,因此请查看概述页面以获取已知的好版本集。
将?plone=3.3.5替换为您正在使用的 Plone 版本。这将根据您的 Plone 选择适当的依赖版本。
这里发生的情况是,collective.xdv 的依赖列表通过 good-py URL 为您指定了一些新版本。这样,您不必担心获取正确的版本,Buildout 会为您处理。
下一步是将实际的 collective.xdv 扩展程序添加到 buildout.cfg 的“eggs”部分。查找类似以下内容的部分
eggs = Plone
如果您已经安装了其他扩展程序,此部分可能还有其他行。只需将 collective.xdv 在单独的一行上添加,如下所示
eggs = Plone collective.xdv [Zope2.10]
注意使用了 [Zope2.10] 额外选项,它将 ZPublisherEventsBackport 包引入以与 Zope 2.12/Plone 4 保持向前兼容性。如果您正在使用 Zope 2.12 或更高版本(例如,与 Plone 4 一起使用),则应执行以下操作
eggs = Plone collective.xdv
请注意,不需要添加 ZCML slug,因为 collective.xdv 使用 z3c.autoinclude 来自动配置自己。
一旦您已将此行添加到配置文件中,现在是时候运行 buildout,以便系统为您添加和设置 collective.xdv。转到命令行,并从您的 Plone 实例根目录(与 buildout.cfg 所在的目录相同)运行 buildout,如下所示
$ bin/buildout
您将看到类似于以下内容的输出
Getting distribution for 'collective.xdv==1.0'. Got collective.xdv 1.0. Getting distribution for 'plone.app.registry'. Got plone.app.registry 1.0a1. Getting distribution for 'plone.synchronize'. Got plone.synchronize 1.0b1. ...
如果一切按计划进行,现在您已经在您的 Zope 实例中安装了 collective.xdv。
接下来,启动 Zope,例如使用以下命令
$ bin/instance fg
然后以管理员身份进入Plone中的“插件”控制面板,安装“XDV主题支持”产品。此时您应该会在Plone站点的设置中注意到一个新的“XDV主题”控制面板。
使用
在“XDV主题”控制面板中,您可以设置以下选项
- 启用/禁用
是否启用转换。
- 域名
将匹配HOST头以确定是否应用主题的域名列表(包括端口)。请注意,127.0.0.1永远不会被样式化,以确保始终有方法回到Plone来更改这些设置。然而,“localhost”应该可以正常工作。
- 主题
指向主题文件的文件路径或URL。这只是一个静态HTML文件。
- 规则
规则XML文件的文件系统路径。
- 备用主题
备用主题和规则文件的路径定义列表。应采用“路径 主题 规则”的形式,其中路径可以使用正则表达式语法,主题是主题模板的文件路径或URL,规则是规则文件的文件路径。如果主题或规则字符串以“python://”开头,则执行路径解析,例如,您可以引用主题包中的主题文件,如python://yourtheme.xdvtheme/static/page.html。
- XSLT扩展文件
可以扩展XDV以自定义XSLT文件。如果您有此类文件,请在此处提供其URL。
- 绝对前缀
如果提供,则主题HTML文件中的任何相对URL(在<img>、<link>、<style>或<script>标签中)在编译主题时将被此URL片段前缀。这使得在文件系统上使用相对路径来开发主题HTML/CSS变得更容易,同时这些路径在服务器上的任何URL上仍然有效。
- 无样式路径
用于提供不会在启用XDV的情况下进行样式的页面URL模式列表(使用正则表达式语法)。默认情况下,这包括对于Kupu编辑器必要且用于ZMI的manage_*页面,即“emptypage”视图。
请注意,当Zope处于调试模式时,主题将在每次请求时重新编译。在非调试模式下,它将在启动时编译一次,并且只有在控制面板值更改时才会重新编译。
Python软件包中的资源
在指定规则、主题和/或XSLT扩展文件时,您通常应使用文件路径。如果您正在使用Distribute/setuptools安装Python包来分发您的主题(例如,通过buildout安装的标准Plone包),则可以使用特殊的python URL方案来引用您的文件。
例如,如果您的包名为my.package并且它包含一个名为mytheme的目录,您可以在该文件中引用rules.xml文件
``python://my.package/mytheme/rules.xml``
这将由collective.xdv解析为绝对file:// URL。
静态文件和CSS
通常,主题会引用静态资源,如图像或样式表。通常,最好将所有这些资源都保存在一个单独的顶级目录中,以最大限度地减少与Plone内容路径冲突的风险。
如果您使用的是独立的Zope/Plone,您需要通过Zope使您的静态资源可用,或者从单独的(子)域中提供它们。这里您有几个选择
通过Plone创建静态资源作为文件内容对象。
在ZMI中的portal_skins/custom文件夹内创建资源。
通过文件系统产品安装资源。
如果您将主题作为Python包分发,后者是最合适的选项。在这种情况下,您可以在ZCML中注册资源目录,如下所示
<configure xmlns="http://namespaces.zope.org/zope" xmlns:browser="http://namespaces.zope.org/browser"> ... <browser:resourceDirectory name="my.package" directory="mytheme" /> ... </configure>
mytheme目录应与configure.zcml文件位于同一目录。现在您可以在这里放置您的主题、规则和静态资源。
如果您确保您的主题只使用相对URL来引用所需的样式表、JavaScript文件或图像(包括从样式表中引用的),现在您应该可以通过访问类似以下URL的方式查看您的静态主题:
https://127.0.0.1:8080/Plone/++resource++my.package/theme.html
现在您可以设置“绝对前缀”配置选项为“/++resource++my.package”。XDV会将这些相对URL转换为带有此前缀的适当绝对URL。
如果您在Zope前面放置了Apache、nginx或IIS,您可能希望直接从Web服务器提供静态资源。
使用portal_css管理您的CSS
Plone的“资源注册表”,包括portal_css工具,可以用来管理CSS样式表。这比在模板中简单链接样式表提供了几个优点,例如:
对样式表的顺序进行详细控制
合并样式表以减少渲染页面所需的下载次数
即时样式表压缩(例如,移除空白符)
基于表达式包含或排除样式表的能力
通常最好(有时是绝对必要的)保持主题文件不变,但您仍然可以使用portal_css来管理您的样式表。窍门是移除主题的样式,然后包含来自Plone的所有样式。例如,您可以添加以下规则:
<drop theme="/html/head/link" /> <drop theme="/html/head/style" /> <!-- Pull in Plone CSS --> <append theme="/html/head" content="/html/head/link | /html/head/style" />
<append />规则中的“或”表达式用于内容意味着保持精确的顺序。
有关如何使用GenericSetup在产品安装时注册样式表的示例,请参见下文。简而言之 - 在您的GenericSetup配置文件目录中使用cssregistry.xml导入步骤。
然而,有一个重要的注意事项。您的样式表可能包含以下形式的相对URL引用:
background-image: url(../images/bg.jpg);
如果您的样式表位于资源目录中(例如,它已注册在portal_css中,ID为++resource++my.package/css/styles.css),只要注册表(和Zope)处于调试模式,这将正常工作。相对URL将由浏览器解析为++resource++my.package/images/bg.jpg。
然而,您可能会发现当注册表放入生产模式时,相对URL会中断。这是因为资源合并也会更改样式表的URL,使其类似于:
/plone-site/portal_css/Suburst+Theme/merged-cachekey-1234.css
为了纠正这一点,您有几个选择:
将您的静态样式表替换为动态样式表,这样您就可以在运行时计算它相对于绝对路径。这显然不会在您想要独立查看主题的情况下工作。
更改您的URL以使用绝对路径,例如/++resource++my.theme/images/bg.jpg。同样,这将破坏原始样式表。然而,您可以创建一个仅适用于Plone的覆盖样式表,覆盖使用url()的每个CSS属性。
避免为您的静态样式表使用portal_css。
使用Plone 4。:-) 在Plone 4(b3及以后版本)中,portal_css工具有一个选项可以解析样式表中的相对URL并基于样式表的调试模式URL应用绝对前缀。该选项在cssregistry.xml语法中称为applyPrefix。
控制Plone的默认CSS
有时在样式化站点中显示一些Plone的CSS很有用。您可以通过使用XDV <append />规则或类似的规则来复制从Plone生成的<head />中的CSS到主题中实现这一点。您可以使用portal_css工具关闭您不想要的样式表。
然而,如果您还希望网站在不带主题模式(例如,在单独的URL上)时也能使用,您可能希望在使用XDV时启用更大的一组样式。为了使这更容易,您可以在portal_css工具(以及portal_javascripts,portal_kss)、portal_actions、页面模板和其他使用TAL表达式语法的位置使用以下表达式作为条件。
request/HTTP_X_XDV | nothing
此表达式将返回True,如果XDV当前已启用,则设置HTTP头“X-XDV”。默认情况下,这将检查XDV控制面板中的“启用”标志和当前域。如果您稍后将在nginx等前置Web服务器上部署主题,您可以在那里设置相同的请求头以获得相同的效果,即使collective.xdv已卸载。
使用
not: request/HTTP_X_XDV | nothing
来“隐藏”主题网站的样式表。
工作示例
设置XDV主题的方式有很多。例如,您可以将主题和规则作为Plone中的内容上传,并使用绝对路径来配置它们。您也可以从单独的静态Web服务器提供它们,甚至从文件系统加载它们。
但是,要创建可部署的主题,通常最好创建一个简单的Python包。这也为与主题相关的自定义(如模板覆盖)提供了一个自然的家。
尽管详细的教程超出了本帮助文件的范畴,但下面展示了一个简短的、实际操作的示例。
创建一个包并将其安装到您的buildout中
$ cd src $ paster create -t plone my.theme
有关详细信息,请参阅buildout手册
如果您安装了较新的ZopeSkel,这应该会工作。选择easy模式。当被问及是否要注册配置文件时,请回答“是”。
然后编辑buildout.cfg,将您的新包(如上例中的my.theme)添加到develop和eggs列表中。
编辑新创建的包中的setup.py
install_requires列表应该是
install_requires=[ 'setuptools', 'collective.xdv', ],
重新运行buildout
$ bin/buildout
编辑新创建的包中的configure.zcml
在<configure />标签内添加资源目录。注意,您可能需要添加如上所示的browser命名空间。
- <configure
xmlns=”http://namespaces.zope.org/zope” xmlns:browser=”http://namespaces.zope.org/browser” xmlns:i18n=”http://namespaces.zope.org/i18n” xmlns:genericsetup=”http://namespaces.zope.org/genericsetup” i18n_domain=”my.theme”>
- <genericsetup:registerProfile
name=”default” title=”my.theme” directory=”profiles/default” description=”Installs the my.theme package” provides=”Products.GenericSetup.interfaces.EXTENSION” />
- <browser:resourceDirectory
name=”my.theme” directory=”static” />
</configure>
在此处,我们使用了包名my.theme作为资源目录的名称。根据需要调整。
在configure.zcml旁边添加一个static目录。
将您的主题和规则文件放在这个目录中。
例如,您可能有一个引用子目录images/中的图片和子目录css/中的样式表的theme.html。将此文件和两个目录放在新创建的static目录中。
确保主题使用相对URL(例如,<img src="images/foo.jpg" />)来引用其资源。这意味着您可以从文件系统打开主题并查看其华丽之处。
还放置一个rules.xml文件。有关其语法的详细信息,请参阅XDV文档。如果您只想测试,可以开始使用一些非常简单的规则。
<?xml version="1.0" encoding="UTF-8"?> <rules xmlns="http://namespaces.plone.org/xdv" xmlns:css="http://namespaces.plone.org/xdv+css"> <!-- Head: title --> <replace theme="/html/head/title" content="/html/head/title" /> <!-- Base tag --> <replace theme="/html/head/base" content="/html/head/base" /> <!-- Drop styles in the head - these are added back by including them from Plone --> <drop theme="/html/head/link" /> <drop theme="/html/head/style" /> <!-- Pull in Plone CSS --> <append theme="/html/head" content="/html/head/link | /html/head/style " /> </rules>
这些规则将引入<title/>标签(即浏览器窗口的标题)、<base/>标签(某些Plone URL正常运行所必需的),以及Plone的样式表。
下面有一些更有用的规则。
创建安装配置文件
上面为<genericsetup:registerProfile/>标签生成的代码包含对目录profiles/default的引用。如果它尚未存在,您可能需要将其创建在configure.zcml旁边,即创建一个新的目录profiles,并在其中创建另一个目录default。
在这个目录中,添加一个名为metadata.xml的文件,包含以下内容
<metadata> <version>1</version> <dependencies> <dependency>profile-collective.xdv:default</dependency> </dependencies> </metadata>
这将在我.theme通过附加控件面板安装时将collective.xdv安装到Plone中。
此外,创建一个名为registry.xml的文件,内容如下
<registry> <!-- collective.xdv settings --> <record interface="collective.xdv.interfaces.ITransformSettings" field="domains"> <value> <element>domain.my:8080</element> </value> </record> <record interface="collective.xdv.interfaces.ITransformSettings" field="rules"> <value>python://my.theme/static/rules.xml</value> </record> <record interface="collective.xdv.interfaces.ITransformSettings" field="theme"> <value>python://my.theme/static/theme.html</value> </record> <record interface="collective.xdv.interfaces.ITransformSettings" field="absolute_prefix"> <value>/++resource++my.theme</value> </record> </registry>
将my.theme替换为您自己的包名,并根据需要将rules.xml和theme.html替换为适当的内容。
此文件配置了XDV控件面板背后的设置。
提示:如果您已经玩过控件面板并想要导出设置,您可以在ZMI中的portal_setup工具中创建一个快照。检查创建的registry.xml文件,并挑选出与collective.xdv相关的记录。您应该从导出中删除<field/>标签,这样您就只剩下如上所示<record/>和<value/>标签。
此外,在profiles/default目录中添加一个cssregistry.xml以配置portal_css工具
<?xml version="1.0"?> <object name="portal_css"> <!-- Set conditions on stylesheets we don't want to pull in --> <stylesheet expression="not:request/HTTP_X_XDV | nothing" id="public.css" /> <!-- Add new stylesheets --> <!-- Note: applyPrefix is not available in Plone < 4.0b3 --> <stylesheet title="" authenticated="False" cacheable="True" compression="safe" conditionalcomment="" cookable="True" enabled="on" expression="request/HTTP_X_XDV | nothing" id="++resource++my.theme/css/styles.css" media="" rel="stylesheet" rendering="link" applyPrefix="True" /> </object>
这展示了如何对现有的样式表设置条件,以及如何注册一个新的样式表。我们在这里将applyPrefix设置为True,如上所述。这仅在Plone 4.b3及更高版本中有效。对于早期版本,只需将其删除即可。
测试
启动Zope并访问您的Plone站点。您的新包应显示在附加产品控件面板中的可安装状态。安装后,它应将collective.xdv作为依赖项安装,并预先配置它使用您的主题和规则集。默认情况下,主题是禁用的,因此您需要前往控件面板将其打开。
您现在可以通过以下URL比较您未修改的主题、未加样式的Plone站点和加样式的站点
https://127.0.0.1:8080(或您已配置为样式化域的任何内容)用于样式化的Plone。如果您使用了上面的示例规则,这将几乎与您的主题完全相同,但<title/>标签(通常显示在您的网络浏览器标题栏中)取自Plone。
http://127.0.0.1:8080(假设这是Plone运行的端口)用于未加样式的Plone。
https://127.0.0.1:8080/++resource++my.theme/theme.html用于原始主题。这是一个静态资源,几乎就像它是在文件系统中打开的一样。
常见规则
要复制页面标题
<!-- Head: title --> <replace theme="/html/head/title" content="/html/head/title" />
要复制<base/>标签(对于Plone的链接正常工作所必需的)
<!-- Base tag --> <replace theme="/html/head/base" content="/html/head/base" />
要从主题中删除所有样式和JavaScript资源,并从Plone的portal_css工具中复制它们
<!-- Drop styles in the head - these are added back by including them from Plone --> <drop theme="/html/head/link" /> <drop theme="/html/head/style" /> <!-- Pull in Plone CSS --> <append theme="/html/head" content="/html/head/link | /html/head/style" />
要复制Plone的JavaScript资源
<!-- Pull in Plone CSS --> <append theme="/html/head" content="/html/head/script" />
要复制<body/>标签的类(对于某些Plone JavaScript功能和样式正常工作所必需的)
<!-- Body --> <prepend theme="/html/body" content="/html/body/attribute::class" />
其他技巧
Firebug是一个在构建规则时检查主题和内容的优秀工具。它甚至有一个XPath提取器。
阅读关于XPath的内容。它不像看起来那么复杂,而且非常强大。
在开发过程中以调试模式运行 Zope,这样你就不需要重启来查看主题、规则或资源的更改。
变更日志
1.0rc11 - 2010-09-05
添加法语翻译,使用 Python 文件中的真实 msgid,并清理过时的日语翻译。[laz]
不要格式化打印输出 - 这可能会破坏浏览器的渲染,并引入不必要的空白。[elro]
修复 Windows 上的 python:// URL 解析。[optilude]
明确空间分隔符警告。[fvandijk]
1.0rc10 - 2010-08-05
使用 plone.subrequest。[elro]
使用空格作为备用主题的分隔符。“|”在正则表达式中很常见。[elro]
支持 XDV 0.4 <theme> 指令,因此设置中不需要主题。[elro]
修复外部包含的网络(http/https)URL的解析。[elro]
1.0rc9 - 2010-08-05
在 Plone 网站根目录上使用 IBeforeTraverseEvent 而不是 IPubAfterTraversal 事件来挂钩 X-XDV 请求头。这使得头信息在 404 错误页面上也能工作。[optilude]
将 collective.directoryresourcepatch 添加到 Zope2.10 的附加组件中。这允许在运行 Plone 3/Zope 2.10 时遍历子目录。[dunlapm]
要求 lxml>=2.2.4。Zope2 KGS 列出 lxml=2.2,这是一个在无效 HTML 上产生错误的版本。[elro]
修复 extra.xsl 支持。[elro]
1.0rc8 - 2010-05-24
支持使用虚拟主机和子路径来设计网站。https://bugs.launchpad.net/xdv/+bug/517244 [elro]
为 TinyMCE 添加排除项。https://bugs.launchpad.net/xdv/+bug/527807 [elro]
1.0rc7 - 2010-05-23
升级说明:在附加组件控制面板中重新安装产品。
始终开启 XInclude 处理。[elro]
修复 Windows 安装。要在 Windows 上运行 Plone 4,你必须指定
[versions] lxml = 2.2.4
直到发布新的 lxml Windows 二进制 egg。[elro]
而不是使用外部解析器,让 lxml 读取网络。现在你必须明确在控制面板中启用 Read network。[elro]
1.0rc6 - 2010-05-21
修复转换缓存,以考虑同一网站的 不同虚拟主机,并使缓存失效在 ZEO 客户端之间生效。[elro]
1.0rc5 - 2010-04-21
通过 href 机制修复 Plone 内部内容包含,包括在 hrefs 中使用相对路径。[optilude]
确保即使在虚拟主机场景中,网站根目录的绝对路径为“/”时,绝对前缀也能正常工作。[optilude]
添加事件处理器,如果为入站域名启用了 XDV,则将 HTTP 请求头“X-XDV”设置为。这可以用作例如 portal_css 中的检查,例如使用 TALES 表达式“request/HTTP_X_XDV | nothing”。现在 @@xdv-check/enabled 方法仅检查该变量的存在。这个想法是在禁用 collective.xdv 的纯-XSLT 部署场景中更容易复制,例如通过在 nginx 或 Apache 中设置相同的请求头。[optilude]
使所有 zope 路径相对于 Plone 网站解析。[marshalium]
添加对解析具有 http/ftp 绝对 URL 和 zope 路径的文件的支持。[marshalium]
如果需要,使 absolute_prefix 预先附加 Plone 网站路径。这意味着以“/”开头的绝对前缀始终相对于 Plone 网站根目录。[optilude]
为主题、规则和 extrauri 文件添加对 python:// 伪方案的 support。有关详细信息,请参阅 README.txt。[optilude]
改进控制面板的文字。[optilude]
修复了一个问题,即缓存转换(在非调试模式下)会泄漏到同一实例中的 Plone 网站中。[optilude]
删除 boilerplate 参数。使用 extraurl 代替。[optilude]
让 collective.xdv 依赖于新的 XDV egg,而不是 dv.xdvserver。[optilude]
仅当 collective.xdv 确实安装时才调用转换。注意:您可能需要在升级后重新安装产品。[optilude]
使用 plone.transformchain 对变换活动进行排序。其中之一是,这有助于我们避免在其他链中的其他事物更喜欢与响应的这种表示形式一起工作时重新解析/序列化 lxml 树。它还有助于控制发布后事件的顺序。[optilude]
Zope 2.12 / Plone 4 兼容性。[lrowe]
1.0rc4 - 2009-10-27
风格错误响应以及成功响应。[lrowe]
使用 ZPublisher 事件而不是 plone.postpublicationhook 以与 Zope 2.12 / Plone 4 兼容。对于 Zope2.10 / Plone 3.x,您现在必须在 buildout 中指定“collective.xdv [Zope2.10]”来引入 ZPublisherEventsBackport 包。[lrowe]
添加了对 extraurl 参数的支持 [mhora]
添加了备用主题并修改了变换,以便它可以通过路径正则表达式决定使用哪个主题和规则文件进行变换 [mhora]
将“/manage”添加到未加样式的路径默认列表中。[encolpe]
1.0a2 - 2009-07-12
跟进 plone.registry 的 API 的变化。[optilude]
1.0a1 - 2009-04-17
初始发布
项目详情
集体.xdv-1.0rc11.zip 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 306783ed18862e2c8978e1a71fdbebbaaa013d80549be00a76666272e57c28b9 |
|
MD5 | 5cbd56865ca9335b8d8b4b7fa4c299ce |
|
BLAKE2b-256 | cc9421781f48cd7f02a7aa4e927d33b26c0d06ca0a0e67021b418ef99b23491d |