RZoller
Returning Observer

TargetReference erzeugen

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

17 Replies
aVogt
Returning Creator

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);

0 Kudos
RZoller
Returning Observer

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

0 Kudos
RZoller
Returning Observer

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...

0 Kudos
gockel
Crownpeak employee

Hallo Andreas,

ein paar allgemeine Anmerkungen zu deinem Code.

  1. Casts: Es fällt auf, dass du sehr viele Casts zu internen  Implementierungsklassen machst. Das ist erstens gar nicht nötig und  zweitens sind diese internen Klassen nicht Bestandteil der API und somit  ist nicht sichergestellt, dass diese in späteren FirstSpirit Versionen  noch vorhanden sein werden.
  2. Linkfactory: Die Verwendung von Linkfactory ist deprecated. (vergl. UserService#getLinkFactory()).

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);

aVogt
Returning Creator

Ist der Link falsch, oder wird nur ein falscher Text angezeigt?

0 Kudos
gockel
Crownpeak employee

Hallo René,

die Verwendung von

siteList = siteNode.getChildren(PageRef.class,true).toList();

sollte man aus den hier beschriebenen Gründen nach Möglichkeit vermeiden.

aVogt
Returning Creator

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

    0 Kudos
    RZoller
    Returning Observer

    Die Links werden in der Eingabekomponete im Redakteurs-Client falsch angezeigt. Sowohl die Beschriftung, als auch der Link selbst.

    0 Kudos