我正在運行Plone 4.3並試圖創建一個自定義portlet。該portlet非常簡單,應該允許用戶上傳圖像並提供一些可以在圖像下顯示的描述性文本。Plone portlet使用plone.namedfield.field.NamedImage
這裏是我到目前爲止的代碼:
from zope.interface import implements
from zope.formlib import form
from zope import schema
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from plone.app.portlets.portlets import base
from plone.memoize.instance import memoize
from plone.namedfile.field import NamedImage
from plone.directives import form
from z3c.form import field
from plone.app.portlets.browser import z3cformhelper
class IMyImagePortlet(form.Schema):
myimagetitle = schema.TextLine(
title=u"Image title",
description=u"Enter the image title",
default=u"",
required=True)
myimagedescription = schema.TextLine(
title=u"Image text",
description=u"Enter the text which appears below the image",
default=u"",
required=True)
myimage = NamedImage(
title=u"My image",
description=u"Upload an image",
required=True)
class Assignment(base.Assignment):
implements(IMyImagePortlet)
header = u"My Image"
myimagetitle = u""
myimagedescription = u""
myimage = u""
def __init__(self, myimagetitle=None, myimagedescription=None, myimage=None):
self.myimagetitle = myimagetitle
self.myimagedescription = myimagedescription
self.myimage = myimage
@property
def title(self):
"""This property is used to give the title of the portlet in the
"manage portlets" screen.
"""
return u"My image"
class Renderer(base.Renderer):
_template = ViewPageTemplateFile('templates/myimage_portlet.pt')
def __init__(self, *args):
base.Renderer.__init__(self, *args)
@memoize
def myimagetitle(self):
return self.data.myimgaetitle
@memoize
def myimagedescription(self):
return self.data.myimagedescription
@memoize
def myimage(self):
return self.data.myimage
def render(self):
return self._template()
class AddForm(z3cformhelper.AddForm):
fields = field.Fields(IMyImagePortlet)
label = u"Edit image"
description = u"A portlet which can display image with text"
def create(self, data):
return Assignment(**data)
class EditForm(z3cformhelper.EditForm):
fields = field.Fields(IMyImagePortlet)
label = u"Edit image"
description = u"A portlet which can display image with text"
這似乎按預期方式工作,並允許我補充一個新的portlet有一個標題,圖像和圖像描述。但是,我一直在閱讀文檔,並且找不到很多使用圖像上傳字段創建portlet的示例,因此可能有更好的方法。
我的問題是,我似乎無法在模板中呈現圖像。我已經提到的文檔在https://developer.plone.org/reference_manuals/external/plone.app.dexterity/advanced/files-and-images.html,並在我的模板以下,但不顯示圖像:
<div tal:define="picture nocall:context/myimage"
tal:condition="nocall:picture">
<img tal:attributes="src string:${context/absolute_url}/@@download/myimage/${picture/filename};
height picture/_height | nothing;
width picture/_width | nothing;"
/>
</div>
沒有明確的答案立刻浮現在腦海,但我可以看到的問題是什麼。問題是圖像字段是在portlet中定義的,但是模板代碼試圖從上下文中獲取它,所以從內容項中獲取它。此內容項目沒有myimage字段,因此tal:condition爲false,並且src屬性也會失敗。您可以先將「context/myimage」更改爲「view/image」,然後查看您是否可以從這裏開始工作。 – maurits
請參閱GitHub上的imageportlet包,以解決此問題 –
@MikkoOhtamaa我注意到您正在portlet代碼中實現IImageScaleTraversable接口。你有一個如何在模板中使用這個縮放功能的例子嗎? – manicminer