Grok的导航菜单

megrok.navigation的Python项目详细描述


…内容:

==
==
megrok.navigation
==
==
菜单实现为viewletmanagers,项目实现为viewlets。
您还可以通过注册自己的菜单覆盖默认模板。ipagetemplate

让我们首先设置一个简单的站点

>;>;导入grok
>;>;类mysite(grok.container,grok.application):
…传递grok_组件('mysite',mysite)
true

>;'root=getrootfolder()
>;'root['site']=site=mysite()

我们在重新定义了导航菜单之后,虽然它可以减少依赖性,但不必这样做。

>;>;来自Megrok导入导航
>;>;类inavigation(navigation.interfaces.imenu):
…传递类导航(导航菜单):
…grok.name('navigation')
…grok.implements(inavigation)
>;>grok_组件('nav',navigation)
true

true

现在呈现菜单时,zope.security.testing import principal中的
>;>zope.security.management import newinteraction中的participation
>;>on(principal('zope.anyone'))
>;>>来自zope.publisher.browser import testrequest
>;>request=testrequest()
>;>newinteraction(participation)
>;>nav=导航(site,request,grok.view(site,request))
>;>nav.update()
>;>>len(nav.viewlets)
0


我们还可以借助组件体系结构获得菜单:

>;;从zope.component import getmultiadapter
>;;从zope.viewlet.interfaces import icontentprovider
>;>;组件_nav=getmultiadapter((site,request,grok.view(site,request)),
…icontentprovider,name="navigation")
>;>;组件导航
<;megrok.navigation.tests.navigation对象位于0…>;

>;>;打印导航.render()
<;div class=>;
<;/div>;




全局菜单项是指向固定URL的链接,通常是指向其他网站的链接。
您可以在希望呈现它们的菜单上定义它们:

>;>;类导航(navigation.menu):
…grok.name('navigation')
…Grok.implements(无效)
…navigation.globalMenuitem('http://grok.zope.org','grok!')
>;>grok_组件('nav',navigation)
true


;>;>;打印nav.render()
<;div class=">;
<;ul>;
<;li class=">;
<;a href="http://grok.zope.org">;grok!<;/a>;
<;blankline>;
<;/li>;
<;/ul>;
<;/div>;


>您可以使用css class和cssitemclass属性设置css类:

>;类导航(导航菜单):
…grok.name('navigation')
…Grok.implements(无效)
…navigation.globalMenuitem('http://grok.zope.org','grok!')
…CSSclass='菜单'
…cssitemclass='菜单项'
>;>grok_组件('nav',navigation)
true
>;>nav=导航(站点、请求、grok.view(站点、请求))
>;>;<;div class="menu">;
<;ul>;
<;li class="menu item">;
<;a href="http://grok.zope.org">;grok!<;/a>;
<;blankline>;
<;/li>;
<;/ul>;
<;/div>;



很好的例子是指向站点根目录的"主页"链接。
站点菜单项是在要链接到的视图上定义的
我要确保主页链接是第一个。

>;>;类索引(grok.view):
…grok.context(mysite)
…导航.sitemenuitem(inavigation,'home',order=-1)
…def render(self):
…返回"test"
>;>grok_component('index',index)
true


t;div class="menu">;
<;ul>;
<;li class="menu item">;
<;a href="http://127.0.0.1/site/index">;home<;/a>;
<;blankline>;
<;/li>;
<;li class="menu item">;
<;a href="http://grok.zope.org">;grok!<;/a>;
<;blankline>;
<;/li>;
<;/ul>;
<;/div>;

t-敏感,因为viewletmanager只显示适合当前上下文的viewlet。使用menu item指令定义的菜单项将从其定义的视图继承其上下文

上下文菜单不是作为ibrowsermenus实现的,而是实现相同的用例。
我们首先需要一些上下文来演示来自zope的

>;>;类ifoo(interface):
…通过
>;>>Foo类(Grok.Model):
…grok.implements(ifoo)
>;>site['foo']=foo=foo()
>;>site['foo2']=foo()

