behavior配置实例
behavior配置实例
http://www.315ok.org/blogfolder/1007
http://www.315ok.org/logo.png
behavior配置实例
behavior配置实例
一、概念
behavior实质上是条件适配器,Dexterity框架引入behavior的目的就是最大限度实现功能模块的复用;behavior的使用,不仅方便developer,节约大量代码,同时也方便站点管理配置人员随时伸缩站点功能。
二、功能结构
behavior实现部分实际上是一个adapter,实现行为接口描述的功能,一般适配一个广义的接口,像IContentish ,IDexterityContent等。
看代码:
- 首先是接口:
# Adapter follow
class IFollowing(Interface):
followerNum = schema.Int(
title=_(u"A score from 1-100"),
readonly=True,
)
def available(userToken):
"""Evaluation of the legality of testing(existing users)
"""
def addfollow(userToken):
"""Give a positive (True) or negative (False) vote.
"""
def delFollow(userToken):
"""Give a positive (True) or negative (False) vote.
"""
class IFollowable(Interface):
"mark interface for following behavior"
- 其次是适配器代码
#-*- coding: UTF-8 -*-
from five import grok
from z3c.form import group, field
from datetime import datetime
from persistent.list import PersistentList
from plone.dexterity.interfaces import IDexterityContent
from zope.annotation.interfaces import IAnnotations
from zope.lifecycleevent.interfaces import IObjectAddedEvent
from zope.component import getUtility
from zope.component import getMultiAdapter
from Acquisition import aq_parent, aq_base, Implicit
from plone.portlets.interfaces import IPortletManager
from plone.portlets.interfaces import IPortletAssignmentMapping
from zope.container.interfaces import INameChooser
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.utils import safe_unicode
from zope.i18n import translate
from zope.i18nmessageid import Message
from zope.interface import implements
from zope.lifecycleevent.interfaces import IObjectRemovedEvent
from zope.component import adapter
from zope.interface import implementer
from emc.kb.contents.topic import Itopic
from emc.kb.contents.question import Iquestion
from emc.kb.contents.topicfolder import Itopicfolder
from emc.kb.interfaces import IFollowedEvent
from emc.kb.interfaces import IUnFollowedEvent
from emc.kb.interfaces import IFollowing,IFollowable
from emc.kb.interfaces import ICountNumEvent
from emc.kb.interfaces import PROMOTIONS_PORTLET_COLUMN
from emc.kb.portlets import relatedinformation
from plone.uuid.interfaces import IUUID
from emc.kb import _
FOLLOWED_KEY = 'emc.kb.follow'
@implementer(IFollowing)
@adapter(IDexterityContent)
class Follow(object):
# grok.provides(IFollowing)
# grok.context(Itopic)
def __init__(self, context):
self.context = context
annotations = IAnnotations(context)
if FOLLOWED_KEY not in annotations.keys():
annotations[FOLLOWED_KEY] = PersistentList()
self.followed = annotations[FOLLOWED_KEY]
#Statistics concern the number of
@property
def followerNum(self):
total = len(self.followed)
return total
#Determine whether to be concerned about
def available(self, userToken):
return not(userToken in self.followed)
# return self.followed.has_key(userToken)
#Editing statistics concern the number of
def addFollow(self, userToken):
if self.available(userToken):
self.followed.append(userToken)
else:
raise KeyError("The %s is concerned about" % userToken)
#Editing statistics concern the number of
def delFollow(self, userToken):
if not self.available(userToken):
self.followed.remove(userToken)
else:
raise KeyError("The %s is not concerned about" % userToken)
- 最后是zcml配置
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:plone="http://namespaces.plone.org/plone">
<include package="plone.behavior" file="meta.zcml" />
<plone:behavior
title="following"
description="Allow add follow for item"
provides="emc.kb.interfaces.IFollowing"
factory=".follow.Follow"
marker="emc.kb.interfaces.IFollowable"
/>
</configure>