Hello,
I would like to override the before_publishing_traverse method in zope. I read the documentation, but I couldn't find anything on the subject.
I tried to do like PUT_factory, create a script in Extensions, but to no avail. Can someone help me?
Thank you
What problem are you trying to solve? Using ExternalMethod
is deprecated since ages.
Traversal is documented here: Requests and traversal — Plone Documentation v4.3
First state your problem, then let's talk about options.
thank you,
So here is what I would like to do. If you know Django, I would like to reproduce Django's url system, ie pass url parameter values in the url.
ex: my_site / <int: id> / user would match mysite / 123456 / user where 123456 is the value of id
Currently, I don't believe Zope can do this directly !?
So, I thought to overload before_publishing_traverse to do the necessary processing before going through bobo_traverse.
Do you think it's possible?
Zope is open source. Thus, you have the option to search its code.
In this specific case, you will find __before_publishing_traverse__
in ZPublisher.BaseRequest
(the implementation) and ZPublisher.BeforeTraverse
(important application). There are related tests which you can use as usage examples.
Zope used to support so called "access rule"s -- nowadays, they might be available in a separate product (likely called Products.SiteAccess
). "Access rules" are a major application of BeforeTraverse
(and thereby of __before_publishing_traverse__
). They allow you to look at the url, either for inspection/rejection or for modification. Note that in order to change the effective url, you must change internal variables of the request object (which contain the preprocessed url for traversal purposes) -- look at BaseRequest.traverse
for details.
If all you want to do is create nice URLs using path components instead of a query string, you may access REQUEST['traverse_subpath']
in a simple Script (Python), like so:
request=context.REQUEST
ts = request['traverse_subpath']
try:
uid = int(ts[0])
return context.user_html(uid)
except:
return context.normal_index_html
It's just a bit unusual that this would be your index_html... have fun!
An option is to create a browser view that implements IPublishTraverse
. Example from standard Plone is how the download of files is handled:
Another option is to register a traverser. For example, Plone registers a traverser for the Zope site root so if a browser visits this root we display a page plone-overview
instead of the default (index_html
). See the Python part and the zcml part.