Lange post, eerst reacties op posts, daarna uitleg over ons systeem, tot slot weer eigen plannetjes. Voor TL:DR: klik hier 
Excuses voor het lange wachten. Ik ben naast ondernemer nog student en heb ook tentamens te maken
Dit is eigenlijk optie #3 uit mijn TS, met bijbehorende problemen. Het lijkt me ook erg lastig om dit goed bij te houden.
Oké, zie onderaan mijn post eea over onze opzet van het CMS. Wellicht dat het verheldert wat ik nu precies zoek.
In ieder geval zie ik versioning niet als iets dat gelijk staat aan een publish state. Een bepaalde versie heeft een bepaalde publish state, maar de twee zijn niet afhankelijk van elkaar. Meerdere versies kunnen dezelfde publish state hebben en je hoeft niet per se een nieuwe versie te creeeren als de publish state verandert.
Klopt. Mijn post was meer bedoeld dat ik state + version beide zag als meta-data, niet dat beide onderdelen een directe, onderlinge koppeling hebben; meer vanuit het idee dat beide aanwezig zijn en gekoppeld aan een stukje content.
Ik denk dat je hier de spijker op de kop slaat

Het is zeker een goed idee om met diff te werken, maar je zal ook een staging omgeving met de goede prestaties willen zien. Je moet dan niet elke keer een heel diff doorlopen en parsen.
Het gaat om content

De code is nog relatief simpel, met versioning systemen en een goede deployment strategie ben je er wel. Daar is ook juist veel over te vinden: ik open dit topic omdat ik bar weinig informatie kon vinden over versioning van content in cms systemen en een productie +
volledige preview omgeving.
djluc schreef op vrijdag 24 juni 2011 @ 12:21:
Content: Dit wil je in je software, dus bijvoorbeeld versioned records waarvan je 1 versie op public kan zetten.
Hier heb je inderdaad 2 onderdelen: 1. Een specifiek record, een tekst die je wijzigt bijvoorbeeld. 2. Een structuur wijziging.
Voor 1 is het simpel, gewoon versie records bijhouden.
Voor 2 hangt het heel erg van je applicatie af. Als je het over een paginaboom hebt zou je kunnen overwegen om een kopie van de boom te maken, deze aan te passen en deze vervolgens te publiceren. Dit soort zaken worden al heel snel complex, vraag je af of je niet beter punt 1 + de onderstaande punten aan kan pakken.
Het managen van losse records, ben ik ondertussen achter, is inderdaad nog relatief simpel. Ik ben nu verder aan het denken of het mogelijk is een gehele sitemap (pagina-structuur, indeling, boom; nieuwe pagina's maken, oude verwijderen etc) staging te veranderen en ineens live te publiceren. Jouw #2 dus. Met het kopiëren van de boom zat ik ook te spelen, meer info onderaan

Code / Database:
Hier gaat het wel mee lukken. Versioning zijn we mee bezig (ie, svn etc gebruiken we al vanaf start, we werken nu al aan een deployment/update strategie voor dit probleem.
Architectuur
Hier een stukje uitleg over onze opbouw. Allereerst pagina's:
Page:
id: int
type: varchar
uri: varchar
lft: int
rgt: int
Hierbij is de paginaboom gebouwd met een MPTT/Nested set methode. De pagina's hebben elk een bepaald type, die we achterhalen via een xml bestand:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <pages>
<page type="standard">
<modules>
<module name="text">
<!-- Hier wat module settings-->
</module>
</modules>
</page>
<page type="blog" route=":action/:id/:title/*">
<modules>
<module name="blog">
<!-- Hier wat module settings-->
</module>
</modules>
</page>
<page type="contact">
<modules>
<module name="text">
<!-- Hier wat module settings-->
</module>
<module name="contact">
<!-- Hier wat module settings-->
</module>
</modules>
</page>
</pages> |
Het type veld uit de db verwijst hier naar een van de type pagina's. Deze geeft een koppeling tussen modules ("content providers") en pagina's. In de module settings staat hoe deze koppeling tot stand komt. Verder bestaat er nml nog een tabel:
PageParams:
id: int
page_id: int
name: varchar
value: varchar
Zo vraagt de pagina "standard" om een content-id. De pagina A koppelt zich aan content X door in de params te vermelden dat page_id A een naam content-id heeft met value X.
Tweede voorbeeld: de pagina "twocolumn" (niet in XML weergegeven) bevat tweemaal de "text" module, een keer met een left-id, een keer een right-id. Teksten Y en Z koppelen aan pagina B door twee entries in de params op te nemen. Een keer een page=B, name=left-id, value=X, de tweede keer een page=B, name=right-id, value=Z.
Deze methode koppelt dus de losse content aan de sitemap, waardoor we nog relatief eenvoudig content kunnen versionen los van de pagina's zelf.
En dan...!?
Als je met de gegeven reacties wat gedachte-experimenten gaat doen kom je wel tot een mogelijkheid
Allereerst is dus content te managen door versioning toe te passen en daarbij een state te introduceren. Dit is nog makkelijk te doen voor gewone tekstblokjes. Bij Doctrine zullen we
versionable licht moeten aanpassen om ook een state (staging|live) op te nemen. Hoe we het verder precies uitwerken moet ik nog even kijken.
Ten tweede de paginastructuur. Voor Doctrine's
Nested Set is het mogelijk meerdere sets in een tabel op te nemen, met behulp van een root_id. Hierdoor kunnen twee boomstructuren binnen een site staan: een voor live, een voor staging.
Het laatste denkwerk wat dan nog verricht moet worden is hoe de parameter-mapping van pagina <> content bijgehouden moet worden. Het is waarschijnlijk het meest eenvoudige om te kiezen voor een oplossing waar:
1) als in een van beide bomen een pagina voorkomt, staat de entry al/nog in de params tabel (bv. bij het verwijderen of aanmaken van een pagina)
2) als in beide bomen de pagina niet meer voorkomt, wordt de entry verwijderd (bv bij verwijderen van pagina op staging en vervolgens staging publiceren naar live).
Zit ik zo een beetje op het juiste pad?