用于Dolmen应用程序的面包屑导航。
dolmen.app.breadcrumbs的Python项目详细描述
dolmen.app.breadcrumbs为 Dolmen应用程序。它注册一个viewlet来呈现链接。
开始
为了测试面包屑的特性,我们需要创建一些内容。我们 在这里使用dolmen.contentcontents,因为面包屑的行为起作用 仅适用于iBasecontent对象:
>>> import dolmen.content >>> from grokcore.component import testing >>> class Container(dolmen.content.Container): ... dolmen.content.name('A dummy container') >>> testing.grok_component('container', Container) True
我们现在在一个假设的应用程序中创建内容:
>>> from zope.component.hooks import getSite >>> app = getSite() >>> app['cave'] = Container() >>> app['cave']['pot'] = Container()
最后,我们创建一个视图。当我们使用viewlet时,我们需要一个视图 显示一些内容:
>>> import grokcore.view >>> class simpleView(grokcore.view.View): ... grokcore.view.context(dolmen.content.IBaseContent) ... def render(self): ... return u'For test purposes' >>> testing.grok_component('simpleview', simpleView) True
适应
允许构建url和breadcrumb的组件是一个 提供IABSolutionUrl接口的适配器。我们走近点 看:
>>> from zope.component import getMultiAdapter >>> from zope.publisher.browser import TestRequest >>> from zope.traversing.browser.interfaces import IAbsoluteURL >>> request = TestRequest() >>> url = getMultiAdapter((app['cave'], request), IAbsoluteURL) >>> url <dolmen.app.breadcrumbs.url.DescriptiveAbsoluteURL object at ...> >>> from zope.interface.verify import verifyObject >>> verifyObject(IAbsoluteURL, url) True >>> url() 'http://127.0.0.1/cave' >>> url.breadcrumbs() ({'url': 'http://127.0.0.1', 'name': ''}, {'url': 'http://127.0.0.1/cave', 'name': u'cave'})
渲染
现在,我们的应用程序中有一些内容。我们可以称之为我们的观点 并使用其管理器渲染viewlet。
>>> from dolmen.app.layout import master >>> from dolmen.app.breadcrumbs import Breadcrumbs>>> view = getMultiAdapter((app['cave'], request), name="simpleview") >>> view <simpleView object at ...>
breadcrumbs viewlet是为dolmen.app.layout.top注册的。 经理:
>>> manager = master.Top(app['cave'], request, view) >>> viewlet = Breadcrumbs(app['cave'], request, view, manager) >>> viewlet <dolmen.app.breadcrumbs.crumbs.Breadcrumbs object at ...>
我们的内容还没有标题。如果我们渲染viewlet,它使用 父级中的位置(\u name>/cite>):
>>> viewlet.update() >>> print viewlet.render() <div id="breadcrumb"> <span class="you-are-here">You are here:</span> <span class="crumb"> <a href="http://127.0.0.1/cave">cave</a> </span> </div>
如果我们设置了标题,它将使用标题:
>>> app['cave'].title = u"My cave with a fireplace" >>> viewlet.update() >>> print viewlet.render() <div id="breadcrumb"> <span class="you-are-here">You are here:</span> <span class="crumb"> <a href="http://127.0.0.1/cave">My cave with a fireplace</a> </span> </div>
它适用于所有类型的对象,尽管标题仅用于 对于提供dolmen.content.ibasecontent的对象
>>> app['cave']['pot']['bone'] = object() >>> bone = app['cave']['pot']['bone'] >>> viewlet = Breadcrumbs(bone, request, view, manager) >>> viewlet.update() >>> print viewlet.render() <div id="breadcrumb"> <span class="you-are-here">You are here:</span> <span class="crumb"> <a href="http://127.0.0.1/cave">My cave with a fireplace</a> <span class="breadcrumb-separator">→</span> </span> <span class="crumb"> <a href="http://127.0.0.1/cave/pot">pot</a> <span class="breadcrumb-separator">→</span> </span> <span class="crumb"> <a href="http://127.0.0.1/cave/pot/bone">bone</a> </span> </div>
如果对象不可定位,则会引发类型错误:
>>> unlocatable = Container() >>> viewlet = Breadcrumbs(unlocatable, request, view, manager) >>> viewlet.update() Traceback (most recent call last): ... TypeError: There isn't enough context to get URL information. This is probably due to a bug in setting up location information.
更改日志
0.2(2010-02-26)
- 面包屑现在使用对^{tt1}的适应$ idcdescriptiveproperties接口以提供名称。这个 已为注册了基本多适配器 zope.locationi位置。因此,面包屑不再是 仅限于dolmen.contentibasecontent组件。
- 依赖关系已被极大地清除。我们现在使用的是Grok 1.1rc1版本的ztk。我们不再依赖zope.app包。
- 更新了IABSolutionUrl组件以匹配 zope.traversing。视图已被移除并替换为 提供IABSolutionUrl的简单多适配器。
0.1(2009-11-08)
- 初始版本