Joomla! Template Override:

Rotierende Modulpositionen nach X Tagen


Bei diesem Template Override handelt es sich um ein Override von "com_content / article" und ermöglicht es, automatisch verschiedene Modulpositionen zu laden und diese für eine festgelegte Anzahl an Tagen anzuzeigen.

Der Ursprung kam aus einer Anfrage, wöchentlich wechselnde Speisekarten eines Restaurants automatisiert anzeigen zu lassen. Das Ganze bestand aus fünf verschiedenen Speisekarten die jeweils eine Woche gültig sind, sind fünf Wochen vergangen und somit alle fünf Speisekarten durch, soll wieder mit Speisekarte 1 angefangen werden. Damit der Kunde nun nicht selber jede Woche die Speisekarte ändern muss, wurde dies mit dem Override automatisiert.

Hierzu benötigt ihr zwei Einstellungen, die vom Benutzer selbst zu treffen sind. Um es ein wenig leichter zu gestalten sind diese Variablen in deutscher Sprache:

// ToDo: Anzeigedauer in Tagen und Durchläufe festlegen
$anzeigeDauer = 7;
$durchlaeufe = 5;

Zum einen die Anzeigedauer in Tagen und wie viele Durchläufe er tätigen soll, bis er wieder von vorne anfängt.

Die Berechnung erfolgt in folgendem Codeschnippsel:

$startDate = new DateTime(JHtml::_('date', $this->item->publish_up, 'Y-m-d'));
$currentDate = new DateTime();
$daysSinceStart = $startDate->diff($currentDate)->days;
$iterationCount = floor($daysSinceStart / $anzeigeDauer);
$numberForIteration = $iterationCount % $durchlaeufe;

$startDate zieht sich das Veröffentlichungsdatum vom Beitrag, welches für das Override genutzt wird und formatiert es in die Schreibweise "Y-m-d" (bsp.: 2019-06-06). $currentDate ermittelt das aktuelle Tagesdatum. Die erste Berechnung findet nun schon mit der Variable $daysSinceStart statt, die die Tagesdifferenz zwischen dem Start- und dem aktuellem Datum errechnet. $iterationCount nimmt nun die Anzahl der Differenztage und teilt diese durch die Anzeigedauer und rundet diese auf eine Ganzzahl ab. $numberForIteration errechnet den Rest zwischen $iterationCount und den gewünschten Durchläufen.

Diese sieben Zeilen Code (mit ToDo-Kommentar 8) sind für die Funktionsweise notwendig und müssen im Kopf des Overrides platziert werden. Wenn die Funktion z. B. direkt im Template genutzt werden soll (index.php) könnt ihr das $startDate auch einfach händisch setzen, ab welchem Datum er anfangen soll zu zählen. Dadurch einfach die Zeile durch folgende ersetzen:

$startDate = new DateTime('2019-01-30');

Für die Ausgabe ist nun eine Switch-Anweisung notwendig. Diese könnt ihr an jeder x-beliebigen Stelle platzieren:

<?php
   switch ($numberForIteration) {
      case 0:
         $modules = JModuleHelper::getModules('modulposition-1');
         break;
      case 1:
         $modules = JModuleHelper::getModules('modulposition-2');
         break;
      case 2:
         $modules = JModuleHelper::getModules('modulposition-3');
         break;
      case 3:
         $modules = JModuleHelper::getModules('modulposition-4');
         break;
      case 4:
         $modules = JModuleHelper::getModules('modulposition-5');
         break;
   }
		
   foreach ($modules as $module) {
      echo JModuleHelper::renderModule($module);
   }
?>

In den einzelnen Cases könnt ihr nun die entsprechenden Modulpositionen ausgeben lassen. Ändert ihr die Anzahl von $durchlaeufe von 5 auf z. B. 3 müssen aus der Switch-Anweisung die Cases 3 und 4 entfernt werden:

<?php
   switch ($numberForIteration) {
      case 0:
         $modules = JModuleHelper::getModules('modulposition-1');
         break;
      case 1:
         $modules = JModuleHelper::getModules('modulposition-2');
         break;
      case 2:
         $modules = JModuleHelper::getModules('modulposition-3');
         break;
   }
		
   foreach ($modules as $module) {
      echo JModuleHelper::renderModule($module);
   }
?>

Natürlich könnt ihr die Anzahl der Durchläufe auch erhöhen und erweitert die Cases einfach nach Belieben:

<?php
   switch ($numberForIteration) {
      case 0:
         $modules = JModuleHelper::getModules('modulposition-1');
         break;
      case 1:
         $modules = JModuleHelper::getModules('modulposition-2');
         break;
      case 2:
         $modules = JModuleHelper::getModules('modulposition-3');
         break;
      case 3:
         $modules = JModuleHelper::getModules('modulposition-4');
         break;
      case 4:
         $modules = JModuleHelper::getModules('modulposition-5');
         break;
      case 5:
         $modules = JModuleHelper::getModules('modulposition-6');
         break;
      case 6:
         $modules = JModuleHelper::getModules('modulposition-7');
         break;
   }
		
   foreach ($modules as $module) {
      echo JModuleHelper::renderModule($module);
   }
