2 Stimmen

Plone 4: Wie erhalte ich den Kontext für einen Unterordner mit einem Bindestrich im Kurznamen?

Ich schreibe gerade ein Python-Skript, um Inhalte aus einem anderen CMS in Plone 4.1 zu importieren. Aus einer Reihe von Gründen führe ich es so aus: bin/instance run path/to/myscript

Die Frage, die ich habe, ist, wie man den richtigen Kontext für einen Ordner mit einem Bindestrich in der ID/dem Kurznamen erhält. Zum Beispiel von der Wurzel einer Plone-Site namens mysite, kann ich mit einem Ordner namens "Unterordner" wie folgt arbeiten:

from Products.CMFCore.utils import getToolByName
urltool = getToolByName(app.mysite, "portal_url")
portal  = urltool.getPortalObject()
folder = getattr(portal, 'sub-folder')

Wenn ich dann aber einen Ordner oder eine Seite in diesem Unterordner erstellen möchte, wird ein Fehler ausgelöst: "AttributeError: sub"

urltool = getToolByName(app.mysite.sub-folder, "portal_url")
portal  = urltool.getPortalObject()

Wenn Sie dasselbe für den Ordner "News" (der keinen Bindestrich enthält) tun, tritt kein Fehler auf:

urltool = getToolByName(app.mysite.news, "portal_url")
portal  = urltool.getPortalObject()

Der Versuch, den Unterordner "portal.sub-folder" zu öffnen, führt zu demselben Fehler.

Was wäre also der Python-Code, um den richtigen Kontext von "http://localhost:8080/mysite/sub-folder" zu erhalten, so dass ich dann erfolgreich die invokeFactory-Methode aufrufen und einen Ordner oder eine Seite innerhalb meiner Website/Unterordner erstellen kann?

Was wäre, wenn ich den Kontext von "http://localhost:8080/mysite/sub-folder/2nd-level" finden müsste?

Die Online-Dokumentation, die ich gefunden habe, scheint nur Ordner mit dem Namen dog oder news zu berücksichtigen, die keinen Bindestrich in der ID/dem Kurznamen haben. Wenn Sie diese Einträge jedoch von Hand in Plone anlegen, haben die Kurznamen offensichtlich Bindestriche, und so muß es einen Weg geben, den richtigen Ordnerkontext zu erhalten.

4voto

Giacomo Spettoli Punkte 4476

Das liegt daran, dass Sie bei der Verwendung von:

app.mysite.sub-folder

python denkt, dass Sie versuchen, einen Unterschied zu machen zwischen app.mysite.sub y folder . Stattdessen müssen Sie diese Syntax verwenden:

secondlevel = mysite['sub-folder']['2nd-level']

ou

secondlevel = mysite.restrictedTraverse('/mysite/sub-folder/2nd-level')

0voto

jeorgen Punkte 646

Das tun Sie bereits:

folder = getattr(portal, 'sub-folder')

Sie haben also den Ordner mit einem Bindestrich, der in der Variablen "folder" referenziert wird.

Sie können die Ordnervariable verwenden, um invokeFactory aufzurufen, und schon sind Sie fertig. Sie weiß, wo sie sich in Plone befindet.

Sie brauchen das Werkzeug portal_url nicht zu benutzen, um invokeFactory auszuführen. Aber wenn Sie es wollen, anstatt wie Sie schreiben:

getToolByName(app.mysite.sub-folder, "portal_url")

Das könnten Sie tun:

getToolByName(folder, "portal_url")

Gegenwärtig (und wahrscheinlich für immer) brauchen Sie das jedoch gar nicht zu tun, da das portal_url-Tool für Ihren Unterordner das gleiche ist wie für die gesamte Website, so dass Sie einfach schreiben könnten:

urltool = getToolByName(app.mysite, "portal_url")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X