使用ImageField扩展ATEvent,存在:item_object/image return False



使用prototypes.schemaextender,我向ATEvent添加了一个ImageField。

extender.py的代码可以在这里找到:http://pastealacon.com/29670

在配置.zcml中,我有这个:

<include package="archetypes.schemaextender" />
<adapter for="Products.ATContentTypes.interface.IATEvent"
    factory=".extender.ContentImageExtender" />

这项工作相当不错,当我编辑一个ATEvent时,我看到了我的领域,没有问题。

但是,在摘要视图中,存在:item_object/image return False

我认为这是因为它在对象本身上,而不是在适配器上。。。我怎样才能让它工作?

如果您想访问架构扩展字段,您不能依赖Archetypes通常会自动为您创建的访问器,因为当时Archetypers还不知道架构扩展字段。

相反,您必须调用Schema()方法,该方法将获取对象的正常模式以及所有扩展字段。从中可以获取字段并调用其访问器。

所以你可以得到这样的图像:

item_object.Schema().getField('image').getAccessor(item_object)()

我查看了folder_summary_view.pt模板,您必须将代码更改为如下所示:

<a href="#"
   tal:define="image python:item_object.Schema().getField('image');
               image python:image and image.getAccessor(item_object)();"
   tal:condition="image"
   tal:attributes="href python:test(item_type in use_view_action, item_url+'/view', item_url)">
   <img src="" alt=""
        tal:replace="structure python:path('nocall:image/tag')(scale=0.5, css_class='tileImage')" />
</a>

然后它就会起作用。

编辑:你也可以走ggozad建议的路线。在您的bobo_traverse方法中,您仍然需要通过首先调用Schema()来获取字段,正如我上面提到的那样。

如果我没记错,Plone中的摘要视图会检查image_thumb。您的模式扩展程序很好,但您错过了更改遍历的机会。为此,您需要对__bobo_traverse__进行猴子补丁。看看ATContentTypes中的ATImage,了解如何做到这一点。

相关内容

最新更新