?>

Wichtig ist nur, dass die Anzahl an Cases (beginnend mit 0) mit der Anzahl der Durchläufe übereinstimmt.

Benötigte Override-Dateien


  • <?php
    /**
     * @package     Joomla.Site
     * @subpackage  com_content
     *
     * @copyright   Copyright (C) 2005 - 2019 Open Source Matters, Inc. All rights reserved.
     * @license     GNU General Public License version 2 or later; see LICENSE.txt
     */
    
    defined('_JEXEC') or die;
    
    JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
    
    // Create shortcuts to some parameters.
    $params  = $this->item->params;
    $images  = json_decode($this->item->images);
    $urls    = json_decode($this->item->urls);
    $canEdit = $params->get('access-edit');
    $user    = JFactory::getUser();
    $info    = $params->get('info_block_position', 0);
    
    // Check if associations are implemented. If they are, define the parameter.
    $assocParam = (JLanguageAssociations::isEnabled() && $params->get('show_associations'));
    JHtml::_('behavior.caption');
    
    // ToDo: Anzeigedauer in Tagen und Durchläufe festlegen
    $anzeigeDauer = 1;
    $durchlaeufe = 5;
    
    
    $startDate = new DateTime(JHtml::_('date', $this->item->publish_up, 'Y-m-d'));
    $currentDate = new DateTime();
    $daysSinceStart = $startDate->diff($currentDate)->days;
    $iterationCount = floor($daysSinceStart / $anzeigeDauer);
    $numberForIteration = $iterationCount % $durchlaeufe;
    
    
    ?>
    <div class="item-page<?php echo $this->pageclass_sfx; ?>" itemscope itemtype="https://schema.org/Article">
    	<meta itemprop="inLanguage" content="<?php echo ($this->item->language === '*') ? JFactory::getConfig()->get('language') : $this->item->language; ?>" />
    	<?php if ($this->params->get('show_page_heading')) : ?>
    	<div class="page-header">
    		<h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1>
    	</div>
    	<?php endif;
    	if (!empty($this->item->pagination) && $this->item->pagination && !$this->item->paginationposition && $this->item->paginationrelative)
    	{
    		echo $this->item->pagination;
    	}
    	?>
    
    	<?php // Todo Not that elegant would be nice to group the params ?>
    	<?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date')
    	|| $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?>
    
    	<?php if (!$useDefList && $this->print) : ?>
    		<div id="pop-print" class="btn hidden-print">
    			<?php echo JHtml::_('icon.print_screen', $this->item, $params); ?>
    		</div>
    		<div class="clearfix"> </div>
    	<?php endif; ?>
    	<?php if ($params->get('show_title') || $params->get('show_author')) : ?>
    	<div class="page-header">
    		<?php if ($params->get('show_title')) : ?>
    			<h2 itemprop="headline">
    				<?php echo $this->escape($this->item->title); ?>
    			</h2>
    		<?php endif; ?>
    		<?php if ($this->item->state == 0) : ?>
    			<span class="label label-warning"><?php echo JText::_('JUNPUBLISHED'); ?></span>
    		<?php endif; ?>
    		<?php if (strtotime($this->item->publish_up) > strtotime(JFactory::getDate())) : ?>
    			<span class="label label-warning"><?php echo JText::_('JNOTPUBLISHEDYET'); ?></span>
    		<?php endif; ?>
    		<?php if ((strtotime($this->item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != JFactory::getDbo()->getNullDate()) : ?>
    			<span class="label label-warning"><?php echo JText::_('JEXPIRED'); ?></span>
    		<?php endif; ?>
    	</div>
    	<?php endif; ?>
    	<?php if (!$this->print) : ?>
    		<?php if ($canEdit || $params->get('show_print_icon') || $params->get('show_email_icon')) : ?>
    			<?php echo JLayoutHelper::render('joomla.content.icons', array('params' => $params, 'item' => $this->item, 'print' => false)); ?>
    		<?php endif; ?>
    	<?php else : ?>
    		<?php if ($useDefList) : ?>
    			<div id="pop-print" class="btn hidden-print">
    				<?php echo JHtml::_('icon.print_screen', $this->item, $params); ?>
    			</div>
    		<?php endif; ?>
    	<?php endif; ?>
    
    	<?php // Content is generated by content plugin event "onContentAfterTitle" ?>
    	<?php echo $this->item->event->afterDisplayTitle; ?>
    
    	<?php if ($useDefList && ($info == 0 || $info == 2)) : ?>
    		<?php // Todo: for Joomla4 joomla.content.info_block.block can be changed to joomla.content.info_block ?>
    		<?php echo JLayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'above')); ?>
    	<?php endif; ?>
    
    	<?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
    		<?php $this->item->tagLayout = new JLayoutFile('joomla.content.tags'); ?>
    
    		<?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?>
    	<?php endif; ?>
    
    	<?php // Content is generated by content plugin event "onContentBeforeDisplay" ?>
    	<?php echo $this->item->event->beforeDisplayContent; ?>
    
    	<?php if (isset($urls) && ((!empty($urls->urls_position) && ($urls->urls_position == '0')) || ($params->get('urls_position') == '0' && empty($urls->urls_position)))
    		|| (empty($urls->urls_position) && (!$params->get('urls_position')))) : ?>
    	<?php echo $this->loadTemplate('links'); ?>
    	<?php endif; ?>
    	<?php if ($params->get('access-view')) : ?>
    	<?php echo JLayoutHelper::render('joomla.content.full_image', $this->item); ?>
    	<?php
    	if (!empty($this->item->pagination) && $this->item->pagination && !$this->item->paginationposition && !$this->item->paginationrelative) :
    		echo $this->item->pagination;
    	endif;
    	?>
    	<?php if (isset ($this->item->toc)) :
    		echo $this->item->toc;
    	endif; ?>
    	<div itemprop="articleBody">
    		<?php echo $this->item->text; ?>
            <?php
    		switch ($numberForIteration) {
    			case 0:
    				$modules = JModuleHelper::getModules('menu-1');
    				break;
    			case 1:
    				$modules = JModuleHelper::getModules('menu-2');
    				break;
    			case 2:
    				$modules = JModuleHelper::getModules('menu-3');
    				break;
    			case 3:
    				$modules = JModuleHelper::getModules('menu-4');
    				break;
    			case 4:
    				$modules = JModuleHelper::getModules('menu-5');
    				break;
    		}
    		foreach ($modules as $module) {
    			echo JModuleHelper::renderModule($module);
    		}
            ?>
    	</div>
    
    	<?php if ($info == 1 || $info == 2) : ?>
    		<?php if ($useDefList) : ?>
    				<?php // Todo: for Joomla4 joomla.content.info_block.block can be changed to joomla.content.info_block ?>
    			<?php echo JLayoutHelper::render('joomla.content.info_block.block', array('item' => $this->item, 'params' => $params, 'position' => 'below')); ?>
    		<?php endif; ?>
    		<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
    			<?php $this->item->tagLayout = new JLayoutFile('joomla.content.tags'); ?>
    			<?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?>
    		<?php endif; ?>
    	<?php endif; ?>
    
    	<?php
    	if (!empty($this->item->pagination) && $this->item->pagination && $this->item->paginationposition && !$this->item->paginationrelative) :
    		echo $this->item->pagination;
    	?>
    	<?php endif; ?>
    	<?php if (isset($urls) && ((!empty($urls->urls_position) && ($urls->urls_position == '1')) || ($params->get('urls_position') == '1'))) : ?>
    	<?php echo $this->loadTemplate('links'); ?>
    	<?php endif; ?>
    	<?php // Optional teaser intro text for guests ?>
    	<?php elseif ($params->get('show_noauth') == true && $user->get('guest')) : ?>
    	<?php echo JLayoutHelper::render('joomla.content.intro_image', $this->item); ?>
    	<?php echo JHtml::_('content.prepare', $this->item->introtext); ?>
    	<?php // Optional link to let them register to see the whole article. ?>
    	<?php if ($params->get('show_readmore') && $this->item->fulltext != null) : ?>
    	<?php $menu = JFactory::getApplication()->getMenu(); ?>
    	<?php $active = $menu->getActive(); ?>
    	<?php $itemId = $active->id; ?>
    	<?php $link = new JUri(JRoute::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); ?>
    	<?php $link->setVar('return', base64_encode(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); ?>
    	<p class="readmore">
    		<a href="<?php echo $link; ?>" class="register">
    		<?php $attribs = json_decode($this->item->attribs); ?>
    		<?php
    		if ($attribs->alternative_readmore == null) :
    			echo JText::_('COM_CONTENT_REGISTER_TO_READ_MORE');
    		elseif ($readmore = $attribs->alternative_readmore) :
    			echo $readmore;
    			if ($params->get('show_readmore_title', 0) != 0) :
    				echo JHtml::_('string.truncate', $this->item->title, $params->get('readmore_limit'));
    			endif;
    		elseif ($params->get('show_readmore_title', 0) == 0) :
    			echo JText::sprintf('COM_CONTENT_READ_MORE_TITLE');
    		else :
    			echo JText::_('COM_CONTENT_READ_MORE');
    			echo JHtml::_('string.truncate', $this->item->title, $params->get('readmore_limit'));
    		endif; ?>
    		</a>
    	</p>
    	<?php endif; ?>
    	<?php endif; ?>
    	<?php
    	if (!empty($this->item->pagination) && $this->item->pagination && $this->item->paginationposition && $this->item->paginationrelative) :
    		echo $this->item->pagination;
    	?>
    	<?php endif; ?>
    	<?php // Content is generated by content plugin event "onContentAfterDisplay" ?>
    	<?php echo $this->item->event->afterDisplayContent; ?>
    </div>





Fehler melden

Bitte beachte unsere Datenschutzerklärung

Alle mit (*) markierten Felder werden benötigt um eine E-Mail zu senden.

E-Mail für Kontakt
Nachricht hier eingeben.
Dieses Feld wird benötigt.