Я запускаю Plone 4.3 и пытаюсь создать собственный портлет. Портлет прост и должен позволить пользователю загружать изображение и предоставлять некоторый описательный текст, который может отображаться под изображением.Plone portlet using 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"
Это, кажется, работает, как ожидалось, и позволяет мне добавить новый портлет с названием, изображение и описание изображения. Тем не менее, я читал документы, и я не мог найти много примеров создания портлета с полем загрузки изображений, поэтому может быть лучший способ сделать это.
Моя проблема заключается в том, что я не могу изобразить изображение в шаблоне. Я со ссылкой на документы в 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>
Никакой определенный ответ не приходит в голову сразу, но я вижу, в чем проблема. Проблема в том, что поле изображения определено в портлете, но код шаблона пытается получить его из контекста, поэтому из элемента контента. Этот элемент содержимого не имеет поля myimage, поэтому условие tal: false является ошибочным и атрибут src тоже не работает. Вы можете начать с изменения «context/myimage» на «view/image» и посмотреть, сможете ли вы оттуда уйти. – maurits
См. Пакет imageportlet на Github, решая именно эту проблему. –
@MikkoOhtamaa. Я замечаю, что вы реализуете интерфейс ImageScaleTraversable в коде портлета. Есть ли у вас пример использования этой функции масштабирования в шаблоне? – manicminer