[Zope-dev] Question: additional context for IAnnotations adapter?
Jacob Holm
jh at improva.dk
Mon Mar 23 13:32:59 EDT 2009
Chris Withers wrote:
> Jacob Holm wrote:
>>> Can someone confirm to me whether or not manually specifying the
>>> context as I have in the example above would work, or would I need
>>> to do:
>>>
>>> >>> adapter1 = getAdapter(a,ISomething,context=siteA)
>>> >>> adapter2 = getAdapter(b,ISomething,context=siteB)
>>>
>> In general, using "context=a" should give the same result as
>> "context=siteA".
>
> Why? What actually makes this work?
If you provide a context in the zope.component.getAdapter call, it is
used with zope.component.getSiteManager to find the "site manager" to
use for the actual lookup. In this case getSiteManager does the actual
lookup by adapting context to zope.component.interfaces.IComponentLookup
using the global registry. In a normal setup, this will find the
SiteManagerAdapter from zope.site.site (used to be in
zope.app.component). This adapter simply traverses __parent__ pointers
until it finds an object providing zope.location.interfaces.ISite.
Depending on your setup it may actually be a different implementation of
getSiteManager that is used, since it is marked with @hookable. The
common replacement is zope.site.hooks.getSiteManager, which in this case
does exactly the same global IComponentLookup adapter lookup I described
above.
If you are not using zope.site, you need to provide your own global
IComponentLookup adapter to get it working. (Or hook the getSiteManager
function yourself)
This is a bit more complex than I remembered, but the result is that in
a normal setup passing "context=A" will give the same result as
"context=siteA", assuming that siteA can be found from A by following
__parent__ pointers.
Hope this helps
- Jacob
More information about the Zope-Dev
mailing list