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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.