Search the FirstSpirit Knowledge Base
Hallo,
ich würde gerne Inhalte aus einer Datenbank aus dem Projekt A in die Datenbank aus dem Projekt B kopieren.
Projekt B hat zugleich einen Remotezugang auf die Medieninhalte aus dem Projekt A.
Mein Script funktioniert bereits zu 99%. Ich habe nurnoch ein Problem mit den Remotemedien.
Mein Code sieht wie folgt aus:
us = context.getUserService();
cs = us.getStore(Store.CONTENT_STORE, false);
contentSource = cs.getContent2ByName("i_news");
schemaTable = contentSource.getSchema();
Session orSession = schemaTable.getSession();
Select select = orSession.createSelect("I_News");
...
entity_news.setValue("pic_press_release",entity_press_release.getValue("image"));
...
"entity_news" ist ein neuer Datensatz in dem Projekt B. (Wird später per orSession.commit() gespeichert)
"entity_press_release" ist der Datensatz aus dem Projekt A. (Wird an einer anderen Stelle ermittelt, hab das hier weg gelassen)
Die Felder "pic_press_release" und "image" sind beide vom Typ "FS_REFERENCE".
Das Problem was ich jetzt habe ist, dass ich das Objekt aus dem Projekt B nicht dem Objekt aus Projekt A
gleich setzen darf.
Der Inhalt von "image" könnte z.B.
PIC_PRESS_RELEASE
<CMS_VALUE name="cs_picture" tag="FS_REFERENCE"><LANG id="§" set="1"><UID>testobjekt</UID><UIDTYPE>MEDIASTORE_LEAF</UIDTYPE><REMOTE/><SECTION></SECTION></LANG></CMS_VALUE>
Das Feld "pic_press_release" erwartet allerdings
PIC_PRESS_RELEASE
<CMS_VALUE name="cs_pic_press_release" tag="FS_REFERENCE"><LANG id="§" set="1"><UID>testobjekt</UID><UIDTYPE>MEDIASTORE_LEAF</UIDTYPE><REMOTE>internet</REMOTE></LANG></CMS_VALUE>
Kann ich den Wert entity_press_release.getValue("image") noch nirgendwie manipulieren? z.B. replace von Zeichenketten ???
Hat jemand eine Idee?
Mit diesem Code sollte es funktionieren:
remoteProject = context.getConnection().getProjectById(9);
mediaStore = remoteProject.getUserService().getStore(Store.Type.MEDIASTORE,false);
medium = mediaStore.getMediaByUid("business_handshake");
tr = TargetReferences.newInstance(context.getProject().getMasterLanguage(),medium, "intranet");
data.get("cs_pic").getEditor().set(context.project.masterLanguage, tr);
dataset.setData(data);
dataset.save();
Viele Grüße
Matthias Gelinski
Noch ein paar Infos.
Wenn ich mir die Klasse von dem Objekt "entity_press_release.getValue("image") "
zurück geben lasse, erhalte ich de.espirit.firstspirit.client.editorcomponent.EditorWrapper
Mit der Klasse kann ich leider nichts anfangen ???
Bitte den Weg über Dataset gehen, z.B. aus von hier aus: http://www.e-spirit.com/odfs42/access/de/espirit/firstspirit/access/store/contentstore/Content2.html...
Hi, ich habe jetzt folgendes gemacht, komme allerdings nicht so recht weiter.
dataObject = contentSource.getDataObject(entity_news);
dateValue = dataObject.createDataValue("cs_pic_subline_ES");
Muss ich überhaupt ein neues Element erstellen ????
Der Inhalt muss am Ende wie folgt ausschauen ->
<UID>testobjekt</UID><UIDTYPE>MEDIASTORE_LEAF</UIDTYPE><REMOTE>internet</REMOTE>
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.newDocument();
Element element = doc.createElement("UID");
Reicht es eigentlich aus ein w3c Element anzulegen oder muss ich das anders machen???
So wie ich das momentan nämlich mache, funktioniert das nicht richtig
dateValue = dataObject.create("cs_pic_press_release", us, element) ;
dateValue.getEditor().setValueNode(element);
contentSource.setDataObject(entity_news, dataObject);
Zum Schluss wird abgespeichert, es wird aber immer nur ein leeres Element angelegt ???
orSession.release(entity_news);
orSession.commit();
Bin ich auf dem richtigen Weg???
ich habe jetzt noch folgendes ausprobiert
dateValue = | dataObject.create("cs_pic_press_release", us, null); |
dateValue.getEditor().getValue().setUid("Taufe_Rio_Blanco_2");
dateValue.getEditor().getValue().setRemoteSymName("internet");
dateValue.getEditor().getValue().setUidType(UidType.MEDIASTORE_LEAF);
Das funktioniert ebenfalls nicht, die Änderungen werden nicht gespeichert ????
Reicht der folgende Aufruf nicht aus ???
contentSource.setDataObject(entity_news, dataObject);
orSession.release(entity_news);
orSession.commit();
Kann mir jemand sagen ob ich jetzt auf dem richtigen Weg bin???
So funktioniert das nämlich auch nicht ?
dataObject = contentSource.getDataObject(entity_news);
dataValue = dataObject.create("cs_pic_press_release", us, null);
editorValue = dataValue.getEditor();
value = editorValue.get(siteStore.getProject().getMasterLanguage());
value.setUid("SEITE");
value.setRemoteSymName("internet");
value.setUidType(UidType.MEDIASTORE_LEAF);
editorValue.set(siteStore.getProject().getMasterLanguage(), value);
Ihr letzter Ansatz war schon gut.
Nach dem verändern des DataObjects müssen sie dieses jedoch wieder sichern.
Wenn man zusätzlich noch den Weg über das Dataset geht, sollte es mit dem Folgenden Code funktionieren.
dataset = contentSource.getDataset(entity_news);
dataObject = dataset.getData();
dataValue = dataObject.create("cs_pic_press_release", us, null);
editorValue = dataValue.getEditor();
value = editorValue.get(siteStore.getProject().getMasterLanguage());
value.setUid("SEITE");
value.setRemoteSymName("internet");
value.setUidType(UidType.MEDIASTORE_LEAF);
editorValue.set(siteStore.getProject().getMasterLanguage(), value);
dataset.setData(dataObject);
Vielen Dank für die Antwort, leider speichert er das Dataset immer noch nicht ???
Mein Quellcode sieht wie folgt aus:
us = context.getUserService();
cs = us.getStore(Store.CONTENT_STORE, false);
contentSource = cs.getContent2ByName("i_news");
schemaTable = contentSource.getSchema();
Session orSession = schemaTable.getSession();
Select select = orSession.createSelect("I_News");
keys_news = orSession.fetchKeys(select);
if(keys_news.size()>0)
{
// update
row_news = keys_news.get(0);
Entity entity_news = orSession.find(row_news);
Object object_news = entity_news.getValue("pr_fs_id") ;
text.append("News update ID: "+object_news+"<br/>");
entity_news.setValue("pic_subline_DE","Text ... ");
// get dataset
dataset = contentSource.getDataset(entity_news);
dataObject = dataset.getData();
dataValue = dataObject.create("cs_pic_press_release", us, null);
editorValue = dataValue.getEditor();
value = editorValue.get(siteStore.getProject().getMasterLanguage());
value.setUid("SITE");
value.setRemoteSymName("internet");
value.setUidType(UidType.MEDIASTORE_LEAF);
editorValue.set(siteStore.getProject().getMasterLanguage(), value);
dataset.setData(dataObject);
contentSource.setDataObject(entity_news, dataObject);
orSession.release(entity_news);
orSession.commit();
}
Mit diesem Code sollte es funktionieren:
remoteProject = context.getConnection().getProjectById(9);
mediaStore = remoteProject.getUserService().getStore(Store.Type.MEDIASTORE,false);
medium = mediaStore.getMediaByUid("business_handshake");
tr = TargetReferences.newInstance(context.getProject().getMasterLanguage(),medium, "intranet");
data.get("cs_pic").getEditor().set(context.project.masterLanguage, tr);
dataset.setData(data);
dataset.save();
Viele Grüße
Matthias Gelinski
Gibt es hier ein fertiges Script, das man verwenden kann um Datensätze von einem Projekt in das andere kopireren kann?