Search the FirstSpirit Knowledge Base
Hallo zusammen,
Ich versuche ein sprachunabhängiges FS_REFERENCE-Feld über die API zu befüllen. Dabei gehe ich vor, wie bei jedem anderen Formularfeld auch. Ich hole mir das Objekt aus dem Formularfeld (im Falle FS_REFERENCE eine TargetReference), mache meine Änderungen an dem Objekt (soweit ich das in der API sehe, sollte das die Methode "set" sein, über die ich eine PageRef übergeben kann) und schreibe das Objekt zurück in das Feld. Die Änderungen werden jedoch nicht übernommen. In der Versionshistorie sehe ich den Speichervorgang. Anscheinend mache ich also bei der Bearbeitung des Feldes noch etwas falsch. Sieht eventuell jemand den Fehler? Verhält sich bei FS_REFERENCE etwas anders als bei den anderen Feldern?
try {
page.setLock(true);
FormData formData = page.getFormData();
FormField fsReferenceField = formData.get(null, "pt_ref");
TargetReference targetReference = (TargetReference) fsReferenceField.get();
targetReference.set(pageRef);
fsReferenceField.set(targetReference);
page.setFormData(formData);
page.save();
} catch (Exception e) {
context.logError("An Error occured while editing reference for Page " + page.getUid() + "!", e);
} finally {
if (page.isLocked()) {
page.setLock(false);
}
}
Die Felddefinition sieht übrigens folgendermaßen aus:
<FS_REFERENCE name="pt_ref" hFill="yes" sections="yes" useLanguages="no">
<FILTER>
<HIDE type="all"/>
<ALLOW type="pageref"/>
</FILTER>
<LANGINFOS>
<LANGINFO lang="*" label="link target"/>
<LANGINFO lang="DE_DE" label="Link Ziel"/>
</LANGINFOS>
<PROJECTS>
<LOCAL name=".">
<SOURCES>
<FOLDER name="root" store="sitestore"/>
</SOURCES>
</LOCAL>
</PROJECTS>
</FS_REFERENCE>
Viele Grüße
Martin
Hallo Hendrik,
ich habe es eben nochmal im Demoprojekt und anschließend in unserem Projekt versucht. Anscheinend hatte ich in meinem Test einen Logikfehler :smileyblush: Das Feld wird befüllt.
Die Verwirrung hing mit meinem ursprünglichen Problem zusammen. Ich hatte versucht, einen Link innerhalb eines CMS_INPUT_DOM zu bearbeiten und die Änderungen wurden nicht übernommen. Bei einer tieferen Analyse erschien es mir dann so, dass der Fehler im Bearbeiten der TargetReference liegt. Mit dem "Vorurteil" habe ich dann auch bei einem kleiner gebrochenen Beispiel (Eine simple Seitenvorlage mit nur einem FS_REFERENCE-Feld) ein Fehlverhalten gesehen, das nicht wirklich an dieser Stelle liegt.
Nach der Erkenntnis, dass das Problem nicht in der TargetReference liegen kann, konnte ich vorhin meinen Logikfehler finden. Ich poste das Snippet mal mit rein. Eventuell hilft das zukünftig jemandem:
FormField domField = formData.get(language, "pt_dom");
DomElement dom = (DomElement) domField.get();
DefaultDomNode domElement = dom.getRoot();
for (DomNode node : domElement.getChildren(true)) {
if (node.getNodeType().equals(DomNodeType.LINK)) {
LinkDomNode linkNode = (LinkDomNode) node;
Link link = linkNode.getLink();
FormData linkFormData = link.getFormData();
FormField domLinkField = linkFormData.get(null, "lt_siteStoreRef");
TargetReference domReference = (TargetReference) domLinkField.get();
domReference.set(pageRef);
domLinkField.set(domReference);
link.setFormData(linkFormData);
//linkNode.setLink(link); //Die Methode hatte ich fälschlicherweise aufgerufen. Das führt zur Fehlermeldung "unkown link template referenced: ''" und einem kaputten Link
}
}
Vielen Dank für die Unterstützung
Hallo Martin, bei mir funktioniert der Code im try-Block einwandfrei. Wie beziehst du das page-Objekt?
Hallo Hendrik,
vielen Dank für die Antwort.
ich habe es über zwei verschiedene Wege versucht:
1. Über die Remote-API. Dort hole ich mir über den StoreAgent den PageStore und darauas dann die Seite
2. Über ein Kontext-Skript. Dort hole ich mir über context.getElement() die Seite
Dass der try-Block bei dir funktioniert ist schon einmal gut zu wissen. Dann könnte es eventuell noch mit unserem Projekt zusammenhängen. Ich probiere das Snippet mal im Demoprojekt aus und melde mich nochmal.
Hallo Hendrik,
ich habe es eben nochmal im Demoprojekt und anschließend in unserem Projekt versucht. Anscheinend hatte ich in meinem Test einen Logikfehler :smileyblush: Das Feld wird befüllt.
Die Verwirrung hing mit meinem ursprünglichen Problem zusammen. Ich hatte versucht, einen Link innerhalb eines CMS_INPUT_DOM zu bearbeiten und die Änderungen wurden nicht übernommen. Bei einer tieferen Analyse erschien es mir dann so, dass der Fehler im Bearbeiten der TargetReference liegt. Mit dem "Vorurteil" habe ich dann auch bei einem kleiner gebrochenen Beispiel (Eine simple Seitenvorlage mit nur einem FS_REFERENCE-Feld) ein Fehlverhalten gesehen, das nicht wirklich an dieser Stelle liegt.
Nach der Erkenntnis, dass das Problem nicht in der TargetReference liegen kann, konnte ich vorhin meinen Logikfehler finden. Ich poste das Snippet mal mit rein. Eventuell hilft das zukünftig jemandem:
FormField domField = formData.get(language, "pt_dom");
DomElement dom = (DomElement) domField.get();
DefaultDomNode domElement = dom.getRoot();
for (DomNode node : domElement.getChildren(true)) {
if (node.getNodeType().equals(DomNodeType.LINK)) {
LinkDomNode linkNode = (LinkDomNode) node;
Link link = linkNode.getLink();
FormData linkFormData = link.getFormData();
FormField domLinkField = linkFormData.get(null, "lt_siteStoreRef");
TargetReference domReference = (TargetReference) domLinkField.get();
domReference.set(pageRef);
domLinkField.set(domReference);
link.setFormData(linkFormData);
//linkNode.setLink(link); //Die Methode hatte ich fälschlicherweise aufgerufen. Das führt zur Fehlermeldung "unkown link template referenced: ''" und einem kaputten Link
}
}
Vielen Dank für die Unterstützung