[Zope3-Users] Specialized URL traversal.. Best way?
Wade Leftwich
wade at leftwich.us
Tue Jan 3 17:37:30 EST 2006
Marius Gedminas wrote:
> On Thu, Dec 29, 2005 at 11:22:28PM -0700, Jeff Shell wrote:
>
>>Again, this is to have URLs like:
>>
>>myapp/@@tags/zope/viewlet
>>
>>And turn that into a catalog search for anyof {'zope', 'viewlet'}
>>
>> def publishTraverse(self, request, name):
>> namestack = request.getTraversalStack()
>> if name not in namestack:
>> namestack.append(name)
>> namestack.reverse()
>> tags = tuple(namestack)
>> request.setTraversalStack([])
>>
>> results = TaggedArticleFinder(self.__name__,self.__parent__,tags)
>> results.prepareSearch(request)
>> return results
>>
>>The 'TaggedArticleFinder' then provides an interface that a view can
>>be found for that displays the results. So I've got it all working
>>now...
>
>
> My coworker Albertas recently implemented something like this in
> SchoolTool (I've CCed him). Unfortunately it turned out to have some
> unforeseen consequences, for example, request.URL does not contain the
> path elements you "eat" manually, breaking self-posting forms (those
> that use <form tal:attributes="action request/URL">) and our login
> mechanism.
>
>
How about this? It gives
zope.app.publication.publicationtraverse.PublicationTraverse.traverseName()
some extra work, but it doesn't mess with the request and leaves
request.URL reflecting the entire "path".
###
from zope.interface import implements
from zope.publisher.interfaces import IPublishTraverse
from zope.app.publisher.browser import BrowserView
class BrowserViewStopTraversal(BrowserView):
implements(IPublishTraverse)
def __init__(self, context, request):
self.context = context
self.request = request
self.traverse_subpath = []
def publishTraverse(self, request, name):
self.traverse_subpath.append(name)
return self
def __call__(self):
"""Just for example"""
return ("traverse_subpath = %s\nrequest.URL = %s" %
(self.traverse_subpath, self.request.URL))
###
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="travtest"
>
<browser:page
for="*"
name="stoptrav"
class=".travtest.BrowserViewStopTraversal"
permission="zope.Public"
/>
</configure>
###
http://localhost:8080/@@stoptrav/foo/bar/baz =>
traverse_subpath = [u'foo', u'bar', u'baz']
request.URL = http://localhost:8080/@@stoptrav/foo/bar/baz
-- Wade Leftwich
Ithaca, NY
More information about the Zope3-users
mailing list