适配器
默认显示名称生成器
默认的显示名生成器只接受都柏林核心标题或
_将其命名并返回,如果需要,将其截断。它使用一个helper函数
旨在使编写其他显示名称生成器更容易,convertname。
对于在ibrowserdisplaynamenergator中使用html还没有提供帮助
接口。
给定一个可以适应
zope.dublincore.interfaces.idcdescriptiveproperties,实际上
如果是值,则返回DC标题;否则,则使用“名称”。
>>> import zope.dublincore.interfaces
>>> import zope.location.interfaces
>>> from zc.displayname import interfaces, adapters
>>> from zope.interface import verify
>>> from zope import interface
>>> class Dummy(object):
... interface.implements(zope.location.interfaces.ILocation)
... def __init__(self, parent, name):
... self.__parent__ = parent
... self.__name__ = name
...
>>> d = Dummy('parent', 'a name')
>>> from zope.publisher.browser import TestRequest
>>> g = adapters.DefaultDisplayNameGenerator(d, TestRequest())
>>> verify.verifyObject(interfaces.IDisplayNameGenerator, g)
True
>>> g()
'a name'
>>> g('foo')
Traceback (most recent call last):
...
TypeError: ('maxlength must be int', 'foo')
>>> g(-1)
Traceback (most recent call last):
...
ValueError: ('maxlength must be 0 or greater', -1)
>>> g(4)
'a...'
>>> g(6)
'a name'
>>> g(2)
'??'
>>> interface.directlyProvides(
... d, zope.dublincore.interfaces.IDCDescriptiveProperties)
>>> d.title = 'My Special Dummy'
>>> d.description = 'My interface said I had to have this'
>>> verify.verifyObject(
... zope.dublincore.interfaces.IDCDescriptiveProperties, d)
True
>>> g()
'My Special Dummy'
>>> g(0)
''
>>> g(100)
'My Special Dummy'
>>> g(16)
'My Special Dummy'
>>> g(15)
'My Special D...'
面包屑
displayname还提供了一个接口和一些基本适配器,它们提供
面包屑功能。这个breadcrumb功能明显不同
从标准的zope 3面包屑有两种方式:面包屑不是
连接到iabsoluteUrl接口,面包屑可以利用
显示名称生成器的。
要使用breadcrumbs,请注册适当的适配器,然后获取breadcrumbs
对于层次结构中以icontainmentroot作为根节点的iLocation。
>>> from zope.traversing.interfaces import IContainmentRoot
>>> class DummyContainmentRoot(object):
... zope.interface.implements(IContainmentRoot)
...
>>> root = DummyContainmentRoot()
>>> child = Dummy(root, 'foo')
>>> grandchild = Dummy(child, 'bar baz bing')
>>> d.__parent__ = grandchild
>>> from zope import component
>>> component.provideAdapter(adapters.Breadcrumbs)
>>> component.provideAdapter(adapters.TerminalBreadcrumbs)
>>> component.provideAdapter(adapters.DefaultDisplayNameGenerator)
>>> component.provideAdapter(adapters.SiteDisplayNameGenerator)
>>> from zope.publisher.interfaces.http import IHTTPRequest
>>> from zope.traversing.browser.interfaces import IAbsoluteURL
>>> from zope.traversing import browser
>>> component.provideAdapter(
... browser.AbsoluteURL, adapts=(None, IHTTPRequest),
... provides=IAbsoluteURL)
>>> component.provideAdapter(
... browser.SiteAbsoluteURL, adapts=(IContainmentRoot, IHTTPRequest),
... provides=IAbsoluteURL)
>>> component.provideAdapter(
... browser.AbsoluteURL, adapts=(None, IHTTPRequest),
... provides=interface.Interface, name='absolute_url')
>>> component.provideAdapter(
... browser.SiteAbsoluteURL, adapts=(IContainmentRoot, IHTTPRequest),
... provides=interface.Interface, name='absolute_url')
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> bc = component.getMultiAdapter((d, request), interfaces.IBreadcrumbs)
>>> import pprint
>>> pprint.pprint(bc()) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar baz bing',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My Special Dummy',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})
>>> pprint.pprint(bc(6)) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar...',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My ...',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})
该包还提供了一个隐藏的breadcrumb实现。这使得
涉及遍历路径中的对象的用例
不需要面包屑。对某些网站来说,网络地址就是这样一个对象。
下面是一个从面包屑中隐藏iadding的例子。
>>> import zope.app.container.interfaces
>>> component.provideAdapter(
... adapters.HiddenBreadcrumbs,
... adapts=(zope.app.container.interfaces.IAdding, IHTTPRequest))
>>> from zope.app.container.browser.adding import Adding
>>> adding = Adding(d, request)
>>> bc = component.getMultiAdapter(
... (adding, request), interfaces.IBreadcrumbs)
>>> pprint.pprint(bc()) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar baz bing',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My Special Dummy',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})
为了便于在页面模板中使用,adapters模块还提供了两个
可用于直接获取面包屑的视图。他们只是得到
适配器并调用它,或者不使用参数,或者使用
20岁。注册其中一个或另一个具有类似模式的
应用程序的面包屑视图。
>>> pprint.pprint(adapters.breadcrumbs(adding, request))
... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar baz bing',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My Special Dummy',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})
>>> d.title = "My Special Dummy With a Really Long Title"
>>> pprint.pprint(adapters.breadcrumbs20char(adding, request))
... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar baz bing',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My Special Dummy ...',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})