项目描述
《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'}]
变更记录
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.0.3 (2008-12-13)
错误:修复了IBreadcrumbs以匹配实现。
清理依赖项。
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
构建分发