RZoller
Returning Observer

Speichern von Metadaten

Hallo zusammen,

ich habe ein Skript geschrieben, das für zwei Felder in den Metadaten je eine speziellen String berechnet und diese dann dort speichern soll. Die Strings werden entsprechend berechnet und auch den Feldern zugewiese. Vor dem Speichern zeigt mir storeElement.getMeta() die Werte der Felder korrekt an. Dann speichere ich mit storeElement.save("Zähler URL hinzugefügt") und dann sind die gesetzten Strings wieder weg, wenn ich direkt danach noch einmal storeElement.getMeta() aufrufe.

Woran kann das liegen?

Das Skript sieht derzeit so aus:

//!Beanshell
import de.espirit.firstspirit.access.store.sitestore.PageRef;
import de.espirit.firstspirit.access.store.IDProvider;
import de.espirit.firstspirit.access.store.LockException;
import de.espirit.firstspirit.common.gui.CMSDialog;

CMSDialog.showInfoDialog("Debug: Start");
storeElement = context.getStoreElement();

if(storeElement instanceof PageRef) {
sElementStatus = storeElement.getReleaseStatus();
CMSDialog.showInfoDialog("Debug: Release-Status: " + storeElement.getReleaseStatus());
try {//Element sperren

  storeElement.setLock(true, false);
 
  if(storeElement.hasMeta()){
   if(storeElement.isStartNode()){
    uidPath= storeElement.getUid() + ".index";
   }else{
    uidPath= storeElement.getUid();
   }

   String urlPathDe = storeElement.getMeta().get("md_url_de").getEditor().value;
   String urlPathEn = storeElement.getMeta().get("md_url_en").getEditor().value;
   if(urlPathDe != null && urlPathEn != null ){
    
    urlPathDe = urlPathDe.replace("/",".").replace("-","_").trim();
    urlPathEn = urlPathEn.replace("/",".").replace("-","_").trim();
   
    //default speichern
    uidPathDe = urlPathDe +"." +uidPath;
    storeElement.getMeta().get("md_sstatcounter_default_de").getEditor().value = "content.de" +uidPathDe;
    //CMSDialog.showInfoDialog("DE_url" +storeElement.getMeta().get("md_sstatcounter_default_de").getEditor().value);
   
    //englisch speichern
    uidPathEn = urlPathEn +"." +uidPath;
    storeElement.getMeta().get("md_sstatcounter_default_en").getEditor().value =  "content.en" +uidPathEn;
    //CMSDialog.showInfoDialog("EN_url" +storeElement.getMeta().get("md_sstatcounter_default_de").getEditor().value);

   
    CMSDialog.showInfoDialog("Meta vor dem speichern: " +storeElement.getMeta());
   }else{
    CMSDialog.showInfoDialog("Bitte überprüfen Sie in den Metadaten die Suchmaschinen-Optimierung. Ggf. ist hier kein Wert gesetzt!");   
    return false;
   }
   //CMSDialog.showInfoDialog("isLockSupported(): "+ storeElement.isLockSupported());
   storeElement.save();
   CMSDialog.showInfoDialog("Meta nach dem Speichern: " +storeElement.getMeta());

     if(sElementStatus == 0){
     storeElement.release();
    }
  
   storeElement.setLock(false, false);
   }else{
   CMSDialog.showInfoDialog("Bitte überprüfen Sie in den Metadaten die Suchmaschinen-Optimierung. Ggf. ist hier kein Wert gesetzt!");
   return false;
  }
 
 
 
} catch (LockException e) {
    CMSDialog.showInfoDialog(e.toString());
  context.logInfo("Fehler, Objekt ist keine Seite!");
  context.logInfo("=== Ende setzen des default SiteStat Counters ===");
  return false;
 
}
}else{

context.logInfo("Fehler, Objekt ist keine Seite!");
context.logInfo("=== Ende setzen des default SiteStat Counters ===");
return false;

}


Viele Grüße


René Zoller

4 Replies
witt
I'm new here

Hallo Rene,

du musst das ganze ein wenig umbauen bzw. erweitern. Auf dem StoreElement holst du dir das Data-Objekt

data = storeElement.getMeta();

Auf dem Data Objekt holst du dir dann die Werte und setzt bzw. veränderst sie.
Vor dem Speichern setzt du die Daten wieder mit

storeElement.setMeta(data);
storeElement.save();

Dann sollten die Werte auch richtig gesetzt sein.

Gruß,
Daniel

gockel
Crownpeak employee

Und bitte immer beachten, dass bei einem nicht-rekursiven Lock:

storeElement.setLock(true, false);

auch nicht-rekursiv gespeichert werden muss:

storeElement.save("my meta data change comment", false);

Das gilt auch für die Freigabe:

storeElement.release(false);

Das Lock sollte in ein try/finally, sonst bleibt das Element mitunter gesperrt.

vergl. hierzu auch: https://community.e-spirit.com/message/1722#1722

RZoller
Returning Observer

Hallo Daniel,

vielen Dank für die schnelle Antwort. Genau richtig Deine Lösung. Das get/setMeta() hätte es bei mir auch klingeln lassen können Smiley Wink

Vielen Dank!

René

0 Kudos
RZoller
Returning Observer

Hallo Sebastian,

vielen Dank für die Hinweise. Ich habe sie in der aktuellen Version des Skript mit berücksichtigt.

Vielen Dank!

René

0 Kudos