Sorry if the mail content is a bit lengthy, but I need to put all the info.<br><br>In the following code, there are 2 render functions:<br>- one using the interface (ok)<br>- the other uses the utility (ko)<br><br>Here is the code snippet:<br>
<br>-----<br>class AMenuItem(menu.BrowserMenuItem):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grok.implements(IAMenuItem, IMenuItemType)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grok.provides(IMenuItemType)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://grok.name">grok.name</a>(&#39;menuitem&#39;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description = &#39;coucou&#39;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, **kw):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://self.kw">self.kw</a> = kw<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __call__(self, context, request):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(menu.BrowserMenuItem, self).__init__(context, request)<br>
<br>grok.global_utility(AMenuItem)<br><br>class AMenuItemAdapter(grok.MultiAdapter):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grok.adapts(ICdcmenu, IBrowserRequest)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grok.implements(IAMenuItem)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title = &#39;hello&#39;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description = &#39;toto&#39;<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, context, request):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.context = context<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.request = request<br><br>class Index(grok.View):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grok.context(Cdcmenu)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a_menu =&nbsp; Menubar()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a_menu(&#39;toto&#39;, &#39;Titre toto&#39;, &#39;Toto est de retour&#39;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id = &#39;menuitem&#39;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def getMenuItemType(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return component.getUtility(IMenuItemType, <a href="http://self.id">self.id</a>)<br>
<br># this function render correctly<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def render(self):<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resultat = []<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for name, item in component.getAdapters((self.context, self.request), IAMenuItem):<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resultat.append(item.description)<br>
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pformat(resultat)<br><br># this function does not render correctly<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def render(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resultat = []<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for name, item in component.getAdapters((self.context, self.request), self.getMenuItemType()):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resultat.append(item.description)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pformat(resultat)<br>---<br><br>If I try to create a utility subclassing interface.Interface and implementing IMenuItemType like this:<br>
<br>class OtherMenuItem(interface.Interface):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grok.implements(IAMenuItem, IMenuItemType)<br><br>I get the following error:<br><br>&nbsp; File &quot;/home/simon/.buildout/eggs/zope.interface-3.4.1-py2.4-linux-i686.egg/zope/interface/interface.py&quot;, line 488, in __init__<br>
&nbsp;&nbsp;&nbsp; raise InvalidInterface(&quot;Concrete attribute, &quot; + name)<br>zope.configuration.xmlconfig.ZopeXMLConfigurationError: File &quot;/mnt/backup_software/virtualgrok/Menutest/etc/site.zcml&quot;, line 4.2-4.32<br>&nbsp;&nbsp;&nbsp; ZopeXMLConfigurationError: File &quot;/mnt/backup_software/virtualgrok/Menutest/src/menutest/configure.zcml&quot;, line 5.2-5.27<br>
&nbsp;&nbsp;&nbsp; InvalidInterface: Concrete attribute, __implements_advice_data__<br><br>Thanks for your help<br>Simon Elbaz<br><br><div class="gmail_quote">On Wed, Feb 4, 2009 at 2:37 AM, Dan Korostelev <span dir="ltr">&lt;<a href="mailto:nadako@gmail.com">nadako@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">2009/2/4 Simon Elbaz &lt;<a href="mailto:elbazsimon9@gmail.com">elbazsimon9@gmail.com</a>&gt;:<br>

<div class="Ih2E3d">&gt; When I look to the getMenuItemType() function, it returns a utility (<br>
&gt; return zope.component.getUtility(IMenuItemType, <a href="http://self.id" target="_blank">self.id</a>)) and the<br>
&gt; consequence is that the adapter lookup returns nothing in getMenuItems.<br>
<br>
</div>That&#39;s strange, because that IMenuItemType utility is the interface<br>
that the menu item adapters are registered as providing. It works as<br>
intended here in plain zope3. Can you provide some more info?<br>
<font color="#888888"><br>
--<br>
WBR, Dan Korostelev<br>
</font></blockquote></div><br>