gpt4 book ai didi

plone - 使用灵巧行为提供方法

转载 作者:行者123 更新时间:2023-12-02 08:29:50 24 4
gpt4 key购买 nike

我一直在使用一个没有问题的模式行为,但我还想有一个提供一些逻辑的方法。现在我有

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 放在 fti 的行为属性中,然后通过遍历所有行为来调用它,例如

behavior = resolveDottedName(context.portal_types.getTypeInfo(context.portal_type).behaviors[-1]))
behavior(self).myfoo()

当然,像那样通过 FTI 并不是正确的做法。但我现在不知所措。在 Archetypes 中,我只创建一个 mixin 类,然后用我想使用的任何内容类型继承它。我可以在这里做同样的事情,但我的理解是行为应该是它们的替代品,所以我想弄清楚如何使用这种首选方法。

最佳答案

正如您所发现的,模式类实际上只是一个接口(interface)。它不能提供任何方法。要提供更多功能,您需要将您的行为接口(interface)连接到一个工厂类,该工厂类采用敏捷对象来提供您的接口(interface)。

因此,如果您的 behaviors.py 如下所示:

# your imports plus:
from plone.dexterity.interfaces import IDexterityContent
from zope.component import adapts
from zope.interface import implements

class IMyFoo(form.Schema):
requester = schema.TextLine(
title=_(u"Requestor"),
required=False,
)

def foo(self):
""" foo """

alsoProvides(IMyFoo, IFormFieldProvider)

class MyFoo(object):
implements(IMyFoo)
adapts(IDexterityContent)

def __init__(self, context):
self.context = context

def foo(self):
return 'bar'

那么您的唯一 zcml 声明将是:

<plone:behavior
title="My behavior name"
description="Behavior description"
provides=".behavior.IMyFoo"
factory=".behavior.MyFoo"
for="plone.dexterity.interfaces.IDexterityContent"
/>

并且,您将使用如下代码访问您的方法:

IMyFoo(myFooishObject).foo()

注意 IDexterityContent 的使用。您正在创建可应用于任何敏捷内容的行为。因此,行为适配器应该用于非常通用的接口(interface)。

关于plone - 使用灵巧行为提供方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com