Layoutveränderung per userCondition im mm_forum
| Autor | Nachricht |
|---|---|
|
Verfasst am: 24. 09. 2008 [11:43]
|
|
|
SLAng
Moderator
Themenersteller
Dabei seit: 20.10.2004
Beiträge: 2778
|
Hallo zusammen... Ich möchte euch heute ein kleines HowTo präsentieren. Dieses entsteht aus der Frage, wie man das Layout der eigenen Seite Tageszeitabhängig verändern kann. "Dafür gibt es doch die TYPO3-Condition [hour...]" werden jetzt sicher einige sagen, doch es geht noch etwas weiter. Aber ich fange vorne an, denn diese HowTo soll auch diejenigen ansprechen, die vielleicht noch nichts von Conditions gehört haben. Vereinfacht kann man dazu sagen: Eine Condition ist ein besonderer Bereich im TypoScript in dem etwas bereits definiertes, in Bezug auf verschiedene Vorgaben, geändert ausgegeben wird, oder vollkommen neue Funktionen bereitgestellt werden können. Ganz kurz: Eine Bedingung. Welche Conditions es gibt kann man in der offiziellen TypoScript Referenz nachlesen. Deutsch - http://www.typo3.net/tsref/ Englisch (vollständig) - http://typo3.org/documentation/document-library/references/doc_core_tsref/4.1.0/view/ Kommen wir zum Thema Das Referenzprojekt ist http://www.radio-devil.de. Auf dieser Seite sollte eine Layoutveränderung ab einer bestimmten Uhrzeit stattfinden. Genauer gesagt ein Tag- Nachtwechsel. Das Layout sollte sich fast vollständig ändern, was ja über ein paar neu erstellte Grafiken und das einbinden der entsprechenden Stylesheets kein Problem ist. Auch der Wechsel selbst war nicht das Problem. Vorgabe war, das Layout Abends um 20 Uhr zu wechseln und morgens um 7 Uhr abermals. Stellen wir uns also vor man würde volgendermaßen das Haupt-Stylesheet für die Seite einbinden: TYPOSCRIPT page { includeCSS { file1 = fileadmin/index/main.css file1.media = screen } } Dann müsste man also für den Wechsel folgende Condition verwenden: TYPOSCRIPT [hour = >20, <7] page { includeCSS { file1 = fileadmin/index/night/main.css file1.media = screen } } [global] Hier kommt also die Condition (Bedingung) zum Tragen. Übersetzt bedeutet das nichts anderes als TYPOSCRIPT Bedingung gilt, wenn [Stunde = Größer 20 Uhr und kleiner 7 Uhr] Also sehr simpel. Die Condition endet mit [global], oder mit [end]. Regeln sind natürlich auch hier zu beachten. Deshalb ein kleiner Einblick, damit man das Folgende besser verstehen kann:
Und Verknüpfung: [condition1 = foo] && [condition2 = bar] && bedeutet hier UND Oder Verknüpfung: [condition1 = foo] || [condition2 = bar] || bedeuted hier OR Keine Angabe: [condition1 = foo][condition2 = bar] Ist nichts angegeben zwischen zwei Conditions, wird ODER also OR angenommen. Anstatt && und || können seit TYPO3 Version 4 auch AND und OR verwendet werden. So, dazu aber nun genug... Also, der Tag- Nachtwechsel ist eingebaut und funktioniert mit der oben gezeigten Condition problemlos. Nun soll aber ein Feature hinzukommen. Der registrierte und eingeloggte Benutzer soll selbst entscheiden welches Layout gezeigt werden soll. Dieses muss auch nach dem Abmelden und wieder einloggen noch Gültigkeit haben. Folgende Auswahl soll enthalten sein:
Um das zu realisieren, bietet sich das mm_forum und die enthaltene Funktion das Benutzerprofil zu erweitern, sehr an. Im Backendmodul des mm_forum wählt man dazu aus dem Dropdownmenü den Menüpunkt "Benutzerprofil erweitern" aus. In das Feld für den Titel des neuen Feldes trägt man den Namen des neuen Feldes ein und setzt die Häkchen bei "aktiv" und "öffentlich", so das im Frontend das neue Feld auch angezeigt wird. Da nun automatisch im Frontend ein einfaches input-Feld entsteht muss das gerade erstellte Feld im Erweiterten Modus bearbeitet und erweitert werden. Dazu klickt man einfach auf das kleine Symbol hinter dem Feld im mm_forum Backendmodul. So gelangt man in den erweiterten Modus. Vorgabe ist nun also drei verschiedene Auswahlmöglichkeiten zu schaffen. Hier bietet sich ein select-Feld an. Die Konfiguration des Feldes könnte also zum Beispiel so aussehen: TYPOSCRIPT label = TEXT label { value = Layoutwahl: } input = CASE input { stdWrap.wrap = <select name="###USERFIELD_NAME###">|</select> default = TEXT default.value ( <option value="1">Standard</option> <option value="2">Immer Tag</option> <option value="3">Immer Nacht</option> ) 1 = TEXT 1.value ( <option selected="selected" value="1">Standard</option> <option value="2">Immer Tag</option> <option value="3">Immer Nacht</option> ) 2 = TEXT 2.value ( <option value="1">Standard</option> <option selected="selected" value="2">Immer Tag</option> <option value="3">Immer Nacht</option> ) 3 = TEXT 3.value ( <option value="1">Standard</option> <option value="2">Immer Tag</option> <option value="3" selected="selected">Immer Nacht</option> ) key.field = fieldvalue } output = TEXT output { value ( <select name="###USERFIELD_NAME###"> <option value="1">Standard</option> <option value="2">Immer Tag</option> <option value="3">Immer Nacht</option> </select> ) } Wir haben hier also drei Bereiche. Das Label ist die Ausgabe der Feldbeschreibung und dann folgt der Input-Bereich und der Bereich Output. Eine Erklärung welche Marker verwendet werden können, findet sich direkt unter dem Textfeld im mm_forum Backendmodul. Ebenso gibt es eine kurze Beschreibung und ein weiteres Codebeispiel im mm_forum Manual. Diese kleine Select-Beipsiel kann natürlich zur Frontendausgabe noch erweitert werden, wie man möchte. Eine mögliche Ausgabe wäre etwa so: ![]() Die Auswahlmöglichkeit ist also vorhanden und die Wahl ist nach dem Klick auf "speichern" auch im Profil des Benutzers verankert. Das neue Benutzerfeld ist nun in der Datenbank in der Tabelle tx_mmforum_userfields enthalten und die Auswahl selbst wandert in die Tabelle tx_mmforum_userfields_contents in die Spalte field_value und wird dort dem entsprechenden Benutzer (Spalte user_id) zugewiesen. Nun fehlt noch die Bedingung um dem Benutzer das Gewählte auch ausgeben zu können. Dazu ist es nötig eine eigene Condtion zu erstellen. Eine user_funktion also. Diese ist im System nicht enthalten und muss daher erst selbst aufgebaut werden. Dieser Aufbau findet in der Datei localconf.php statt, die ihr im Verzeichnis typo3/typo3conf/ findet. Ganz ans Ende der Datei schreibt ihr folgende Funktion: PHP function user_emptyHeadline($design) {
$userId = $GLOBALS['TSFE']->fe_user->user['uid'];
# check if a user is logged in
if ($userId > 0) {
// check if something is set, field_id = 8 is the designset
$where = 'deleted=0 AND user_id = '.$userId.' AND field_id = 8';
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('field_value', 'tx_mmforum_userfields_contents', $where);
$row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
// comare design from TS to the userfield
if (isset($row['field_value']) && $row['field_value']==$design) {
return true;
}
}
return false;
}Und damit ist die Designwahl nun mit einer Funktion belegt. Dazu kommen dann folgende mögliche Conditions zur Anwendung: [userFunc = user_emptyHeadline(1)] [userFunc = user_emptyHeadline(2)] [userFunc = user_emptyHeadline(3)] Nun kann im TypoScript-template die Bedingung gesetzt werden: Also Standardwechsel für uneingeloggte Besucher der Seite: TYPOSCRIPT [hour = >20, <7] page { includeCSS { file1 = fileadmin/index/night/main.css file1.media = screen } } [global] Standardwechsel für eingeloggte Besucher der Seite: TYPOSCRIPT [userFunc = user_emptyHeadline(1)] && [hour = >20, <7] page { includeCSS { file1 = fileadmin/index/night/main.css file1.media = screen } } [global] Nur Tages-Layout: TYPOSCRIPT [userFunc = user_emptyHeadline(2)] page { includeCSS { file1 = fileadmin/index/main.css file1.media = screen } } [global] Nur Nacht - Layout TYPOSCRIPT [userFunc = user_emptyHeadline(3)] page { includeCSS { file1 = fileadmin/index/night/main.css file1.media = screen } } [global] Ebenso können auch weitere Conditions verknüpft werden. Geholfen hat Georg Ringer (just2b). Danke dazu noch einmal. Sofern wir sie beantworten können, beantworten wir Fragen in diesem Thema gerne. Nichts wissen ist schlecht, nichts wissen wollen ist eine Katastrophe!
|
|
Verfasst am: 24. 09. 2008 [20:25]
|
|
|
SLAng
Moderator
Themenersteller
Dabei seit: 20.10.2004
Beiträge: 2778
|
Einen kleinen Nachtrag gibt es... leider funktioniert die Condition [hour = >20, <7] nicht. Ist mir auch schleierhaft warum nicht. Stattdessen muss also die Condition [hour = 20,21,22,23,0,1,2,3,4,5,6] herhalten. Nichts wissen ist schlecht, nichts wissen wollen ist eine Katastrophe!
|
|
Verfasst am: 07. 06. 2011 [11:56]
|
|
|
Testpagetester
Dabei seit: 12.05.2011
Beiträge: 60
|
SLAng schrieb: Einen kleinen Nachtrag gibt es... leider funktioniert die Condition [hour = >20, <7] nicht. Ist mir auch schleierhaft warum nicht. Stattdessen muss also die Condition [hour = 20,21,22,23,0,1,2,3,4,5,6] herhalten. danke für den hinweis |




