Achter Schritt - Die Ausgabe in der Seite
Wie werden die Daten jetzt eigentlich in der Seite ausgegeben? Verwaltung ist schön, aber eigentlich sollen die Daten ja in der Seite ausgegeben werden. Es gibt dazu mehrere Möglichkeiten:
Das FAQ Modul muss ein Parser-Tag anbieten, um Fragen und Antworten auszugeben. Im Tag müssen zusätzlich das Ausgabetemplate und ggf. weitere Optionen angegeben werden können.
Das Parser-Tag sieht also wie folgt aus:
Das FAQ Modul bietet den Parser-Tag wie folgt an:
View
Für jede Action bietet das RedSpark Framework einen View. Im Verzeichnis "Views" unterhalb des Modulverzeichnis kann für jede Action eine <action>View.tpl Datei abgelegt werden in welcher die über die Actionklasse per "Assign" zugewiesenen Daten in SMARTY ausgewertet werden können.Inline Action
Für die Ausgabe einer Action außerhalb des Contentbereiches im Layout (z.B. Menu, Brotkrumenspur, Anzahl angemeldete Nutzer, etc.) hält RedSpark das Prinzip der Inline Actions bereit. Pro Template können in der Designkonfiguration beliebig viele Inline Actions angegeben werden. Das System ersetzt die entsprechenden Schlüsselwörter bei Erzeugung des Views durch die Ausgaben der Inline Actions.Parser Tag
Das RedSpark System bietet einen eigenen Parser, welcher es ermöglicht, über eine spezielle Syntax Methoden unter Angabe beliebig vieler Parameter aufzurufen. Jedes Modul kann beliebig viele Parser-Tags im System registrieren.Das FAQ Modul muss ein Parser-Tag anbieten, um Fragen und Antworten auszugeben. Im Tag müssen zusätzlich das Ausgabetemplate und ggf. weitere Optionen angegeben werden können.
Das Parser-Tag sieht also wie folgt aus:
^[^(FAQ|<Gruppe>^
Das FAQ Modul bietet den Parser-Tag wie folgt an:
modules/faq/controllers/FaqController.php
<?php
...
/**
* Liefert die Platzhalterdaten für die Parsertabelle die später in den Webseiten
* gegen das gerenderte Modul ausgetauscht werden.
* Überschriebene Methode aus der Elternklasse core/modules/abstractModule.class.php .
*
* @name getParserTags
* @return array Parser-Tags für das Modul (die Indizes entsprechen den Feldern der DB-Tabelle)
* @version 1.0 2008/06/16
*/
public function getParserTags()
{ // Core
$return_value = array
(
array(
"tag" => 'FAQ',
"method" => 'getFaqParserOutput',
"name" => 'FAQ',
"comment" => '<group>|<theme>',
),
);
return $return_value;
}
...
/**
* getFaqParserOutput -> used by parser Tag FAQ
*/
public static function getFaqParserOutput($groups='', $theme='default') {
/* Datebankabfrage und Auswertung */
/* Render with snippet */
if ($theme =='') $theme = 'default';
return RedsparkCore_View::getInstance()->fillSnippet('faq',$theme,Array());
}
...
?>
templates/meintemplate/modules/faq/default.tpl
{* ----------------------------------------------- *}
{* default.tmpl.php *}
{* *}
{* DEFAULT Template für das FAQ Modul. *}
{* Besteht aus drei Zuständen *}
{* - zugeklappt und noch nie aufgeklappt gewesen *}
{* - aufgeklappt *}
{* - zugeklappt und schon einmal aufgeklappt *}
{* gewesen (Frage wird dann anders dargestellt) *}
{* ----------------------------------------------- *}
{* ----------------------------------------------------------- *}
{* Iteration über die FAQ Gruppen *}
{* ----------------------------------------------------------- *}
<div class="faq_dhtml">
{* {assign var="counter" value=1} *}
{foreach from=$groupData item="gruppe" key="gruppenName"}
{if $gruppe|@count>0}
<div class="faq_group">
<h2>{$gruppenName}</h2>
{foreach from=$gruppe item="faq_element" name="fe_item"}
{random in=1 out=100000 assign="id"}
<div class="question" id="faq_question_{$id}">
<h3 id="faq_question_{$id}_headline">{$faq_element.frage}</h3>
<a id="faq_link_{$id}" class="faq_question_showlink marked" href="javascript:void(0);" ><span>Antwort</span></a>
<div class="clear"></div>
<div id="faq_question_{$id}_answer" class="answer" style="display:none;">
<span>{$faq_element.antwort}</span>
</div>
</div>
<script type="text/javascript">
Event.observe("faq_link_{$id}", "click", function (e) {literal}{{/literal}
var link = $("faq_link_{$id}"); //e.findElement('a');
link.toggleClassName('read');
Element.toggleContent(link,{literal}{src: '<span>Antwort</span>', dst: '<span>Schliessen</span>'}{/literal});
$('faq_question_{$id}_answer').toggle();
$('faq_question_{$id}_headline').addClassName('faq_headline_read');
$('faq_question_{$id}_answer').addClassName('faq_answer_read');
{literal}});{/literal}
</script>
{*
<!-- geschlossenes div ohne zusatzinfos -->
<div id="plugin_{$counter}_1" style="display:visible" {if !$smarty.foreach.fe_item.last}class="faq_holder"{/if}>
<div style="float:right">
<a href="javascript: switch_layer(document.getElementById('plugin_{$counter}_1')); switch_layer(document.getElementById('plugin_{$counter}_2'));" title="Antwort einblenden">
<span class="faq_arrow">⇓</span>
</a>
</div>
<div>
<a href="javascript: switch_layer(document.getElementById('plugin_{$counter}_1')); switch_layer(document.getElementById('plugin_{$counter}_2'));">
<span class="faq_question">
F: {$faq_element.frage}
</span>
</a>
</div>
</div>
<!-- ausgeklapptes div mit zusatzinfos -->
<div id="plugin_{$counter}_2" style="display:none" {if !$smarty.foreach.fe_item.last}class="faq_holder"{/if}>
<div align="right" valign="top" style="float:right">
<a href="javascript: switch_layer(document.getElementById('plugin_{$counter}_2')); switch_layer(document.getElementById('plugin_{$counter}_3'));" title="Antwort ausblenden">
<span class="faq_arrow">⇑</span>
</a>
</div>
<div>
<span class="faq_question_read">
F: {$faq_element.frage}
</span>
</div>
<div class="faq_answer" style="clear:both">
A: {$faq_element.antwort}
</div>
</div>
<!-- geschlossenes div, das schon einmal geöffnet war -->
<div id="plugin_{$counter}_3" style="display:none" {if !$smarty.foreach.fe_item.last}class="faq_holder"{/if}>
<div style="float:right">
<a href="javascript: switch_layer(document.getElementById('plugin_{$counter}_3')); switch_layer(document.getElementById('plugin_{$counter}_2'));" title="Antwort einblenden">
<span class="faq_arrow">⇓</span>
</a>
</div>
<div>
<span class="faq_question_read">F: {$faq_element.frage}</span>
</div>
</div>
*}
{* {assign var="counter" value=$counter+1} *}
{/foreach}
</div>
{/if}
{/foreach}
</div>
{* default.tmpl.php *}
{* *}
{* DEFAULT Template für das FAQ Modul. *}
{* Besteht aus drei Zuständen *}
{* - zugeklappt und noch nie aufgeklappt gewesen *}
{* - aufgeklappt *}
{* - zugeklappt und schon einmal aufgeklappt *}
{* gewesen (Frage wird dann anders dargestellt) *}
{* ----------------------------------------------- *}
{* ----------------------------------------------------------- *}
{* Iteration über die FAQ Gruppen *}
{* ----------------------------------------------------------- *}
<div class="faq_dhtml">
{* {assign var="counter" value=1} *}
{foreach from=$groupData item="gruppe" key="gruppenName"}
{if $gruppe|@count>0}
<div class="faq_group">
<h2>{$gruppenName}</h2>
{foreach from=$gruppe item="faq_element" name="fe_item"}
{random in=1 out=100000 assign="id"}
<div class="question" id="faq_question_{$id}">
<h3 id="faq_question_{$id}_headline">{$faq_element.frage}</h3>
<a id="faq_link_{$id}" class="faq_question_showlink marked" href="javascript:void(0);" ><span>Antwort</span></a>
<div class="clear"></div>
<div id="faq_question_{$id}_answer" class="answer" style="display:none;">
<span>{$faq_element.antwort}</span>
</div>
</div>
<script type="text/javascript">
Event.observe("faq_link_{$id}", "click", function (e) {literal}{{/literal}
var link = $("faq_link_{$id}"); //e.findElement('a');
link.toggleClassName('read');
Element.toggleContent(link,{literal}{src: '<span>Antwort</span>', dst: '<span>Schliessen</span>'}{/literal});
$('faq_question_{$id}_answer').toggle();
$('faq_question_{$id}_headline').addClassName('faq_headline_read');
$('faq_question_{$id}_answer').addClassName('faq_answer_read');
{literal}});{/literal}
</script>
{*
<!-- geschlossenes div ohne zusatzinfos -->
<div id="plugin_{$counter}_1" style="display:visible" {if !$smarty.foreach.fe_item.last}class="faq_holder"{/if}>
<div style="float:right">
<a href="javascript: switch_layer(document.getElementById('plugin_{$counter}_1')); switch_layer(document.getElementById('plugin_{$counter}_2'));" title="Antwort einblenden">
<span class="faq_arrow">⇓</span>
</a>
</div>
<div>
<a href="javascript: switch_layer(document.getElementById('plugin_{$counter}_1')); switch_layer(document.getElementById('plugin_{$counter}_2'));">
<span class="faq_question">
F: {$faq_element.frage}
</span>
</a>
</div>
</div>
<!-- ausgeklapptes div mit zusatzinfos -->
<div id="plugin_{$counter}_2" style="display:none" {if !$smarty.foreach.fe_item.last}class="faq_holder"{/if}>
<div align="right" valign="top" style="float:right">
<a href="javascript: switch_layer(document.getElementById('plugin_{$counter}_2')); switch_layer(document.getElementById('plugin_{$counter}_3'));" title="Antwort ausblenden">
<span class="faq_arrow">⇑</span>
</a>
</div>
<div>
<span class="faq_question_read">
F: {$faq_element.frage}
</span>
</div>
<div class="faq_answer" style="clear:both">
A: {$faq_element.antwort}
</div>
</div>
<!-- geschlossenes div, das schon einmal geöffnet war -->
<div id="plugin_{$counter}_3" style="display:none" {if !$smarty.foreach.fe_item.last}class="faq_holder"{/if}>
<div style="float:right">
<a href="javascript: switch_layer(document.getElementById('plugin_{$counter}_3')); switch_layer(document.getElementById('plugin_{$counter}_2'));" title="Antwort einblenden">
<span class="faq_arrow">⇓</span>
</a>
</div>
<div>
<span class="faq_question_read">F: {$faq_element.frage}</span>
</div>
</div>
*}
{* {assign var="counter" value=$counter+1} *}
{/foreach}
</div>
{/if}
{/foreach}
</div>