Deel 3 van de uitleg over Acquisitie binnen Zope.
Lees ook deel 1 en deel 2
In deel 1 is het principe van acquisitie geïntroduceerd en in deel 2 is getoond hoe dat ook voor dynamische pagina’s gebruikt kan worden. In dit derde en tevens laatste deel een kort voorbeeld van hoe scripts op een centrale plaats opgeslagen kunnen worden en hoe dat in de url zijn plaats krijgt.
Ik ga weer uit van deze mappenstructuur in Zope. Stel, ik wil nu het script Bestandenlijst2 dat ik gisteren besproken heb in de map ‘Scripts’ opslaan (ik heb het getal 2 toegevoegd om de kopie een ander naam te geven). Hoe stel ik dan de URL samen? Immers, ‘http://localhost:8080/AcquisitieDemo/Fotos/Kinderen/Niek/Bestandenlijst2‘ zal dan niet werken, omdat ‘Scripts’ geen ouder is van ‘Niek’ en er zo geen overerving plaats vindt. Om meteen het geheim te verklappen, het antwoord ziet er, zeker als je uitgaat van wat je weet van URLs vreemd uit: ‘http://localhost:8080/AcquisitieDemo/Scripts/Fotos/Kinderen/Niek/Bestandenlijst2‘.
Eerder had ik uitgelegd dat Zope, als een object of methode niet gevonden wordt, automatisch in de familieboom naar boven gaat zoeken om te kijken of het object daar wel gevonden kan worden. Het is eigenlijk wat complexer. Zope zoekt namelijk in het pad dat vanaf de root tot dat moment afgelegd is. En in dit voorbeeld zie je dat dat niet persé lineair naar beneden hoeft te zijn.
De stappen die Zope zet: Gestart wordt in de root ‘/’ en daar zoekt Zope een object met de naam ‘AcquisitieDemo’. Die is er, dus dat gaat goed. Binnen ‘AcquisitieDemo’ zoekt Zope een object ‘Script’. Ook dat is er. Binnen ‘Script’ zoekt Zope naar een object ‘Fotos’. Dat is er niet. Daarop kijkt Zope of het object ‘Fotos’ wél beschikbaar is in de ouder van ‘Script’ (en dat is ‘AcquisitieDemo’). Dat blijkt het geval te zijn, dus vervolgt Zope de zoektocht daar. Binnen ‘Fotos’ is een object ‘Kinderen’ beschikbaar met daarbinnen het object ‘Niek’. Binnen ‘Niek’ is echter geen object ‘Bestandenlijst2’ te vinden en dus gaat Zope op zoek.
Zoals ik zei, zoek Zope terug in het pad dat hij tot dat moment afgelegd heeft. In dit geval was dat ‘/’ -> ‘/Acquisitiedemo’ -> ‘/Acquisitiedemo/Scripts’ ->> ‘/Acquisitiedemo’ -> ‘/Acquisitiedemo/Fotos’ -> ‘/Acquisitiedemo/Fotos/Kinderen’ -> ‘/Acquisitiedemo/Fotos/Kinderen/Niek’ (->> betekent terug zoeken, -> betekent vooruit). Het zoeken gaat nu dus als volgt: ‘/Acquisitiedemo/Fotos/Kinderen/Niek’ ->> ‘/Acquisitiedemo/Fotos/Kinderen’ ->> ‘/Acquisitiedemo/Fotos’ ->> ‘/Acquisitiedemo’ ->> ‘/Acquisitiedemo/Scripts’ ->> ‘/Acquisitiedemo’ ->> ‘/’ ->> Foutmelding indien niet gevonden. In dit geval komt het niet tot een Foutmelding omdat in ‘/Acquisitiedemo/Scripts’ het object ‘Bestandenlijst2’ gevonden wordt. Omdat dit een dynamische pagina is (met scripting tags er in), gaat Zope op zoek naar het object dat de context bepaald waarbinnen dat script uitgevoerd wordt. Dat object is het ‘voorlaatste’ object in de URL-structuur, in dit geval dus ‘Niek’.
Andere ‘rare’ URLs die werken:
http://localhost:8080/AcquisitieDemo/Fotos/Kinderen/Marit/Niek/Bestandenlijst
http://localhost:8080/AcquisitieDemo/Fotos/Kinderen/Scripts/Marit/Niek/Bestandenlijst2 http://localhost:8080/AcquisitieDemo/Scripts/Fotos/Kinderen/Scripts/Marit/Niek/Bestandenlijst2 etc.
Je zou kunnen proberen het pad dat Zope aflegt op basis van die urls te verklaren (als het niet lukt, laat het mij dan maar weten).
Tot slot een uitzoeker:
Stel, ik maak in de map ‘Niek’ en nieuw lege map aan met de naam ‘Bestandenlijst2‘. Wat gebeurt er dan als ik de URL ‘http://localhost:8080/AcquisitieDemo/Scripts/Fotos/Kinderen/Niek/Bestandenlijst2‘ invoer ??? (eerst denken voordat je kijkt wat het resultaat is !!)
Voeg je inzending (en de uitleg waarom het zo werkt) als opmerking hieronder toe !