Zitten rondprutsen in andermans code

Zitten rondprutsen in andermans code is niet altijd even evident.

Ik heb daarnet een eenvoudig schermpje bij de content manager gevoegd (met per node in de boom een achttal mogelijke “ontbreekt”-velden en een zevental statusvelden, van “created” over “internal validation” tot “publication”). Dat was rap gedaan: tabje bij in de node properties, hup een paar checkboxen erop, wat vieze code in GetContent om .checked laten afhangen van een veld in de database, onClick allChange aanroepen, en dan in ApplyContent wat vieze code om de database-velden te laten zetten zoals ze .checked-prperty van de checkboxen stonden.

Ik zeg “vieze code” trouwens omdat ik geen flauw idee heb hoe ik in Delphi een variabelenaam dynamisch kan laten evalueren. Zoals het nu is, zit ik opgescheept met monstrositeiten in de zin van

aTemp1:=strToBool(varToStr(rs.fields[‘node_temp1’].value));
aTemp2:=strToBool(varToStr(rs.fields[‘node_temp2’].value));
aTemp3:=strToBool(varToStr(rs.fields[‘node_temp3’].value));
aTemp4:=strToBool(varToStr(rs.fields[‘node_temp4’].value));

Ik zou het misschien kunnen oplossen met een structuur of een array of zo, dynamisch die checkboxen er run-time op pleuren, maar daar ben ik bang van: het is al te lang geleden en ik zou er teveel op moeten zoeken. Mocht dit ColdFusion-achtig zijn, dan zou ik verwachten iets in de zin van het volgende te kunnen doen:

for i:=1 to 17 do
  evaluate(‘aTemp1’+intToStr(i)):=
   strToBool(varToStr(rs.fields[‘node_temp’+intToStr(i)].value));

…maar het is dus niet iets ColdFusion-achtig, en dat lukt allemaal niet wegens alsdat die strings uiteraard tegen dat het run-time is allang geen strings meer zijn, en dus is het vies gecodeerd, waarschijnlijk weet Stijn wel hoe het eigenlijk moet.

Enfin dus, so far so good, dacht ik, nu nog die zooi synchroniseren. Een stukje toevoegen aan TSyncThread.UpdateNode voor de synchronisatie heen:

for i:=1 to 17 do
  AddElem(Content,’temp’+intToStr(i)).text:=
    tbl.Fields[‘node_temp’+intToStr(i)].Value;

…en de tegenhanger in TSyncThread.TaskNode voor de synchronisatie terug:

for i:=1 to 17 do
  tbl.Fields[‘node_temp’+intToStr(i)].Value:=
    GetElem(content,’temp’+intToStr(i))=’1′;

Hoplaboem, niet veel later, en ik dacht dat ik klaar was. Statusje veranderen op de site, synchroniseren… niets. Ahem. Nakijken in de database, tiens, counter wordt niet geïncrementeerd op het node-object bij een edit on-line. Dus toegevoegd

<cfscript>
  request.app.sync=request.fnEdit.getCurrentSync();
  request.app.editSync=request.fnEdit.getIncrementSync();
  request.fnObjectsEdit.updateObject(node_id);
</cfscript>

aan de update-actie op de site. En nog eens synchroniseren.

Ah tiens, de gewijzigde node verdwijnt gewoon helemaal. Opsporen, zoeken, ha! Er stond

tbl.Fields[‘node_deleted’].Value:=GetElem(content,’deleted’)=’0′;

en dat moest zijn

tbl.Fields[‘node_deleted’].Value:=GetElem(content,’deleted’)=’1′;

Opgelost? Nope. Bleek dat dezelfde actie (deleted:=true als <deleted>0</deleted>) ook nog eens uitgevoerd werd op het object zelf, dus niet op de node-als-node, maar op de node-als-object.

Aangepast, sync, juich! Het lukt!