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
Peter_Jodeleit
Crownpeak employee

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

Peter
0 Kudos

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é

0 Kudos

René Zoller schrieb:

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

[..]

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

Peter

I meiner Version auch Smiley Wink

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é

0 Kudos
gockel
Crownpeak employee

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

pageref_idprovider.jpg

RZoller
Returning Observer

ja, habe es auch schon gemerkt Smiley Wink

Vielen Dank für den Hinweis!

0 Kudos
RZoller
Returning Observer

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é

0 Kudos
aVogt
Returning Creator

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

0 Kudos
RZoller
Returning Observer

Vielen Dank für die schnelle Antwort! Leider hatte ich damit keinen Erfolg

0 Kudos