传递类操作(导航菜单):
…Grok.implements(iactions)
grok.name('actions')
>;>grok_组件('actions',actions)
true

Grok.上下文(ifoo)
…navigation.menuitem(iactions,'details',order=0)
…def render(self):
…返回"test"
>;>grok_component('fooindex',fooindex)
true

>;>class fooedit(grok.view):
…Grok.上下文(ifoo)
…grok.title('编辑')
…navigation.menuitem(选项,顺序=1)
…def render(self):
…返回"test"
>;>grok_组件('fooEdit,fooEdit)
true


>;>;打印操作。render()
<;div class=>;
<;/div>;

since上下文是站点,没有菜单项。
让我们在ifoo对象上绘制它:

>;>;actions=actions(foo,request,grok.view(foo,request))
>;>;actions.update()
>;>;len(actions.items)
2

>;>;打印a ctions.render()
<;div class=">;
<;ul>;
<;li class=">;
<;a href="http://127.0.0.1/site/foo/fooindex">;详细信息<;/a>;
<;blankline>;
<;/li>;
<;li class=">;
<;a href="http://127.0.0.1/site/foo/fooedit"&g请注意,如果未在menuitem指令中指定标题,则它将使用标题指令指定的名称(如果可用)。否则将使用视图名称。

当然,您现在希望操作菜单成为全局导航菜单的一部分。
没问题:请使用主菜单上的子菜单指令:

>;类导航(navigation.menu):
…grok.name('navigation')
…Grok.implements(无效)
…navigation.globalMenuitem('http://grok.zope.org','grok!'),顺序=10)
…navigation.submenu('actions','actions',order=2)
>;>;grok_component('nav',navigation)
true

>;>;nav=导航(foo,request,grok.view(site,request))
>;>;nav.update()
>;print nav.render()
<;div class="
<;lt;lt;lt;lt;br/><;lt;lt;lt;li class=>;lt;br/><;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;gt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt li类="gt;
<;a<;blankline>;
< lt;lt;lt;li>;
><;lt;lt;
>;
>;
<;a<;lt;br/>>;
<;lt;lt;lt;lt;lt;lt;lt gt;
<;/div>;
<;/li>;
<;li class=>;
<;a href="http://grok.zope.org">;grok!<;/a>;
<;blankline>;
<;/li>;
<;/ul>;
<;/div>;

或使用子菜单上的parentmenu指令:

首先恢复旧的导航菜单定义和主链接

>;类导航(导航菜单):
…grok.name('navigation')
…Grok.implements(无效)
…navigation.globalMenuitem('http://grok.zope.org','grok!'),order=10)
>;>grok_component('nav',navigation)
true


现在重新定义actions菜单

>;>class actions(navigation.menu):
…Grok.implements(iactions)
grok.name('actions')
…grok.title('操作')
…导航.parentmenu(inavigation)
>;>grok_组件('actions',actions)
true

>;>nav=导航(foo,request,grok.view(site,request))
>;>nav.update()
>;<;div class=>;
<;lt;ul>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;br/><;lt;blankline>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt><;lt;a lt;lt;lt;lt;lt;a;lt;lt;lt;br/><;blankline>;
><;lt;lt;lt;lt;lt;lt;lt;li>;
><;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;a;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;br/>>;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;部门>;
<;/里>;
<;li class="">;
<;a href="http://grok.zope.org">;grok!<;/a>;
<;blankline>;
<;/li>;
<;/ul>;
<;/div>;


现在让我们授予权限

>;>;受食物保护的类(grok.view):
…Grok.上下文(ifoo)
…grok.title('manage')
…grok.require('zope.managecontent')
…navigation.menuitem(选项,顺序=2)
…def render(self):
…返回"test"
>;>grok_component('foopprotected',foopprotected)
true

