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
Ich baue den Link auch etwas anderes zusammen.
Hier mal der Auszug aus meinem Linksetzen (allerdings auf ein Medium, da müsste nur ei den Attributen mediaref durch pageref(glaub ich) ersetzt werden)
Vielecht hilft das weiter.
Content2Impl c2 = (Content2Impl) CSC.getStoreElement();
DataImpl dob = (DataImpl) c2.getDataObject(this.entity);
LinkEditorValueImpl link_field = (LinkEditorValueImpl) dob.get(formField).getEditor();
link_field.clear();
LinkTemplate linktemplate = (LinkTemplate) this.ts.getStoreElement("Verweisvorlage",IDProvider.UidType.valueOf("TEMPLATESTORE_LINKTEMPLATE"));
de.espirit.firstspirit.access.link.LinkFactory lf = this.us.getLinkFactory();
myLink = (LinkImpl) lf.create("Verweiskonfiguration");
myLink.setTemplate(linktemplate);
myLink.setText(showName);
myLink.setComment(showName);
HashMap<String, String> linkAttributes = (HashMap<String, String>) myLink.getAttributes();
linkAttributes.put("mediaref","media:"+refName);
myLink.setAttributes(linkAttributes);
link_field.set(language, myLink);
c2.setDataObject(entity,dob);
Hallo Andreas,
vielen Dank für Deinen Code. Ich habe zum Test noch ein Skript ohne while-schleife. Hier funktioniert alles einwandfrei. So wie es aussieht mache ich in der Schleife irgendwo was falsch...
//Process DE
targetReference = sf_de.get(lang_de);
if (targetReference != null) {
siteNode = targetReference.get();
siteList = siteNode.getChildren(PageRef.class,true).toList();
siteListIterator = siteList.iterator();
while(siteListIterator.hasNext()){
aSite = siteListIterator.next();
aPage = aSite.getPage();
aPageData = aPage.getData();
inTeaserList = aPageData.get("pt_teaserList").getEditor().get(lang_de);
if(inTeaserList == true){//Seite soll in die Teaserliste aufgenommen werden
headline = aPageData.get("pt_headline");
headline_de = headline.getEditor().get(lang_de);
headline_en = headline.getEditor().get(lang_en);
intro = aPageData.get("pt_intro");
intro_de = intro.getEditor().get(lang_de);
intro_en = intro.getEditor().get(lang_en);
//Versuche das erste Bild zu holen
picture_de = null;
picture_en = null;
aPageSections = aPage.getChildren(Section.class, true);
sectionIterator = aPageSections.iterator();
while(sectionIterator.hasNext()){
tmpSection = sectionIterator.next();
tmpPicture = tmpSection.getData().get("st_picture");
if(tmpPicture != null){
picture_de = tmpPicture.getEditor().get(lang_de);
picture_en = tmpPicture.getEditor().get(lang_en);
break;
}else{
//ToDo: Kein Bild gefunden
}// if tmpPicture
}//end while sections
//Speichern vorbereiten
content2ElementTL = cs.getContent2ByName(CST_TEASERLISTE);
tmpSession = content2ElementTL.getSchema().getSession();
tmpSession.rollback();
entity = tmpSession.createEntity(TBL_TEASERLISTE);
entityData = content2ElementTL.getDataObject(entity);
new_headline = entityData.get("cs_headline");
new_headline.getEditor().set(lang_de, headline_de );
new_intro = entityData.get("cs_text");
new_intro_editor = new_intro.getEditor();
new_intro_editor.set(lang_de, intro_de);
new_picture = entityData.get("cs_picture");
new_picture_editor = new_picture.getEditor();
new_picture_editor.set(lang_de, picture_de);
new_link = entityData.get("cs_link");
new_link_editor = new_link.getEditor();
allowedLinkTemplates = new_link_editor.getAllowedLinkTemplates();
linkTemplate = allowedLinkTemplates.get(0); //LinkTemplate
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);
JOptionPane.showMessageDialog(null,"LinkRef:" +ref.toXml());
link.setData(link_data);
link.setText(aSite.getFilename());
new_link_editor.set(lang_de, link);
new_category = entityData.get("cs_kategorie");
new_category_editor = new_category.getEditor();
optionModel = new_category_editor.getOptionModel(null);
option = optionModel.getOption(String.valueOf(aCategoryId));
new_category_editor.set(null, option);
//speichern
content2ElementTL.setDataObject(entity,entityData);
//tmpSession.commit();
entity.getSession().commit();
}// end if in TeaserList
}//end while siteList
}//end if targetRef
Oh-ha, ich habe mir das gerade mal in der DB direkt angeschaut. Da werden die Datensätze korrekt gespeichert. Nur in der Eingabekomponente steht was falsches drin! Ich werde die Tabelle wohl noch mal komplett löschen und neu anlegen. Mal sehen, ob es dann funktioniert...
Hallo Andreas,
ein paar allgemeine Anmerkungen zu deinem Code.
In deinem Code sind das konkret diese Stellen:
Content2Impl c2 = (Content2Impl) CSC.getStoreElement();
Content2 c2 = (Content2) CSC.getStoreElement();
DataImpl dob = (DataImpl) c2.getDataObject(this.entity);
Data dob = c2.getDataObject(this.entity);
LinkEditorValueImpl link_field = (LinkEditorValueImpl) dob.get(formField).getEditor();
LinkEditorValue link_field = (LinkEditorValue) dob.get(formField).getEditor();
link_field.clear();
LinkTemplate linktemplate = (LinkTemplate) this.ts.getStoreElement("Verweisvorlage",IDProvider.UidType.valueOf("TEMPLATESTORE_LINKTEMPLATE"));
LinkTemplate linktemplate = (LinkTemplate) this.ts.getStoreElement("Verweisvorlage", UidType.TEMPLATESTORE_LINKTEMPLATE);
de.espirit.firstspirit.access.link.LinkFactory lf = this.us.getLinkFactory();
myLink = (LinkImpl) lf.create("Verweiskonfiguration");
myLink.setTemplate(linktemplate);
myLink.setText(showName);
myLink.setComment(showName);
HashMap<String, String> linkAttributes = (HashMap<String, String>) myLink.getAttributes();
linkAttributes.put("mediaref","media:"+refName);
myLink.setAttributes(linkAttributes);
link_field.set(language, myLink);
c2.setDataObject(entity,dob);
Ist der Link falsch, oder wird nur ein falscher Text angezeigt?
Hallo René,
die Verwendung von
siteList = siteNode.getChildren(PageRef.class,true).toList();
sollte man aus den hier beschriebenen Gründen nach Möglichkeit vermeiden.
Hallo Sebastian,
das hab ich auch schon mitbekommen, da ich z.B. das Linkerzeugen/setzen in einer Klasse/modul ausgelagert habe und ich erst nicht so richtig wußte, hab ich mir die Klassen immer von Javaclient-Script ausgeben lassen (da kommt immer *Impl).
Ich baue mittlerweile die klassen um, aber das dauert halt noch ...
Linkfactory: Die Verwendung von Linkfactory ist deprecated. (vergl. UserService#getLinkFactory()).
Wir haben noch 4.1, da ist es noch erlaubt
Danke für die hinweise
Die Links werden in der Eingabekomponete im Redakteurs-Client falsch angezeigt. Sowohl die Beschriftung, als auch der Link selbst.