Я использую поведение схемы без проблем, но также хочу иметь метод, который обеспечивает некоторую логику. Сейчас у меня естьИспользование поведения ловкости для предоставления метода
class IMyFoo(form.Schema):
requester = schema.TextLine(title=_(u"Requestor"),
required=False,
)
def foo(self):
""" foo """
alsoProvides(IMyFoo, IFormFieldProvider)
И в ZCML
<plone:behavior
title="My behavior"
description="Some desc"
provides=".behaviors.IMyFoo"
for=".interfaces.ISomeInterface"
/>
Я включил IMyFoo в разделе поведения типа контента в portal_types. Это дает мне схему, но не метод foo(). Так что я пытался добавить фабрику для него от чтения http://plone-training.readthedocs.org/en/latest/behaviors2.html со следующим кодом
class MyFoo(object):
def foo(self):
return 'bar'
И в ZCML
<plone:behavior
title="My behavior"
description="Some desc"
provides=".behaviors.IMyFoo"
factory=".behaviors.MyFoo"
for=".interfaces.ISomeInterface"
/>
Но это, похоже, не делать разницы, или, по крайней мере, я не знаю, как получить доступ к этому методу. Ближайший я смог прийти следующий:
class IMyFoo(Interface):
""" Marker """
class MyFoo(object):
def __init__(self, context):
self.context = context
def foo(self):
return 'bar'
<adapter for=".interfaces.ISomeInterface"
factory=".behaviors.MyFoo"
provides=".behaviors.IMyFoo" />
Я поставил IMyFoo в поведении атрибутов в ФТИ, а затем вызвать его, пройдя через все поведений с чем-то вроде
behavior = resolveDottedName(context.portal_types.getTypeInfo(context.portal_type).behaviors[-1]))
behavior(self).myfoo()
Конечно, пройти через FTI, как это, это не правильный способ сделать это. Но сейчас я в растерянности. В Archetypes я бы просто сделал класс mixin и наследовал его с любым типом контента, который я хотел использовать. Я мог бы сделать то же самое здесь, но я понимаю, что поведение должно быть заменой для них, поэтому я хотел бы выяснить, как использовать этот предпочтительный метод.
Возможно, мне нужно просто просматривать браузер? Мне не нужно ничего делать с объектом запроса, так что это выглядит немного глупо, но это сработает. – Esoth