Search the FirstSpirit Knowledge Base
Hallo zusammen,
wie im API-Beispiel (ReferenceEditorValueExample.html) möchte ich mit einem Skript ein ReferenceEditorValue befüllen. Dafür benötige ich nach dem Beispiel eine Instanz vom Typ TargetReference. Ich habe eine Seitenreferenz vom Typ PageRef zur Verfügung. Wie komme ich von diesem Objekt zu dessen TargetReference?
Das ursprüngliche Eingabeformularelement ist ein INPUT_LINK
<CMS_INPUT_LINK name="cs_link" allowEmpty="no" hFill="yes" useLanguages="no">
<LANGINFOS>
<LANGINFO lang="*" label="Link (Pflichtfeld)"/>
<LANGINFO lang="EN" label="Link (mandatory field)"/>
</LANGINFOS>
<LINKEDITORS>
<LINKEDITOR name="internal_link"/>
</LINKEDITORS>
</CMS_INPUT_LINK>
Vieleicht gibt es einen einfacheren Weg, dorthinein ein Link zu speichern? Der bisherige Code sieht so aus..
new_link = entityData.get("cs_link");
new_link_editor = new_link.getEditor();
allowedLinkTemplates = new_link_editor.getAllowedLinkTemplates();
linkTemplate = allowedLinkTemplates.get(0);new_link_template = linkTemplate.createLink(null);
new_link_ref = new_link_template.getData().get("sitestoreref").getEditor();
Viele Grüße
René Zoller
Das Beispiel LinkEditorValueExample passt besser.
Was dir fehlt, ist wie man im Link-Objekt (bei dir in der Variable "new_link_template" -> "new_link" würde besser passen) die Seitenrefernz setzt?
Das geht über "new_link.getData() / setData()"...
Gruß, Peter
Hallo Peter,
vielen Dank für Deine Antwort. Wie man den Link setzt ist mir klar. Was mir nicht klar ist ist wie man jetzt aus einem PageRef, der gegeben ist, einen Link zusammenbaut, so dass ich ihn mit setData() setzen kann.
Gegeben ist für mich
aSite vom Typ class de.espirit.firstspirit.store.access.sitestore.PageRefImpl
Zu dieser Seite muss ich einen Link speichern.
Wenn ich getData() mache bekomme ich:
<<TEMPLATECONTENT><CMS_VALUE name="text"><LANG id="§" set="0"/></CMS_VALUE><CMS_VALUE name="sitestoreref"><LANG id="§" set="0"/></CMS_VALUE><CMS_VALUE name="linkTarget"><LANG id="§" set="0"/></CMS_VALUE><CMS_VALUE name="comment"><LANG id="§" set="0"/></CMS_VALUE></TEMPLATECONTENT>>
Hier muss ich mir dann den sitestoreref holen mit
new_link_template.getData().get("sitestoreref").getEditor();
das Objekt, was dort herauskommt ist dann ein
de.espirit.firstspirit.client.access.editor.ReferenceEditorValueImpl@150bde8
bei dem ich jetzt nicht weiß, wie dort meinen Verweis zu meinem gegeben PageRef-Objekt speichere.
In dem Beispiel (ReferenceEditorValueExample.html) benötige ich eine TargetReference...
Viele Grüße
René
René Zoller schrieb:
[..] das Objekt, was dort herauskommt ist dann einde.espirit.firstspirit.client.access.editor.ReferenceEditorValueImpl@150bde8
bei dem ich jetzt nicht weiß, wie dort meinen Verweis zu meinem gegeben PageRef-Objekt speichere.
In dem Beispiel (ReferenceEditorValueExample.html) benötige ich eine TargetReference...
[..]
In meiner Version des Beispiels wird die TargetReference in Zeile 34 erzeugt:
/**
* Stores the given IDProvider in the reference editor for the specified language
*
* @since 4.2.34
*/
public ReferenceEditorValue setValueForLanguage(final ReferenceEditorValue editor, final IDProvider idProvider, final Language language) throws InvalidValueException {
// 1. check if language is provided if editor is language dependent ("useLanguages='yes'" in gom syntax)
if (editor.isLanguageDependent() && (language == null)) {
throw new NullPointerException("Language is missing!");
}
// 2. create a new @{link TargetReference} using the TargetReferences factory.
/* LINE 34 */ final TargetReference targetReference = TargetReferences.newInstance(language, idProvider, "");
// 3. store this instance in the editor value
editor.set(language, targetReference);
I meiner Version auch
Wie komme ich denn nun von einem PageRef zur einem IDProvider?? Ich habe keine Methode gefunden, wie mir da ein Objekt von erzeugen kann. ODer übersehe ich da etwas?
Danke für die Mühe!
René
Wie komme ich denn nun von einem PageRef zur einem IDProvider?
Ein PageRef ist ein IDProvider sprich PageRef erbt von IDProvider. Siehe Javadoc von PageRef
ja, habe es auch schon gemerkt
Vielen Dank für den Hinweis!
Ich habe das Problem mit dem Link jetzt gelöst.
//Speichern vorbereiten
content2ElementTL = cs.getContent2ByName(CST_TEASERLISTE);
tmpSession = content2ElementTL.getSchema().getSession();
tmpSession.rollback();
entity = tmpSession.createEntity(TBL_TEASERLISTE);
entityData = content2ElementTL.getDataObject(entity);
...
new_link = entityData.get("cs_link");
new_link_editor = new_link.getEditor();
allowedLinkTemplates = new_link_editor.getAllowedLinkTemplates();
linkTemplate = allowedLinkTemplates.get(0); //LinkTemplate, nur eines hier definiert
link = linkTemplate.createLink(lang_de); //Link
link_data = link.getData();
ref = link_data.get("sitestoreref").getEditor(); //ReferenceEditorValue
targetref = ref.getEmpty(lang_de);
targetref.set(aSite);
ref.set(lang_de,targetref);
link.setData(link_data);
link.setText(aSite.getFilename());
new_link_editor.set(lang_de, link);
das wird innerhalb einer while-schleife ausgeführt und in einer Datenbank gespeichert. Jedoch haben alle Einträge in der Datenbank den gleichen Link, wenn ich diese überprüfe. Ich habe an allen möglichen Stellen schon geckeckt, ob der Wert in dem Link während der Schleifendurchläufen stimmt. Er wird korrekt ausgegeben, aber nicht gespeichert. Interessant ist auch, dass er bei der deutschen und englischen Sprachvariante andere Links speichert, obwohl angegeben wurde, dass es keine Sprachvarianten gibt.
Ich speichere mit:
content2ElementTL.setDataObject(entity,entityData);
tmpSession.commit();
Alle anderen Daten (zB. Text- oder DOM-Felder) sind korrekt gespeichert, nur der Link nicht. Woran könnte denn sowas liegen?!?
Viele Grüße
René
Versuche mal mit
entity.getSession().commit();
zu speichern.
Ich fülle auch einige <CMS_INPUT_LINK>
bei mir funktioniert es.
Session.commit() funktioniert bei mir nur bei bestehenden Datensätzen
Vielen Dank für die schnelle Antwort! Leider hatte ich damit keinen Erfolg