Textbausteine (übersetzbar) in Plugin-Controller - Wie?

Hallo, ich muss in einem Controller eine Fehlerprüfung machen und ggf. mögliche Fehlermeldungen zurückgeben.

Ich habe es so versucht: 

$errorMessage = $this->container->get('snippets')
    ->getNamespace('frontend/myform/error_messages')
    ->get("fehlermeldung", "Das ist der Fehlertext");

hatte gedacht, so wird die Default-Meldung dann automatisch weggeschrieben als Textbaustein… war nicht so.

Dann habe ich meinen Textbaustein als solches angelegt und den obigen Code ohne Default verwendet. Dann zieht er aber nicht den Text aus dem Textbaustein.

 

wie kann ich das denn korrekt machen? Ich brauche auch Übersetzungen die vom Controller korrekt gezogen werden müssen.

Hallo Flo,

wurde das Snippet denn korrekt in der Datenbank angelegt?

Viele Grüße aus Schöppingen

 Michael Telgmann

Hallo [@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann „Michael Telgmann“)‍

nein, ich habe nichts in der DB angelegt, da ich davon ausging, dass dieser Code automatisch einen Textbaustein generiert, wenn er nicht da ist.

Danach habe ich ihn regulär in der Textbausteinverwaltung im Backend angelegt, aber dieser wird dann nicht benutzt…

genau das würde ich mal in der Datenbank überprüfen. Also einfach mal in „s_core_snippets“ schauen, ob das Snippet existiert

natürlich existiert es, wenn ich es in der Textbausteinverwaltung anlege. Genau wie jeder andere Textbaustein auch. Warum sollte er nicht existieren?

ist mein Code denn überhaupt korrekt? Benutze ich so die Snippets im Controller? Ich weiß nämlich auch nicht, wie da die Übersetzung reinkommt… regelt der das intern irgendwie oder muss ich da was mitgeben?

Der Code ist korrekt. Der zweite Parameter dient eben als default Fallback, wenn das Snippet nicht gefunden werden kann. Da du die Übersetzung im Backend Modul angelegt hast, musst du dort natürlich auch die entsprechenden Übersetzungen anlegen. 
Vermutlich hast du jetzt ein Snippet mit einem leeren String angelegt, d.h. er findet das Snippet, daher greift dein default nicht, aber das Snippet enthält nur einen leeren String, weshalb du nichts siehst. 

ich habe es Deutsch und Englisch angelegt, und für beide wird nur ein Leerstring ausgegeben (ohne Default). Mit Default wird der Default ausgegeben.

verwende ich den Textbaustein im Template mit {s namespace="…" name="…"}{/s} dann funktioniert es.

weiß noch jemand Rat?

Zeig mal einen Screenshot von der Textbaustein-App aus dem Backend wo man deinen Textbaustein, Namespace und Text sehen kann.

VG

@simkli‍

hier ein Screenshot:

verwenden wollte ich es wie gesagt so:

$errorMessage = $this->container->get('snippets')
    ->getNamespace('frontend/warranty_registration/error_messages')
    ->get("EmptyDate");

aber das liefert wie gesagt einen leeren Text… nur wenn ich dort einen Default mit übergebe, bekomme ich einen Text. Aber halt nicht den Textbaustein sondern den Defaulttext…

  • In welcher Art von Controller rufst du diese Funktion auf? (Frontend/Backend/Widgets/Api)

  • Wo rufst du diese Funktion auf? (innerhalb einer Action, PreDispatch, PostDispatch, anderes z.B. Konstruktor)

VG

Ich benutze das in einer Action, die Ziel eines Form-Submits ist, also Frontend.

Ausgangs-Seite ist die eigene index.tpl des Plugins.

Bei einem Fehler erfolgt ein forward zurück auf die index.tpl, welcher die Fehlermeldungen durchreicht.

Bei einem Fehler erfolgt ein forward zurück auf die index.tpl, welcher die Fehlermeldungen durchreicht.

Wie soll das funktionieren? Wenn du redirect aufrufst kannst du die Fehlermeldung doch nur via GET/POST-Daten weitergeben.

Zeig mal die Codestelle. Sicher, dass der Text nicht beim Redirect verloren geht?

Setze doch mal einen Breakpoint (oder var_dump($errorMessage);die():wink: genau nach dem Codeschnipsel oben (direkt danach) und prüfe, ob die Variable nicht doch den korrekten Wert hat.

VG

ja, ich bin sicher dass der Text nicht verloren get. Wenn ich beim Snippet einen Default angebe, dann bekomme ich ja den Text.

$this->forward('index', 'warranty-registration', 'frontend', [
    'sTarget' => $request->getParam('sTarget'),
    'form_data' => $formData,
    'error_messages' => $errorMessages
]);

dort übergebe ich den Parameter “error_messages”, welchen ich in der indexAction dann via Request()->getParam() raushole und mit View()->assign ins Template bringe

ich habe jetzt alles nochmal von vorne aufgebaut und es funktioniert jetzt… keine Ahnung warum

Noch ein Nachtrag:

Wenn man die Meldung einfach via GET durchreicht und dann im Template ausgibt, ist das ein XSS-Einfallstor. Die Variable daher umbedingt im Template escapen um Sicherheitslücken vorzubeugen.

Viele Grüße

1 „Gefällt mir“

@simkli‍ hättest du dann eine bessere Idee? Ist das nicht das Vorgehen, welches auch Shopware hier nutzt im Standard? Also so wie ich das gesehen hab…

Hallo,

meistens übergeben wir einen ErrorCode per GET, nicht direkt die Fehlermeldung. Bei dir könnte der Code z.B. „EmptyDate“ sein. Auf der Seite, wo dann hingeleitet werden soll und wo der Fehler angezeigt werden soll, holst du dir dann den Code aus dem Request und gibst den direkt ans Template. Im Template kannst du dann per Smarty zuerst prüfen, ob der Code gesetzt ist und wenn ja, diesen direkt nutzen um mit der Snippet Funktion die Fehlermeldung anzuzeigen. 

Viele Grüße aus Schöppingen

cool Michael Telgmann