Freitag, 9. November 2007 Druck-Ansicht
System-Meldungen, Warnhinweise, kleine “Ausfüllhilfen etc. - Die meisten dieser Mini-Texte werden nicht direkt von xt:Commerce verwaltet, sondern liegen als ein Satz statischer Dateien in den jeweils gültigen “lang”-Ordnern.
Und das ist auch ganz gut so: Denn ein eigenes Eingabefeld im Admin-Bereich für jeden noch so kleinen Satz-Fetzen (”Bitte überprüfen Sie …”, “Weiter”, “Zurück”, “Warenkorb”) wäre wirklich übertrieben.
Bloß wenn mal mehrere der vorgegebenen Texte, Begrüßungen etc. zu ändern sind, einige Änderungen dabei eventuell noch vorläufigen Charakter haben, teilweise auch noch von anderer Stelle übersetzt werden müssen - wird’s organisatorisch etwas kompliziert. Nicht jeder Mitarbeiter, der Shop-Inhalte pflegt, hat auch einen FTP-Zugang … Nicht jeder Mitarbeiter mit FTP-Zugang hat Schreibrechte im System-Ordner …
Und letztlich möchte man manchmal ja auch etwas mehr als nur Buchstaben schreiben. Beispielsweise ein kleines Bild oder einen Screenshot in einen Hilfe-Text einbauen. Spätestens da stoßen die normalen Sprach-Dateien an ihre Grenzen.
Ein HTML-Editor ist drin, es gibt eine Bildverwaltung mit Upload-Möglichkeit, man hat eine Seiten-Vorschau … Also alles, was für die Bearbeitung zusätzlicher “Extras” oder Info-Boxen praktisch wäre. Warum den xt:Commerce ContentManager nicht auch für “Shop-Hinweise” benutzen?
Beispiel: Angenommen, Sie betreiben Ihren Shop nur für gewerbliche Kunden und möchten entsprechende Info-Hinweise “faxen Sie uns Ihren Gewerbeschein …” anzeigen. Derlei Texte auf eine allgemeine “So bestellen Sie bei uns”-Seite zu setzen, wäre doch recht weit weg von dem Formular, das der Neukunde eigentlich ausfüllen möchte …
Alles gar nicht so schwierig: Der ContentManager speichert Daten in der Datenbank, ein Template gibt Daten aus - Man braucht jetzt nur noch eine Funktion, die die ContentManager-Daten nicht nur auf den “Content-” oder “Info” Seiten anzeigt, sondern dort, wo man Sie sehen möchte.
1. Template bearbeiten
Fangen wir zunächst mit dem Template an. Für unser Beispiel “Info-Text bei Neu-Anmeldung” greifen wir uns die Template-Datei “modules/create_account.html” und schreiben ein Smarty-Tag an die Stelle, wo die Info erscheinen soll.
Ein Tag, das es zwar noch nicht “gibt” - aber das macht nichts, wir denken uns eins aus. Oder besser gleich zwei - Denn unser Beispiel-Hinweis soll aus einer Überschrift und näherem Info-Text bestehen.
Also schreiben an die gewünschte Stelle zum Beispiel so etwas …
{if $MY_ACCOUNT_INFO_HEADING}<h4>{$MY_ACCOUNT_INFO_HEADING}</h4>{/if}
{if $MY_ACCOUNT_INFO_TEXT}<div class="InfoText">{$MY_ACCOUNT_INFO_TEXT}</div>{/if}
Das “if”, damit im Template keine “verwaisten” HTML-Tags ausgegeben werden können, solange kein entsprechender Inhalt angelegt ist oder gefunden wird.
2. Daten eingeben - ContentManager
Inhalte brauchen wir natürlich auch noch. Aber Anstatt wie gewohnt die Sprach-Dateien zu durchwühlen, loggen wir uns in den Admin-Bereich des Shops ein - und legen eine normale ContentSeite an.
Und … um später “unsere System-Meldungen” besser von “echten” Seiten unterscheiden zu können, geben wir dabei eine hohe ID im Feld “Sprachgruppe” ein, unsere “Seite” wird dadurch in der Liste quasi ganz nach hinten geschoben …

