我和我的同事正在努力调整我们为Plone 4.1开发的一些附加组件,以便在今年晚些时候将Plone环境迁移到Plone 5.这样做,我们在尝试使我们的代码适应新的Resources Registry策略时遇到了一些麻烦.在调查了一段时间后发生的事情后,我们决定在vanilla Plone环境中测试一个带有最少代码的附加组件,以确定我们在哪里做错了什么.
此加载项中文件的结构如下:
- my.package
- my
- package
- profiles
- default
- metadata.xml
- registry.xml
- uninstall
- registry.xml
- static
- css
- style.less
- __init__.py
- configure.zcml
- __init__.py
- my.package.egg-info
- setup.cfg
- setup.py
my.package.configure.zcml的内容如下:
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:five="http://namespaces.zope.org/five"
xmlns:plone="http://namespaces.plone.org/plone"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup">
<five:registerPackage package="." initialize=".initialize" />
<plone:static
directory="static"
type="plone"
name="my.package" />
<genericsetup:registerProfile
name="default"
title="my.package"
directory="profiles/default"
description="Installs my.package"
provides="Products.GenericSetup.interfaces.EXTENSION" />
<genericsetup:registerProfile
name="uninstall"
title="my.package"
directory="profiles/uninstall"
description="Uninstalls my.package"
provides="Products.GenericSetup.interfaces.EXTENSION" />
</configure>
my.package.profiles.registry.xml的内容如下:
<registry>
<records prefix="plone.resources/my-package"
interface='Products.CMFPlone.interfaces.IResourceRegistry'>
<value key="css">
<element>++plone++my.package/css/style.less</element>
</value>
</records>
<records prefix="plone.bundles/my-package"
interface='Products.CMFPlone.interfaces.IBundleRegistry'>
<value key="resources">
<element>my-package</element>
</value>
<value key="enabled">True</value>
<value key="compile">True</value>
<value key="merge_with">logged-in</value>
</records>
</registry>
my.package.static.css.style.less的内容如下:
.icon-controlpanel-resourceregistries:before { color: red; }
在我看来,其他文件的内容对此事无益(如果我错了请纠正我).
如您所见,此加载项尝试注册一个简单的Bundle,其中包含仅由一个LESS文件组成的单个Resource. (LESS文件非常简单:它只将控制面板资源注册表的图标颜色更改为红色,因此通过调用@@ overview-controlpanel视图来查看样式是否有效非常容易.
遵循http://docs.plone.org/adapt-and-extend/theming/resourceregistry.html的指令,我们尝试在“登录”捆绑聚合中注册我们的捆绑包,以最小化发送到客户端的文件数量.
“开发模式”中的一切都运行良好.一旦我们单击构建我们的bundle,就会成功编译bundle(我们确认plone.bundles / my-package.csscompilation注册表项的值已从None更改为plone static / my-package-compiled.css).
但是,一旦我们切换到生产模式,我们注意到我们的捆绑包没有合并到logged-in.css文件中,并且@@ overview-controlpanel中的图标将不再将其颜色更改为红色.
我们已经深入研究了Products.CMFPlone中的代码,试图找出发生了什么,并发现在生产模式下编写logged-in.css文件时,所有带有merge_with属性的bundle都设置为登录并且有一些为合并到文件中的csscompilation属性设置的值(请参阅Products.CMFPlone.resources.browser.combine.write_css).
但是,即使我们的bundle具有正确的merge_with属性,csscompilation也是None,这解释了为什么没有发生合并.
我们尝试了一些替代方案,但没有一个有效:
>当我们单击我们的bundle的Build按钮时,将进行构建并正确设置plone.bundles / my-package.csscompilation的值.但是它无济于事,因为生产文件不会被重写.如果文档中提到的资源注册表中有一个Merge bundle for production按钮,问题就会解决,但是我们找不到这个按钮(我们在这里缺少什么?).我们甚至测试了一个自定义BrowserView,它模拟了这样一个按钮的动作,并确认它可以工作.
>如果我们尝试在生产模式下构建bundle然后切换到开发模式并返回生产模式以重写logged-in.css文件,我们注意到plone.bundles / my-package.csscompilation的值是回到无.
再次在Products.CMFPlone的源代码中搜索,我们发现这个值被方法Products.CMFPlone.controlpanel.browser.resourceregistry.ResourceRegistryControlPanelView#save_registry改变了,在行中
self.update_registry_collection(
IBundleRegistry, "plone.bundles",
json.loads(req.get('bundles')))
由于某些未知原因,似乎请求将None值存储在其form属性中.
我们首先在香草Plone 5.0.6中测试了我们的附加组件,然后在香草Plone 5.1a2中测试了我们的附加组件.两者都表现出相同的行为.
在总结之前,让我首先强调,这只是一个简单的例子,试图调查我们在程序中是否做错了.
我们知道在这个特定的场景中,使用CSS文件而不是LESS并使用我们的Generic Setup配置文件中的csscompilation属性要容易得多.
但是,我们希望为一个场景做好准备,我们将拥有各种LESS文件,这些文件实际上使用了bundle中的plone LESS变量,并且我们可以在生产中将其合并到logged-in.css文件(或默认值).这个问题的css文件).
无论如何,我们想知道我们的程序是否有任何错误,或者这是否是Products.CMFPlone中的错误,我们应该打开报告它的票证.任何意见或建议将不胜感激!
最佳答案 您的加载项必须提供捆绑CSS的编译版本(因为将安装您的加载项的人必须能够直接在prod模式下使用它而无需访问Resource注册表并自行编译).
所以编译你的css(你可以复制你通过Resource registry编译它时得到的那个),把它放在/ static中,并添加到你的bundle:
< value key =“csscompilation”> plone static / my-package-compiled.css< / value>