<;lt;a lt;lt;lt;lt;lt;a;lt;lt;lt;br/><;blankline>;
><;lt;lt;lt;lt;lt;lt;lt;li>;
><;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;a;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;br/>>;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;分区>;

现在使用更强大的用户:

>>;>来自zope.security.testing import principal,participation
>;>来自zope.security.management import newinteraction,endinteraction
>;>endinteraction()
>;>participation=participatyipation(principal('zope.user'))
>;>newinteraction(participation)
>;>;>print actions.render()
<;div class=>;
<;ul>;
<;li class=>;
<;a href="http://127.0.0.1/site/foo/fooindex">;详细信息<;/a>;
<;blankline>;
<;/li>;
<;li class=">;
<;a href="http://127.0.0.1/site/foo/foo edit">;编辑<;/a>;
<;blankline>;
<;/li>;
<;li class=">;
<;a href="http://127.0.0.1/site/foo/foo protected">;管理<;/a>;
<;空行>;
<;/li>;
<;/ul>;
<;/div>;


>您可以通过重复menuitem指令将视图链接到多个菜单

>;>;类fooadd(grok.view):
…grok.context(mysite)
…navigation.menuitem(操作,"添加foo",order=3)
…navigation.menuitem(导航,"添加foo",order=5)
…def render(self):
…返回"test"
>;>grok_component('fooad',fooad)
true

>;>nav=navigation(site,request,grok.view(site,request))
>;>;<;div class=">;
<;ul>;
<;li class="">;
<;a href="http://127.0.0.1/site/index">;主页<;a>;
<;空白线>;
<;li>;
<;li class="">;
<;a>;操作<;a>;
<;div class="">;
<;ul>;
<;li class="">;
<;a href="http://127"。0.0.0.1/site/fooad">;添加一个foo<;lt;a>;
<;blankline>;
<;lt;lt;li>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;li class=>;
<;lt;a/a/fooad">;添加一个foo<;lt;lt;a>;lt;lt;a<;lt;a>;
<;lt;lt;blankline>;
<;lt;lt;lt;lt;<;/li>;
<;li class="">;
<;a href="http://grok.zope.org">;格洛克!<;/a>;
<;blankline>;
<;/li>;
<;/ul>;
<;/div>;




如果您希望从菜单中直接链接到某些内容,则可以使用内容菜单。
一个很好的示例是"产品"菜单,它直接链接到您网站上提供的所有产品
让我们定义并添加一些内容:

>>>;from zope.schema import textline
>>>;I类产品(接口):
…. name=textline()
>>gt;类产品(grok.container):
…Grok.implements(i产品)
…定义初始化(self,name):
…super(产品,自身).self.name=name

>;>site['coffee machine']=产品('coffeemachine')
>;>site['terminator']=产品('terminator')

现在是内容菜单。内容菜单不知道从哪里获取内容,因此需要重写
get content()方法。如果不这样做,您将得到一个notimplementederror:

>;>>类产品菜单(navigation.contentmenu):
…grok.name('products')
>;>grok_component('productmenu',productmenu)
true
>;>pm=productmenu(foo,request,fooiindex(foo,request))
>;>pm.update()
回溯(最近一次调用):notimplementederror:c的子类ontentmenu必须重写getcontent()

,所以让我们定义getcontent()方法,以及gettitle()方法,以返回
除"name"属性之外的其他内容。您可以使用viewname属性覆盖要呈现的视图
,该属性默认为"index"
还可以覆盖geturl()方法来创建自己的链接。

