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

时间:2012-02-09 10:58:43

标签: schema plone archetypes extending

使用archetypes.schemaextender,我将一个ImageField添加到ATEvent。

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

在configure.zcml中我有这个:

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

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

但是,在摘要视图中,exists:item_object / image返回False

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

2 个答案:

答案 0 :(得分:2)

如果我没记错的话,Plone中的摘要视图会检查image_thumb。 您的架构扩展器很好,但您错过了改变遍历。为此,您需要修补补丁__bobo_traverse__。看看ATContentTypes中的ATImage,看看如何做到这一点。

答案 1 :(得分:2)

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

相反,您必须调用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(),如上所述。