如何声明一个只对一个 plone 站点启用的订阅者?

How to declare a subscriber that will be enable for only one plone site?

在 Plone 实例中,我有两个 plone 站点。 其中之一,我有专门的产品。

我想在该产品中为 Products.PluggableAuthService.interfaces.events.IPrincipalCreatedEvent 声明一个订阅者,该订阅者将仅为该克隆站点触发。

我试过 zcml:condition="installed my.product" 但它只测试它是否可以导入,所以订阅者也可以用于另一个 plone 站点。

将第二个克隆站点移动到另一个实例不是一个选项。

谢谢。

在plone中你有Browserlayer的概念。

由于您可以通过通用设置安装浏览器层,因此您可以 activate/deactivate 每个克隆站点。

我会在订阅者中实现一个条件,它会检查是否安装了浏览器层。

Note: Browserlayers are applied on the REQUEST with a before traverse hook.

订阅者的示例函数:

from my.package.interfaces import IMyPackageLayer


def my_function(obj, event):
    if IMyPackageLayer.providedBy(obj.REQUEST):
        #  Do something
    else:
        #  Do nothing

您可以通过以下方式在您的包中 register/create 浏览器层:

  1. 创建一个interfaces.py

    from zope.interface import Interface
    
    class IMyPackageLayer(Interface):
        """A layer specific to my package
        """
    
  2. 在您的包裹配置文件中创建一个browserlayer.xml

    <layers>
        <layer name="my.package"
           interface="my.package.interfaces.IMyPackageLayer" />
    </layers>
    

浏览器层示例取自plone.browserlayer readme