Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Möglichkeit um eigene Tags im E-Mail Template zu nutzen #1762

Open
datengraben opened this issue Feb 7, 2025 · 0 comments
Open

Möglichkeit um eigene Tags im E-Mail Template zu nutzen #1762

datengraben opened this issue Feb 7, 2025 · 0 comments
Labels
enhancement New feature or request

Comments

@datengraben
Copy link
Contributor

datengraben commented Feb 7, 2025

tldr;

Meine Frage: Gibt es einen Weg um eigene Tags im E-Mail Template zu nutzen?

Falls nein, wäre mein Vorschlag das als Verbesserung in das Plugin einzubauen.

Situation

Für meinen Anwendungsfall wollte ich basierend auf Wettervorhersagen für den nächsten Tag Warnungen vor Glätte, Schnee oder Hitze in der Buchungserinnerung anzeigen. Also sowas wie, "Achtung vor glatter Fahrbahn" wenn die Temperatur unter 0 Grad fällt.

Problem

Ich habe keinen für mich passenden Weg über die vorhandene Mittel von CommonsBooking gefunden. Es gibt einen Filter für den Nachrichten-Teil der Mail (commonsbooking_mail_body) aber dort kann ich auf der Datenstruktur nur mit replace/append arbeiten. Weiterhin gibt es einen template-Tag Filter, diese funktioniert aber glaube ich auch nicht mit einem Tag, welcher nicht als key im objects array ist.

Lösung

Vorerst habe ich einen eigenen Filter commonsbooking_mail_objects, welcher den objects-Parameter der prepareMail/TemplateParser Aufruf erweitern kann. So kann ich dem objects-Array weitere Objekte mitgeben, welche dann im Template aufgelöst werden. Also Beispielsweise {hints:weather}. Da der Filter das objects-Array als Parameter erhält, kann er für Berechnungn z.B. auf das Booking oder Location Objekt zugreifen.

Diskussion

Mich würde interessieren ob es noch andere Möglichkeiten gibt die mir entgangen sind?

Ob es noch alternative Wege zum Einbau von benutzerdefinierten Tempalte-Tags gibt, welche ich übersehen habe. Das Anlegen eines Filters im Bereich des objects-Arrays fand ich passend.

Unabhängig von den genannten Fragen:

  • Refactoring: Aktuell können wir versch. Custom-Post-Type Objekte (z.B. Booking-Objekt), WP_User oder WP_Post abfragen. Im Code werden diese Objekte (und deren Instanziierung) teilweise missbraucht um so Daten in die E-Mail-Templates zu bekommen. Das finde ich unsauber und es könnte ein Refactoring vertragen. Sonst werden weiterhin inkonsitent verwendete Objekte instanziert und es verfestigen sich Code-Strukturen, welche die Lesbarkeit und Wartbarkeit beeinträchtigen. Hierzu vielleicht ein eigenes Issue?

  • Bei der Verallgemeinerung des Anwednungsfalls, also hin zu einer Schnittstelle zur Bereitstellung von Template-Tags, sind der Kreativität ja keine Grenzen gesetzt. So könnte das Plugin für simple Contributions geöffnet werden, welche im besten Fall als einzelne Abhängigkeiten nur den Filter hätten. Diese Contributions könnten dann entweder als Teil des Cores veröffentlicht werden oder aber über eigene Plugins.

Anpassung im Message Typ

Folgende Anpassung ist im Message-Typ vorzunehmen, um den Mail-Objects-Filter nutzen zu können. Das beipsiel im phpdoc String nutzt den hack über das WP_User Objekt, um Daten im Template zu erhalten.

                $action  = $this->getAction();
                $message = $this;
                /**
                 * Default objects for messages, sent out by CommonsBooking Plugin.
                 *
                 * For which object types you can inject into the array, {@see CB::get()}
                 *
                 * Example:
                 *
                 * $object = new \WP_User((object)array( "ID" => -1));
                 * $object->myvalue1 = 'Hello';
                 * $object->myvalue2 = 'World';
                 * $objects[] = [
                 *   'mytag' => $object
                 * ];
                 *
                 * Then you can reference the tag in the email template like this: {mytag:myvalue1} {mytag:myvalue2}
                 *
                 * @param array $objects assoc array of $tag => $object, where you can reference in the template via {$tag:$object_member}
                 * @param string $action the action of the message to filter the objects
                 * @param Message $message the full context
                 *
                 *@since 2.10.3
                 *
                 */
                $objects       = apply_filters( 'commonsbooking_mail_objects', $objects, $action, $message );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
Development

No branches or pull requests

1 participant