allow name-based linking e.g. via .loops/resources/...

This commit is contained in:
Helmut Merz 2015-08-13 16:11:53 +02:00
parent 48e45941b8
commit 48caf96670

View file

@ -948,7 +948,8 @@ class NodeTraverser(ItemTraverser):
if context.nodeType == 'menu': if context.nodeType == 'menu':
setViewConfiguration(context, request) setViewConfiguration(context, request)
if name == '.loops': if name == '.loops':
return self.context.getLoopsRoot() name = self.getTargetUid(request)
#return self.context.getLoopsRoot()
if name.startswith('.'): if name.startswith('.'):
name = self.cleanUpTraversalStack(request, name)[1:] name = self.cleanUpTraversalStack(request, name)[1:]
target = self.getTarget(name) target = self.getTarget(name)
@ -975,17 +976,34 @@ class NodeTraverser(ItemTraverser):
obj = super(NodeTraverser, self).publishTraverse(request, name) obj = super(NodeTraverser, self).publishTraverse(request, name)
return obj return obj
def getTargetUid(self, request):
parent = self.context.getLoopsRoot()
stack = request._traversal_stack
for i in range(2):
name = stack.pop()
obj = parent.get(name)
if not obj:
return name
parent = obj
return '.' + util.getUidForObject(obj)
def cleanUpTraversalStack(self, request, name): def cleanUpTraversalStack(self, request, name):
traversalStack = request._traversal_stack #traversalStack = request._traversal_stack
while traversalStack and traversalStack[0].startswith('.'): #while traversalStack and traversalStack[0].startswith('.'):
# skip obsolete target references in the url # skip obsolete target references in the url
name = traversalStack.pop(0) # name = traversalStack.pop(0)
traversedNames = request._traversed_names traversedNames = request._traversed_names
if traversedNames: for n in list(traversedNames):
lastTraversed = traversedNames[-1] if n.startswith('.'):
if lastTraversed.startswith('.') and lastTraversed != name: # remove obsolete target refs
traversedNames.remove(n)
#if traversedNames:
# lastTraversed = traversedNames[-1]
# if lastTraversed.startswith('.') and lastTraversed != name:
# let <base .../> tag show the current object # let <base .../> tag show the current object
traversedNames[-1] = name # traversedNames[-1] = name
# let <base .../> tag show the current object
traversedNames.append(name)
return name return name
def getTarget(self, name): def getTarget(self, name):