Search the FirstSpirit Knowledge Base
Hallo Community,
Ist-Situation
Ich habe eine Datenquelle, in dieser Datenquelle gibt es ein Bild (tt_picture) und einen Alternativtext (tt_alternativeText).
Soll-Situation
1. Neben dem Alternativfeld, dass manuell befüllt werden soll, soll auch ein Knopf sein, der die Metainformation des Bildes holt und dann in das Feld tt_alternativeText für jede Sprache schreibt.
2. Zusätzlich soll wenn ein Bild eingefügt wird, automatisch der Alt-Text aus den Metadaten in das tt_alternativeText geschrieben werden.
Problem
Kann ich durch Klick auf den FS_Button in der Sprache Deutsch automatisch den Wert, der hier gesetzt wird auch für alle anderen Sprachen übernehmen?
Momentan kann ich über das Skript für jede Sprache die Eingabekomponente herausholen, das Speichern funktioniert aber leider weder für die Komponente, wo ich mich gerade befinde, noch für alle anderen Sprachen.
Der einzige Lösungsansatz zu 2., der mir einfällt wäre, einen ValueService über eine on_event-Regel einzubinden, nur leider weiß ich nicht so recht, wie ich hier an das aktuelle Element komme.
FS_Button:
<FS_BUTTON
name="tt_alt_text_metadata_teaser"
alwaysEnabled="yes"
noBreak="yes"
onClick="script:getalttextfrommetadata"
style="button"
useLanguages="no">
<LANGINFOS>
<LANGINFO lang="*" label="Get Alt-Text from Metainformation"/>
<LANGINFO lang="DE" label="Alt-Text aus Metadaten"/>
</LANGINFOS>
<PARAMS>
<PARAM name="altText">#field.tt_alternativeText</PARAM>
<PARAM name="media">#field.tt_video</PARAM>
</PARAMS>
</FS_BUTTON>
Hier ein Auszug aus dem Skript:
languages = element.getProject().getLanguages();
formData = element.getFormData();
for(lang : languages){
if(lang.getAbbreviation().equals("DE")){
altTextDE = formData.get(lang, altText.getName());
}else if(lang.getAbbreviation().equals("EN")){
altTextEN = formData.get(lang, altText.getName());
}else if(lang.getAbbreviation().equals("FR")){
altTextFR = formData.get(lang, altText.getName());
}else if(lang.getAbbreviation().equals("ES")){
altTextES = formData.get(lang, altText.getName());
}else if(lang.getAbbreviation().equals("PT")){
altTextPT = formData.get(lang, altText.getName());
}
}
//Alt-Text aus den Metadaten des Bildes
altOfMedia = media.media.getMetaFormData().get(masterLanguage, "meta_pictureAlternativeText").get();
//Speichern des Wertes, leider wird aber nichts in das Feld gespeichert
altTextDE.set(altOfMedia.toString());
altTextEN.set(altOfMedia.toString());
altTextFR.set(altOfMedia.toString());
altTextES.set(altOfMedia.toString());
altTextPT.set(altOfMedia.toString());
element.setFormData(formData);
element.save();
//Alternative, die nur für das akuelle Feld funktioniert (mit Übergabewert des FS_Buttons)
altText.set(altOfMedia.toString());
Hallo,
ich habe mal versucht dein Problem nachzuvollziehen. Prinzipiell funktioniert es bei mir, allerdings sind mir ein paar Dinge aufgefallen:
1. Du übergibst #field.tt_video. Müsste es nicht #field.tt_picture sein?
2. Wie lockst du das Element?
3. Nach dem Speichern ist ggf. ein Refresh des Formulars mittels F5 nötig.
4. Ich musste eine Zeile etwas verändern, damit das Skript bei mir durchläuft:
altOfMedia = media.get().media.getMetaFormData().get(masterLanguage, "
meta_pictureAlternativeText
").get();
Vielleicht hilft dir das ja schon etwas weiter.
Viele Grüße
Tim
Hallo Tim,
1. ich habe zwei Buttons abhängig vom Teaser-Typen wird der Video-Button für Video-Teaser eingeblendet und der Picture-Button für Standard-Teaser. Also gibt es für den Video-Button #field.tt_video und #field.tt_picture.
2. Das Element wird direkt gelockt. Der Use-Case sieht so aus: ich habe eine Teaser-Datenquelle, möchte nun den Teaser ändern, dazu muss ich den Bearbeitungsmodus aktivieren und mein Element ist gelockt.
3. Das mit dem Refresh hat geklappt und der Text steht nun in allen Sprachen, unschön ist nur, dass er nicht sofort dasteht, dies könnte den Redakteur irritieren und als Bug wieder zurückkommen.
4. Da habe ich wohl etwas unterschlagen, weiter oben im Code habe ich media = media.get(); stehen.
Dein Tipp war aber auf jedenfall schonmal hilfreich. Jetzt frage ich mich, ob ich von meinem context (der ein BaseContext ist) irgendwie auf die Entität zugreifen kann und somit die Entität refreshen kann.
entity = context.getSelectedRow();
entity.refresh();
hat leider nicht funktioniert, da .getSelectedRow() nicht auf context bekannt ist. Gibt es hier vielleicht noch einen anderen Weg?
Viele Grüße,
Patricia
Hallo Tim,
gibt es eine Möglichkeit über die Parameter des FS_Buttons auch auf die Formularfelder des nicht aktuell angewählten Sprachtabs zu zugreifen? Dann wäre der Umweg über das FormData nicht nötig und es gäbe nicht das refresh Problem.
Alternativ: Gibt es eine Möglichkeit die aktuelle Formularansicht im Skript des FS-Buttons zu erneuern, ohne das der Nutzer F5 drückt? Ansonsten laufen wir immer Gefahr in ein Lost Update zu laufen, wenn der Nutzer die nicht aktualisierte Ansicht speichert.
Danke und viele Grüße
Johannes
Hallo,
@Patricia: Folgendes Posting könnte dir weiterhelfen:
https://community.e-spirit.com/message/9227#9366
An das im Posting verwendete Content2-Objekt solltest du über element.getParent() kommen, da element ein Dataset Objekt sein sollte.
Die Entity wird im Posting zwar nicht verwendet, aber an diese kommst du ganz einfach über element.getEntity().
@Johannes: Meines Wissens nach ist es nicht möglich dem FS_BUTTON Daten eines anderen Sprachkanals mitzugeben. Des Weiteren kenne ich auch keine Möglichkeit den Refresh über API-Methoden auszuführen (wie auch im oberen Posting beschrieben).
Viele Grüße
Tim
Hallo Patricia,
benötigst Du noch weitere Hilfe oder haben Dir die Antworten von Tim bereits geholfen?
In diesem Fall wäre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere
Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lösung
gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.
Viele Grüße
Rene