跳转到主要内容

基于适配器的可插拔面包屑实现。

项目描述

《z3c.breadcrumb》包提供面包屑实现的基类。它允许您为每个内容对象编写适配器,该适配器提供自己的规则来提供面包屑名称、URL和选择。

详细文档

README

《z3c.breadcrumb》包提供面包屑实现的基类。它允许您为每个内容对象编写适配器,该适配器提供自己的规则来提供面包屑名称、URL和选择。

让我们导入我们将要使用的某些内容。

>>> import zope.interface
>>> import zope.component
>>> from zope.publisher.interfaces.http import IHTTPRequest
>>> from zope.publisher.browser import TestRequest
>>> from zope.traversing.browser import absoluteURL
>>> from zope.container import contained
>>> from z3c.breadcrumb import interfaces
>>> from z3c.breadcrumb import browser

IBreadcrumb

让我们定义一个接口和一个内容对象。

>>> class IOffice(zope.interface.Interface):
...     """Office interface."""
>>> @zope.interface.implementer(IOffice)
... class Office(contained.Contained):
...     def __init__(self, label):
...         self.label = label
...         self.activeURL = True
>>> office = Office('Zope Foundation')
>>> office.__name__ = 'ZF'

有一个通用的面包屑实现,默认情况下已注册。如果我们没有实现自定义的IBreadcrumb,通用适配器将返回项目的标题或__name__。让我们注册默认适配器,这通常在configure.zcml中完成。

>>> zope.component.provideAdapter(browser.GenericBreadcrumb)

并查看我们得到的结果

>>> request = TestRequest()
>>> breadcrumb = zope.component.getMultiAdapter((office, request),
...     interfaces.IBreadcrumb)
>>> breadcrumb.name
'ZF'

我们还可以实现自定义的IBreadcrumb适配器,并为面包屑名称提供另一个名称

>>> @zope.interface.implementer(interfaces.IBreadcrumb)
... @zope.component.adapter(IOffice, IHTTPRequest)
... class BreadcrumbForOffice(object):
...
...     def __init__(self, context, request):
...         self.context = context
...         self.request = request
...
...     @property
...     def name(self):
...         return self.context.label
...
...     @property
...     def url(self):
...         return absoluteURL(self.context, self.request)
...
...     @property
...     def activeURL(self):
...         return self.context.activeURL

让我们为IOffice注册自定义的IBreadcrumb适配器

>>> zope.component.provideAdapter(BreadcrumbForOffice)

并检查新的面包屑名称

>>> breadcrumb = zope.component.getMultiAdapter((office, request),
...     interfaces.IBreadcrumb)
>>> breadcrumb.name
'Zope Foundation'

CustomNameBreadcrumb

让我们定义另一个接口和内容对象。

>>> class IOfficeContainer(zope.interface.Interface):
...     """Container of offices."""
>>> @zope.interface.implementer(IOfficeContainer)
... class OfficeContainer(contained.Contained):
...     pass
>>> offices = OfficeContainer()
>>> offices.__name__ = 'offices'

如果此类对象的自定义名称始终相同,编写完整的IBreadcrumb实现会很快变得乏味。作为一个快捷方式,您可以使用CustomNameBreadcrumb获取一个类似GenericBreadcrumb的适配器,但返回您想要的名字。

>>> adapter = browser.CustomNameBreadcrumb('Offices')
>>> adapter
<class 'z3c.breadcrumb.browser.CustomNameBreadcrumb('Offices')'>
>>> zope.component.provideAdapter(adapter,
...     adapts=(IOfficeContainer, IHTTPRequest))
>>> breadcrumb = zope.component.getMultiAdapter((offices, request),
...     interfaces.IBreadcrumb)
>>> breadcrumb.name
'Offices'

IBreadcrumbs

还有一个IBreadcrumbs适配器,它知道如何收集每个遍历项的面包屑信息。我们需要设置一点基础设施

>>> root = rootFolder
>>> root['office'] = office

注册IBreadcrumbs适配器

>>> zope.component.provideAdapter(browser.Breadcrumbs,
...     (zope.interface.Interface, zope.interface.Interface),
...     interfaces.IBreadcrumbs)

现在我们可以收集我们项的面包屑了。您可以看到URL是正确的,并且标签Zope Foundation被自定义IBreadcrumb适配器收集

>>> breadcrumbs = zope.component.getMultiAdapter((office, request),
...     interfaces.IBreadcrumbs)
>>> from pprint import pprint
>>> pprint(list(breadcrumbs.crumbs))
[{'activeURL': True,
  'name': 'top',
  'url': 'http://127.0.0.1'},
 {'activeURL': True,
  'name': 'Zope Foundation',
  'url': 'http://127.0.0.1/office'}]
>>> breadcrumbs.__parent__ is office
True

默认面包屑停止在虚拟主机根目录

>>> request._vh_root = office
>>> pprint(list(breadcrumbs.crumbs))
[{'activeURL': True,
  'name': 'Zope Foundation',
  'url': 'http://127.0.0.1'}]

如果项的面包屑是一个Null-适配器,则忽略该项。

>>> from zope.traversing.interfaces import IContainmentRoot
>>> zope.component.provideAdapter(
...     lambda c, r: None,
...     (IContainmentRoot, IHTTPRequest),
...     interfaces.IBreadcrumb)
>>> request = TestRequest()
>>> breadcrumbs = zope.component.getMultiAdapter(
...     (office, request), interfaces.IBreadcrumbs)
>>> pprint(list(breadcrumbs.crumbs))
[{'activeURL': True,
  'name': 'Zope Foundation',
  'url': 'http://127.0.0.1/office'}]

变更记录

3.0 (2023-02-24)

  • 停止支持Python 2.6、2.7、3.3、3.4。

  • 添加对Python 3.7、3.8、3.9、3.10、3.11的支持。

2.0.0 (2015-11-09)

  • 标准化命名空间__init__

2.0.0a1 (2013-02-27)

  • 添加了对Python 3.3的支持。

  • zope.app.testing依赖项移动到zope.site.testing

  • zope.app.container依赖项移动到zope.container

  • 用等效的zope.interface.implementer装饰器替换已弃用的zope.interface.implements用法。

  • 停止支持Python 2.4和2.5。

1.1.1 (2010-12-12)

  • 添加了对zope.app.container的需求,但没有声明测试依赖项。

  • 使用Python的doctest模块而不是已弃用的zope.testing.doctest

1.1.0 (2009-05-29)

  • 功能:添加了将Null-适配器注册为面包屑的能力。Null面包屑会导致项不在面包屑中显示。

1.0.3 (2008-12-13)

  • 错误:修复了IBreadcrumbs以匹配实现。

  • 清理依赖项。

1.0.2 (2008-01-23)

  • 错误:修复了包的长描述。

  • 功能:使用正确的DocFileSuite类,正确计算测试。

1.0.1 (2007-01-21)

  • 错误:将测试覆盖率提升到100%。

  • 功能:注册默认的IBreadcrumbs适配器。

  • 错误:默认的IBreadcrumbs只停止在虚拟主机根目录,而不是在ISite对象上。

1.0.0 (7/10/2007)

  • 首次发布

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

z3c.breadcrumb-3.0.tar.gz (9.8 kB 查看哈希值)

上传时间

构建分发

z3c.breadcrumb-3.0-py3-none-any.whl (10.9 kB 查看哈希值)

上传时间 Python 3

由以下支持