Re: Traversal modifizieren
Peter Zechmeister <[email protected]>
| Newsgroups | gmane.comp.web.zope.german |
|---|---|
| Message-ID | <1306825557.2315.16.camel@pze> |
Hallo,
so würde es funktionieren. Ist vielleicht ein wenig die
Holzhammermethode, scheint aber zu gehen.
Wenn wer weiß, wie man es eleganter/besser/richtiger macht, bitte um
Kommentare.
Hier wird gleich zu Beginn des Requests der Pfad geprüft und nicht erst
mit dem eigentlichem Traversal, wo sich dann auch das ZMS reinhängt. Da
sich das ZMS durch die Möglichkeit von Einbettungen relativ rasch in
verschiedene Module verzweigt müsste da IMHO sonst an mehreren Stellen
gepatcht werden.
# ZMS._pathhandler.PathHandler.__before_publishing_traverse__
def __before_publishing_traverse__(self, attr1, REQUEST):
# Prevent running this more than once per traversing
if REQUEST.get('_b_p_t_running'): return
REQUEST.set('_b_p_t_running', True)
traversal = copy.copy(REQUEST.TraversalRequestNameStack)
traversal.reverse()
obj = self
# Do not check Blobs or ZMI
for step in traversal:
if step.startswith('manage'): return
if step == traversal[-1]\
and step.find('.') != -1\
or step.find('index') != -1:
return
# Follow recursive embedded links
if obj.meta_type == 'ZMSLinkElement' \
and obj.isEmbeddedRecursive(REQUEST):
obj = obj.getLinkObj(obj.getRef(), REQUEST)
# Get next path element
try:
obj = obj[step]
except:
obj = None
if obj is None: # Broken Path
# Modify traversal!
REQUEST.set('TraversalRequestNameStack'\
,['id_of_broken_path_handler'])
break
return
Am Mittwoch, den 25.05.2011, 13:49 +0200 schrieb Tom Gross:
> Hallo Peter,
>
> vielleicht wirst du hier fündig:
>
> http://docs.zope.org/zope2/zdgbook/ObjectPublishing.html
>
> Gruss
> Tom
>
> On 25.05.11 11:37, Peter Zechmeister wrote:
> > Hallo,
> >
> > ich möchte unserer ZMS-Site so etwas wie "Perma-Links" verpassen. Dazu
> > würde ich Objekte mit ihren Ids und Pfaden indizieren. Wir stellen
> > sicher, dass Ids eindeutig bleiben. Jedoch können sich Pfade durch
> > verschieben von Objekten ändern. Anhand der Id sollten sie jedoch im
> > Baum dann wieder gefunden werden.
> >
> > Wenn nun ein Request mit einem nicht mehr existierenden Pfad kommt, wird
> > der letzte Schritt im Pfad (= angefragtes Objekt) als Id genommen, im
> > Index gesucht und auf den neuen Pfad redirected.
> >
> > Allerdings will ich Zope/ZMS daran hindern, 404 zu machen. Das könnte
> > man doch mit __before_publishing_traverse__ abfangen? Prüfen, ob der
> > Pfad existiert. Falls nicht wird im Index gesucht und umgeleitet oder -
> > falls dort auch nichts gefunden wird, erst dann ein 404 gemacht. Dazu
> > muss man aber in das Traversal eingreifen.
> >
> > Hier http://wiki.zope.org/zope2/ZPublisher werden diese Hooks kurz
> > erklärt ("[...]However, the request object also provides methods that
> > change the path segments still to be traversed[...]"), gibts dazu
> > irgendwo eine genauere Anleitung?
> >
> > Grü
> > PeterZ
> >
> >
> >
> > _______________________________________________
> > zope mailing list
> > [email protected]
> > https://mail.dzug.org/mailman/listinfo/zope
>
>
>
> _______________________________________________
> zope mailing list
> [email protected]
> https://mail.dzug.org/mailman/listinfo/zope
_______________________________________________
zope mailing list
[email protected]
https://mail.dzug.org/mailman/listinfo/zope