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>
    




设置