>;>;类产品菜单(navigation.contentmenu):
…grok.name('产品')
…def getcontent(self):
…如果iproduct.providedby(x)
,则返回[x for x in site.values()…def gettitle(self,obj):
…return obj.name
>;>grok_component('productmenu',productmenu)
true
>;>pm=productmenu(foo,request,fooiindex(foo,request))
>;>pm.update()
>;<;div class=">;
<;ul>;
<;li class="">;
<;a href="http://127.0.0.1/site/coffee machine/index">;咖啡机<;/a>;
<;blankline>;
<;/li>;
<;li class="">;
<;a href="http://127.0.0.1/site/terminator/index">;终止符<;/a>;
<;blankline>;
<;li>;
<;ul>;
<;div>;


刚才发生了什么?菜单项被呈现为上下文菜单项,
上下文不是当前视图上下文,而是要呈现的项。
当内容子菜单被扔进组合中时,这样做的原因将变得很清楚。
让我们为我们的产品定义系列和模型:

>;gt;gt;类iSeries(接口):
…name=textline()
>;>>类系列(grok.container):
…农具(iSeries)
…定义初始化(self,name):
…超级(系列,自我).\uu init\uu()
…self.name=name
>;>;类i模型(接口):
…name=textline()
>;>>类模型(grok.container):
…农具(iModel)
…定义初始化(self,name):
…超级(模型,自身).\uu init\uu()
…self.name=name
>;>site['terminator']['800']=series('t-800')
>;>site['terminator']['1000']=series('t-1000')
>;>site['terminator']['x']=series('t-x')
>;>site['terminator']['800'['101']=model('101')

响应子菜单:
ContentSubmenu类只是一个ContentMenu,默认的getContent方法返回self.context.values()

>;>gt;类序列菜单(navigation.contentSubmenu):
…navigation.contentSubmenu('model-menu')
…grok.name('系列菜单')
…def gettitle(self,obj):
…返回obj.name
>;>grok_component('seriesmenu',seriesmenu)
true
>;>class modelmenu(navigation.contentsub菜单):
…grok.name('model-menu')
…def gettitle(self,obj):
…返回obj.name
>;>grok_component('modelmenu',modelmenu)
true


现在我们需要将它们链接到产品菜单:

>;>;类产品菜单(导航.内容菜单):
…navigation.contentSubmenu('series-menu')
…grok.name('产品')
…def getcontent(self):
…如果iproduct.providedby(x)
,则返回[x for x in site.values()…def gettitle(self,obj):
…return obj.name
>;>grok_component('productmenu',productmenu)
true




>;>pm=productmenu(site,request,grok.view(site,request))
>;>;<;div class=">;
<;ul>;
<;li class="">;
<;a href="http://127.0.0.1/site/coffee machine/index">;咖啡机<;a>;
<;div class="">;
<;ul>;
<;blankline>;
<;ul>;
<;div>;
<;li>;
<;li>;
<;li class=">;
<;a href="http://127.0.0.1/site/terminator/index">;terminator<;/a>;
<;div class=">;
<;ul>;
<;li class=">;
<;a href="http://127.0.0.1/site/terminator/1000/index">;t-1000<;/a>;
<;div class=">;
<;ul>;
<;blankline>;
<;lt;br/><;
<;
<;
<;
<;
<;lt;li class=>;
<;lt;br/><;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;http://127.0.0.0.1/网站/终端/800/索引;t-800<;
<;
<;lt;lt;div class=>;
>;
<;lt;lt;lt;lt;br/><;lt;lt;lt;lt;lt;lt;lt是的127.0.0.0.1/网站/终结者/800/101/索引">;101<;a>;
<;blankline>;
<;lt;li>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;br/><;lt;lt;li>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;div类=""&
<;lt;ul>;
<;blankline>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;br/><;lt;lt;lt;div>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;br/>>;
<;lt;lt;lt;lt;br/>>;
<;lt;lt;lt;lt;br/><;lt;lt;lt;lt;lt;lt;br/><;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;是的产品菜单(navigation.contentmenu):
…grok.name('产品')
…def getcontent(self):
…如果iproduct.providedby(x)
,则返回[x for x in site.values()…def gettitle(self,obj):
…返回obj.name
>;>grok_component('productmenu',productmenu)
true
>;>class seriesmenu(navigation.contentsubmenu):
…导航。父菜单(productmenu)
…grok.name('系列菜单')
…def gettitle(self,obj):
…返回obj.name
>;>grok_component('seriesmenu',seriesmenu)
true
>;>class modelmenu(navigation.contentsubmenu):
…导航。父菜单(系列菜单)
…grok.name('model-menu')
…def gettitle(self,obj):
…返回obj.name
>;>grok_component('modelmenu',modelmenu)
true


let's render

>;>pm=productmenu(site,request,grok.view(site,request))
>;>;<;div class=>;
<;ul>;
<;li class="">;
<;a href="http://127.0.0.1/site/coffee machine/index">;咖啡机<;a>;
<;div class="">;
<;ul>;
<;blankline>;
<;ul>;
<;div>;
<;li>;
<;li/><;li class=>;
<;a href="http://127.0.0.1/site/terminator/index">;终止符<;/a>;
<;div class="">;
<;lt;ul>;
<;lt;li class=><;lt;lt;br/><;lt;a;lt;a;a;lt;http://127.0.0.0.0.1/site/终结者/1000/index;lt-1000<;lt;a;gt;
<;div class=><;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt中尉;lt-800<;br/><;lt;lt;lt;lt;lt;div class=>;
<;lt;lt;lt;ul>;
<;lt;li class=>;
<;lt;lt;lt;lt;li class=>;
<;lt;a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a;lt;lt;lt;lt;br/><;lt;lt;br/><;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt乙lt;lt;lt;li class=><;lt;li class=><;br/><;br/><;lt;li class=><;lt;br/><;lt;a;a;a;lt;http://127.0.0.0.0.1/网站/终结者/x/索引;lt-x<;lt;a&g t;
<;div class=><;lt;br/><;lt;lt;lt;ul>;
<;lt;lt;lt;lt;br/><;lt;lt;br/><;lt;lt;lt;lt;lt;lt;li=><;lt;lt;br/><;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;/><;/ul>;
<;/div>;
<;/li>;
<;/ul>;
<;/div>;




groups
----


>菜单项可以通过向所有菜单项、子菜单和专利菜单添加一个组参数进行分组
nu(navigation.interfaces.imenu):
…传递类组菜单(navigation.menu):
…grok.implements(igroupedmenu)
>;>grok_组件('groupedmenu',groupedmenu)
true
>;>class index(grok.view):
…grok.context(mysite)
…navigation.sitemanuitem(igroupedmenu,'home',order=1,group='group 1')
…def render(self):
…返回"test"
>;>grok_component('index',index)
true
>;>class view2(grok.view):
…grok.context(mysite)
…navigation.sitemenuitem(igroupedmenu,'view 2',order=0,group='group 2')
…def render(self):
…返回"test"
>;>grok_component('view2',view2)
true
>;>class view3(grok.view):
…grok.context(mysite)
…navigation.sitemenuitem(igroupedmenu,'view 3',order=2,group='group 1')
…def render(self):
…返回"test"
>;>grok_组件('view3',view3)
true

随着人们对自然的渲染和对自然人的渲染,人们对自然人的关注度越来越高;而对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越高;对自然人的关注度也越来越少;对自然人的关注度也越来越少;而对自然人的关注度也越来越少;对自然人的关注度也越来越多;是的7.0.0.0.1/网站/网站/索引">;首页<;a>;
<;blankline>;
< lt;lt;lt;lt;lt;lt;lt;li class=>>;
<;lt;lt;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;br/><;网站/网站/视图3;第三视图<;a>;
<;blankline>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;你可以改变通过在菜单类上设置groupOrder属性对组进行排序:

>;>class groupedmenu(navigation.menu):
…Grok.implements(i组菜单)
…grouporder=['group 1','group 2']
>;>grok_component('groupedmenu',groupedmenu)
true
>;>gm=groupedmenu(site,request,grok.view(site,request))
>;>;<;div class=>;
<;lt;ul>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;br/><;lt;lt;lt;http://127.0.0.0.0.0.0.0.1/网站/网站/索引;家庭<;lt;lt;lt;a>;
<;blankline>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt
<;ul>;
<;ul>;
<;pagetemplate)允许您覆盖默认模板。
让我们基于div定义模板,而不是ul

>;mt=""<;div tal:attributes='类菜单/cssclass'>;
…<;div tal:repeat='组菜单/组'>;
…<;tal:重复tal:repeat="项目组/项目"
…tal:replace='结构项/呈现'/>;
…<;/div>;
…<;div>;"
>;>>来自Megrok Import PageTemplate
>;>类divmenu(pageTemplate.PageTemplate):
…template=grok.pagetemplate(mt)
…pagetemplate.view(navigation.interfaces.imenu)
>;>grok_component('div menu',divmenu)
true

>;>;它="<;div-tal:attributes='class menu/cssitemclass'>;
…<;a tal:attributes="href item/link;"
…标题视图/说明无">;
…<;img tal:condition="项目/图标无"
…tal:attributes="src item/icon"/>;
…<;span tal:replace="item/title"/>;<;/a>;
…<;tal:替换tal:condition="item/submenu nothing"
…tal:replace="结构提供程序:${item/submenu}"/>;
…<;div>;""类divmenuitem(pagetemplate.pagetemplate):
…template=grok.pagetemplate(it)
…pagetemplate.view(navigation.interfaces.imenuitem)
>;>grok_组件('divmenuitem',divmenuitem)
true

>;
>;打印操作.render()
<;div class=>;
<;div>;
<;div class=>;
<;a href="http://127.0.0.1/site/foo/fooindex">;
<;blankline>;
详细信息<;a>;
<;blankline>;
<;div>;
<;div class=">;
<;a href="http://127.0.0.1/site/foo/foo edit">;
<;blankline>;
编辑<;a>;
<;blankline>;
<;div
<;div class="">;
<;a href="http://127.0.0.1/site/foo/foopprotected">;
<;blankline>;
manage<;a>;
<;blankline>;
<;div>;
<;div>;



或不同菜单中使用的项目?您从来没有自己指定过任何项,因此您不能告诉它们实现不同的接口并将模板注册到该接口。
为此,引入了items implement指令。

>;>;类IIconitem(navigation.interfaces.imenuim):
…传递类图标菜单(导航菜单):
…grok.name('图标')
…导航。项目简化(iiconitem)
…navigation.globalMenuitem('http://grok.zope.org','grok!'),
…icon='icon.jpg')
>;>grok_component('nav',iconmenu)
true

>;>it="<;img tal:condition="item/icon nothing"
…tal:attributes="src item/icon"/>;""
>>>>类iconMenuitem(pageTemplate.pageTemplate):
…template=grok.pagetemplate(it)
…pagetemplate.view(iiconitem)
>;>grok_component('iconmenuem',iconmenuem)
true
>;>icons=iconmenu(site,request,grok.view(site,request))
>;>icons.update()
>;<;div class=>;
<;div>;
<;img src="icon.jpg"/>;
<;/div>;
<;/div>;



n个viewlets和*.items在一起。



>>gt;来自zope.publisher.interfaces.browser导入idefaultbrowserlayer
>>gt>gt;类iglobalmenu(navigation.interfaces.imenu):
…传递类globalmenu(导航菜单):
…grok.name('globalmenu')
…grok.implements(iglobalmenu)
>;>grok_component('globalmenu',globalmenu)
true

>;>class contact(grok.view):
…grok.context(mysite)
…Grok.层(IdeFaultBrowserLayer)
…导航.menuitem(iglobalmenu)
…def render(self):
…返回"test"
>;>grok_component('contact',contact)
true

>;>class logout(grok.viewlet):
…grok.viewletmanager(iglobalmenu)
…grok.context(mysite)
…Grok.层(IdeFaultBrowserLayer)
…def render(self):
…返回"logout"
>;>grok_组件('logout',logout)
true

>;>globalmenu=getmultiadapter((site,request,grok.view(site,request)),
…icontentprovider,name="globalmenu")

>;>globalmenu.update()
>;>logout,contact=globalmenu.viewlets

>;>logout
<;megrok.navigation.tests.logout object at…>;

>;>contact
<;megrok.navigation.util.mysite_contact object at…>;

>;>;grok.layer.bind().get(注销)
<;interfaceClass zope.publisher.interfaces.browser.idefaultbrowserlayer>;

>;>;grok.layer.bind().get(联系人)
<;interfaceClass zope.publisher.interfaces.browser。idefaultbrowserlayer>;

>;>print globalmenu.render()
<;div class="">;
<;div>;
注销
<;div class="">;
<;a href="http://127.0.0.1/site/contact">;
联系人<;/a>;
<;/div>;
<;<;&div>;
<;/div>;



(site,request,grok.view(site,request),全局菜单),
…iviewlet,name=u"mysite_contact")
>;>contact
<;megrok.navigation.util.mysite_contact object at…>;


>;>class contact(grok.view):
…grok.context(mysite)
…grok.name('othercontact')
…grok.title('其他链接')
…Grok.层(IdeFaultBrowserLayer)
…导航.menuitem(iglobalmenu)
…def render(self):
…返回"test"
>;>grok_component('contact',contact)
true

>;>contact1=getmulitapter(
…(site,request,grok.view(site,request),全局菜单),
…iviewlet,name=u"mysite_othercontact")

>;>;contact1
<;megrok.navigation.util.mysite_othercontact object at…>;




===
=
==history
==

<0.6.2(2012-03-20)
----


-修复子菜单上的项目简化:使用子菜单主菜单项中的父项simplement


0.6.1(2010-06-28)
----


-修复图标是否可调用


>0.6(2010-05-09)
----

-更新以使图标显示与zope兼容。阅读字面上使用的

>0.5(2010-05-09)
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————active(如果已设置)到imenuitems
-现在用工厂的默认视图名称而不是自动生成的名称注册组件。这允许我们在zca的帮助下重写简单的
menuitems。



<0.4(2010-03-26)
----



-实现的组:
-contentgroup directive
-grouporder属性

<0.3(2010-03-26)
-


-direc中的单独指令ots子模块
-contentmenu的geturl方法
-itemsimplement指令
-parenmenu指令
-"menu"和"item"模板名称空间条目
-"menu"属性指的是viewletmanager菜单
-"items"属性指的是viewlets菜单
-已删除子菜单/子菜单不一致(可能会中断覆盖的模板!)
-contentOrder指令

0.2.2(2010-03-09)
----

-修复getsite导入问题


0.2.1(2010-02-22)
----


-修复需要zope.site使其在grok 1.0上工作的问题-允许将视图注册到多个菜单
-废弃ContextMenu类,因为它不过是一个常规菜单


0.1(2010-01-29)
———————————————————————————————————————————————————————————

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
日期和现在之间的Java时间   java以适当的方式更新jLabel和jTextField   java如何从PQ(单链表)中删除最大值   java可以通过任何方式找出哪些NSF文件属于Domino服务器   java Velocity 2不会设置属性   如何使用java流迭代索引映射列表   maven依赖项在编译期间工作,但在java运行时失败。lang.NoClassDefFoundError&java。lang.ClassNotFoundException   java有没有办法完全隐藏Web应用程序代码?   Android appcompat v7 21库中的java FadingActionBar错误   Eclipse/com中的java AdMob。谷歌。安卓gms。ads.AdView   java My Service表示它正在运行,但其状态尚不清楚,似乎没有绑定   java无法启动Apache Tomcat Web应用程序容器   JDK:java中的命名约定。可丢弃的   Spring SerSecurity中的java身份验证错误   Maven:使用JDK8编译Java7   java在使用ExecutorService时如何管理内存?   comm.jar通信串行端口java   java LibGDX创建动画