Screenshot: Ich habe Tausender-Bereiche festgelegt -
Also alles, was eine ID ab 2.000 hat, ist bei mir eine “System-Meldung”.
Die “erste Überschrift” (Titel) wird vom System normalerweise als Name des Menüpunktes benutzt. Einen Menüpunkt soll unser Hinweis-Text aber nicht erzeugen, hier also einen Namen eintragen, der dem bereits vorgesehenen Smarty-Tag zugeordnet werden kann.
Ich schlage folgendes Muster vor: Die für $MEIN_IRGENDWAS_HEADING bzw. $MEIN_IRGENDWAS_TEXT hinterlegte Seite wird im Contentmanager “MEIN_IRGENDWAS” genannt.

Die “Zweite Überschrift” ist dann die, die auch in unserer Beispiel-Box als Headline {$MY_ACCOUNT_INFO_HEADING} erscheinen soll. Im Textfeld kann man sich schließlich wie gewünscht “austoben” …

… Texte, Romane oder Zungenbrecher schreiben, Bildchen hochladen - abspeichern … und?
Nichts. Natürlich wird jetzt immer noch kein neuer Hinweistext vorm Anmeldeformular gezeigt.
Die Funktion dazu fehlt ja noch, aber immerhin haben wir schon mal Inhalt. Und nach diesem Muster können auch weitere Zusatz-Infos vorbereitet werden.
3. Zusatz-Funktionen im Template - Wohin?
In xt:Commerce-Templates kann PHP-Code benutzt werden, und es ist auch kein Problem, zusätzliche Smarty-Tags erst im Template selbst zu etablieren. Und genau das haben wir vor.
Möglichkeiten gibt es viele - Entweder man verwaltet die neuen Funktionen gleich in eigenen Dateien, die im z.B. im “inc”-Ordner des Templates abgelegt werden und bindet die in der “boxes.php” via require oder include ein - Wenn’s nur ein paar Kleinigkeiten sind, ist es jedoch meistens einfacher, alles direkt in der boxe.php zu schreiben.
Jedenfalls ist die “boxes.php” gewissermaßen Herz und Hirn eines Templates und so ziemlich das erste, was auf einer Shop-Seite “passiert”. Somit also ein geeigneter Ort, neue Smarty-Tags zu definieren, denn diese sind dann auch in (so ziemlich) allen .html-Dateien eines Templates benutzbar.
4. Smarty-Tags im Template definieren
Je nachdem, welche Datei man zum Einbau seiner Zusatzfunktionen benutzt, kann’s ein bisschen unterschiedlich aussehen.
In der “boxes.php” können Smarty-Zuweisungen einfach reingeschrieben werden, solange diese nicht innerhalb von Funktionen stattfinden …
$smarty->assign('MY_ACCOUNT_INFO_TEXT', 'Das klappt');
// .. unser Smarty-Tag wird gefüllt
function myAccountInfoTextFalsch(){
$smarty->assign('MY_ACCOUNT_INFO_TEXT', 'klappt nicht');
}
function myAccountInfoTextFalsch();
// Hier bleibt's leer ...
function myAccountInfoTextRichtig(){
global $smarty;
$smarty->assign('MY_ACCOUNT_INFO_TEXT', 'Das klappt');
}
function myAccountInfoTextRichtig();
// ... hier ist alles in Ordnung.
… sonst passiert entweder nichts - oder es gibt Fehlermeldung. Wichtig ist, dass das globale $smarty-Objekt mit Inhalten gefüllt wird …
5. Erste Lösung …
Wenn man also so weit sicher ist, dass die selbstdefinierten Smartys wirklich “funktionieren”, kann man sich um die neuen Texte aus dem ContentManager kümmern.
Eine Funktion dazu ist schnell geschrieben. Der erste Versuch erwies sich allerdings als etwas unpraktisch:
function getContentManagerText($ContentGroup=false,$Which='Text'){
$Which = strtolower($Which);
if($ContentGroup) {
$ContentManagerQuery = xtDBquery(
"SELECT content_text, content_heading
FROM ".TABLE_CONTENT_MANAGER."
WHERE content_group='".$ContentGroup."'
AND languages_id='".(int) $_SESSION['languages_id']."' ");
$ContentManagerQuery = xtc_db_fetch_array($ContentManagerQuery,true);
if($Which=='text')
return $ContentManagerQuery['content_text'];
if($Which=='heading')
return $ContentManagerQuery['content_heading'];
} else {
return false;
}
}
… So hat man zwar schon den Vorteil, die Zusatz-Meldungen “im CMS” verwalten zu können - Aber die Smarty-Zuweisungen sind “Handarbeit” - Aber abgesehen davon, dass man auf die Weise schon wieder andauernd “Dateien anfassen” muss …
$smarty->assign('MY_ACCOUNT_INFO_TEXT',getContentManagerText('2000','Text'));
$smarty->assign('MY_ACCOUNT_INFO_HEADING',getContentManagerText('2000','Heading'));
$smarty->assign('MY_LOGIN_ERROR_TEXT',getContentManagerText('2010','Text'));
$smarty->assign('MY_LOGIN_ERROR_HEADING',getContentManagerText('2010','Heading'));
$smarty->assign('MY_DINGS_TEXT',getContentManagerText('2020','Text'));
$smarty->assign('MY_DINGS_HEADING',getContentManagerText('2020','Heading'));
[...und so weiter ...]
… kann man sich nur allzu leicht beim Namen oder in der ID der “ContentGroup” vertun - und für jedes neue Smarty-Tag braucht man wieder einen “Aufruf” in der “boxes.php”, sowie eine passend benannte Seite im ContentManager …
Das Ganze geht auch ein bisschen einfacher …
Die zweite Variante macht deutlich mehr Spaß - Denn sie funktioniert automatisch und braucht in der “boxes.php” lediglich gestartet zu werden:
function AutoContentToSmarty($ContentGroupFrom=2000){
$ContentManagerQuery = xtDBquery(
"SELECT content_title, content_text, content_heading
FROM ".TABLE_CONTENT_MANAGER."
WHERE content_group >='".$ContentGroupFrom."'
AND content_title LIKE ('MY_%')
AND languages_id='".(int) $_SESSION['languages_id']."' ");
while ($ContentManagerData = xtc_db_fetch_array($ContentManagerQuery, true)) {
global $smarty;
$smarty->assign($ContentManagerData['content_title'].'_HEADING',$ContentManagerData['content_heading']);
$smarty->assign($ContentManagerData['content_title'].'_TEXT',$ContentManagerData['content_text']);
}
}
// Funktion starten ...
AutoContentToSmarty();
… und danach werden alle im ContentManager abgelegte Inhalte, die unseren “Bestimmungen entsprechen” automatisch in die beiden passenden Smarty-Tags umgewandelt, die dann auch direkt im Shop-Template eingesetzt werden können.
Wenn man in seinem Shop also “ein paar mehr” zusätzliche Info-Texte benötigt, einfach als Content-Seite (z.B.) “MY_EXTRA_INFO” anlegen und abspeichern.
Damit werden ein Smarty-Tag {$MY_EXTRA_INFO_HEADING} und ein Smarty-Tag {$MY_EXTRA_INFO_TEXT} gleich mit erzeugt (z.B. für Überschrift und Fließtext) …
Die Funktion wandelt nur Content-Seiten, die bestimmte Bedingungen erfüllen.
In meinem Beispiel: “Sprachgruppen”-ID mindestens 2.000, Seitentitel muss mit “MY_” anfangen. Solche
Benennungs-Regeln sind natürlich Geschmacksache - Ich find’s jedoch immer praktisch, auf den ersten Blick unterscheiden zu können, was “von mir” und was “vom System” stammt …
Die neuen, eigenen Texte können bei Bedarf “ausgeblendet” werden. Dazu reicht es, einfach den Titel im ContentManager ändern, zum Beispiel in “xMY_IRGENDWAS”.
Sollten ein paar Texte, Meldungen, Hinweise vorübergehend nicht benötigt werden, muss man die Seiten also nicht gleich löschen - und braucht auch nichts im Template zu ändern.
Die oben gezeigte Funktion im Template einbauen (beispielsweise in die “boxes.php” reinkopieren) und dort starten.
Das hier beschriebene Code-Beispiel ist für xt:Commerce 3.04 SP2.1 gedacht und auch nur mit diesem System getestet.
Bitte beachten Sie auch unbedingt die allgemeinen Hinweise zur Verwendung hier veröffentlichter Code-Beispiele - und probieren Sie solche Dinge bitte immer zuerst mit einem Test-System aus!
Bookmarks, Feed und Links
Wenn Ihnen dieser Beitrag geholfen hat ...
Beiträge zu ähnlichen Themen:
3 Antworten zu xt:Commerce - Tricks und Ideen für den ContentManager
Kommentar schreiben