In Joomla können Beiträge als "Haupteinträge" markiert werden. Einen speziellen Menütyp kann verwendet werden, um sie anzuzeigen und auch in das Beiträge - Modul können sie eingesetzt werden. Allerdings in einem Kategorieblog werden sie zusammen mit regulären Beiträgen angezeigt.
Kategorieblogs erlauben zudem die Definition von "Führenden" Beiträgen, die von den "Einleitungs" Beiträgen abgegrenzt werden. Die Sortierung dieser "Führenden" basiert jedoch ausschließlich auf der Reihenfolge der Beiträge. In einigen Fällen ist dies akzeptabel, bespielsweise, wenn die Beiträge nach Erstellungsdatum sortiert werden, wodurch die drei neuesten Beiträge automatisch als "Führende" angezeigt werden.
Was wenn ein spezifischer Beitrag fixiert als "Führende" dargestellt werden soll? Da fängt man an zu tricksen ... Die manuelle Sortierung, um sicherzustellen, dass ein bestimmter Beitrag stets an erster Stelle angezeigt wird, kann schnell umständlich und fehleranfällig werden. Daher entstand die Idee, "Haupteinträge" und "Führende" Beiträge in einem Override miteinander zu kombinieren.
Ich erstelle eine Kopie der blog.php Datei innerhalb meines Templates (z.B. in Cassiopeia unter templates/cassiopeia/html/com_content/category) und trenne die "Haupteinträge" (als featured gespeichert) von den anderen:
// Separate featured from normal articles
$leadingCount = (int) $this->params->get('num_leading_articles', 0);
$introCount = (int) $this->params->get('num_intro_articles', 0);
$linkCount = (int) $this->params->get('num_links', 0);
$featured = [];
$normal = [];
foreach ($this->items as $item) {
if ($item->featured == 1) {
$featured[] = $item;
} else {
$normal[] = $item;
}
}
$myLeadItems = array_slice($featured, 0, $leadingCount);
$featuredOverflow = array_slice($featured, $leadingCount);
$introPool = array_merge($featuredOverflow, $normal);
$myIntroItems = array_slice($introPool, 0, $introCount);
$linkPool = array_slice($introPool, $introCount);
$myLinkItems = array_slice($linkPool, 0, $linkCount);
An der Stelle wo normalerweise die "Führende" Beiträgen angezeigt werden, ändere ich den Code um die "Haupteinträge" zu laden:
<?php if (!empty($myLeadItems)) : ?>
<div class="com-content-category-blog__items blog-items items-leading <?php echo $this->params->get('blog_class_leading'); ?>">
<?php foreach ($myLeadItems as &$item) : ?>
<div class="com-content-category-blog__item blog-item">
<?php
$this->item = &$item;
echo $this->loadTemplate('item');
?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
Und weiter unten wo normalerweise die "Einleitung" Beiträge dargestellt werden, lade ich jetzt die "normalen":
<?php if (!empty($myIntroItems)) : ?>
<?php $blogClass = $this->params->get('blog_class', ''); ?>
<?php if ((int) $this->params->get('num_columns') > 1) : ?>
<?php $blogClass .= (int) $this->params->get('multi_column_order', 0) === 0 ? ' masonry-' : ' columns-'; ?>
<?php $blogClass .= (int) $this->params->get('num_columns'); ?>
<?php endif; ?>
<div class="com-content-category-blog__items blog-items <?php echo $blogClass; ?>">
<?php foreach ($myIntroItems as $key => &$item) : ?>
<div class="com-content-category-blog__item blog-item">
<?php
$this->item = &$item;
echo $this->loadTemplate('item');
?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
Und hier den kompletten Code von blog.php:
<?php
/**
* @package Joomla.Site
* @subpackage com_content
*
* @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Layout\LayoutHelper;
$app = Factory::getApplication();
/** @var \Joomla\Component\Content\Site\View\Category\HtmlView $this */
$this->category->text = $this->category->description;
$app->triggerEvent('onContentPrepare', [$this->category->extension . '.categories', &$this->category, &$this->params, 0]);
$this->category->description = $this->category->text;
$results = $app->triggerEvent('onContentAfterTitle', [$this->category->extension . '.categories', &$this->category, &$this->params, 0]);
$afterDisplayTitle = trim(implode("\n", $results));
$results = $app->triggerEvent('onContentBeforeDisplay', [$this->category->extension . '.categories', &$this->category, &$this->params, 0]);
$beforeDisplayContent = trim(implode("\n", $results));
$results = $app->triggerEvent('onContentAfterDisplay', [$this->category->extension . '.categories', &$this->category, &$this->params, 0]);
$afterDisplayContent = trim(implode("\n", $results));
$htag = $this->params->get('show_page_heading') ? 'h2' : 'h1';
// Separate featured from normal articles
$leadingCount = (int) $this->params->get('num_leading_articles', 0);
$introCount = (int) $this->params->get('num_intro_articles', 0);
$linkCount = (int) $this->params->get('num_links', 0);
$featured = [];
$normal = [];
foreach ($this->items as $item) {
if ($item->featured == 1) {
$featured[] = $item;
} else {
$normal[] = $item;
}
}
$myLeadItems = array_slice($featured, 0, $leadingCount);
$featuredOverflow = array_slice($featured, $leadingCount);
$introPool = array_merge($featuredOverflow, $normal);
$myIntroItems = array_slice($introPool, 0, $introCount);
$linkPool = array_slice($introPool, $introCount);
$myLinkItems = array_slice($linkPool, 0, $linkCount);
?>
<div class="com-content-category-blog blog">
<?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; ?>
<?php if ($this->params->get('show_category_title', 1)) : ?>
<<?php echo $htag; ?>>
<?php echo $this->category->title; ?>
</<?php echo $htag; ?>>
<?php endif; ?>
<?php echo $afterDisplayTitle; ?>
<?php if ($this->params->get('show_cat_tags', 1) && !empty($this->category->tags->itemTags)) : ?>
<?php $this->category->tagLayout = new FileLayout('joomla.content.tags'); ?>
<?php echo $this->category->tagLayout->render($this->category->tags->itemTags); ?>
<?php endif; ?>
<?php if ($beforeDisplayContent || $afterDisplayContent || $this->params->get('show_description', 1) || $this->params->def('show_description_image', 1)) : ?>
<div class="category-desc clearfix">
<?php if ($this->params->get('show_description_image') && $this->category->getParams()->get('image')) : ?>
<?php echo LayoutHelper::render(
'joomla.html.image',
[
'src' => $this->category->getParams()->get('image'),
'alt' => empty($this->category->getParams()->get('image_alt')) && empty($this->category->getParams()->get('image_alt_empty')) ? false : $this->category->getParams()->get('image_alt'),
]
); ?>
<?php endif; ?>
<?php echo $beforeDisplayContent; ?>
<?php if ($this->params->get('show_description') && $this->category->description) : ?>
<?php echo HTMLHelper::_('content.prepare', $this->category->description, '', 'com_content.category'); ?>
<?php endif; ?>
<?php echo $afterDisplayContent; ?>
</div>
<?php endif; ?>
<?php if (empty($this->lead_items) && empty($this->link_items) && empty($this->intro_items)) : ?>
<?php if ($this->params->get('show_no_articles', 1)) : ?>
<div class="alert alert-info">
<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span>
<?php echo Text::_('COM_CONTENT_NO_ARTICLES'); ?>
</div>
<?php endif; ?>
<?php endif; ?>
<?php if (!empty($myLeadItems)) : ?>
<div class="com-content-category-blog__items blog-items items-leading <?php echo $this->params->get('blog_class_leading'); ?>">
<?php foreach ($myLeadItems as &$item) : ?>
<div class="com-content-category-blog__item blog-item">
<?php
$this->item = &$item;
echo $this->loadTemplate('item');
?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php if (!empty($myIntroItems)) : ?>
<?php $blogClass = $this->params->get('blog_class', ''); ?>
<?php if ((int) $this->params->get('num_columns') > 1) : ?>
<?php $blogClass .= (int) $this->params->get('multi_column_order', 0) === 0 ? ' masonry-' : ' columns-'; ?>
<?php $blogClass .= (int) $this->params->get('num_columns'); ?>
<?php endif; ?>
<div class="com-content-category-blog__items blog-items <?php echo $blogClass; ?>">
<?php foreach ($myIntroItems as $key => &$item) : ?>
<div class="com-content-category-blog__item blog-item">
<?php
$this->item = &$item;
echo $this->loadTemplate('item');
?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php if (!empty($myLinkItems)) : ?>
<div class="items-more">
<?php echo $this->loadTemplate('links'); ?>
</div>
<?php endif; ?>
<?php if ($this->maxLevel != 0 && !empty($this->children[$this->category->id])) : ?>
<div class="com-content-category-blog__children cat-children">
<?php if ($this->params->get('show_category_heading_title_text', 1) == 1) : ?>
<h3> <?php echo Text::_('JGLOBAL_SUBCATEGORIES'); ?> </h3>
<?php endif; ?>
<?php echo $this->loadTemplate('children'); ?> </div>
<?php endif; ?>
<?php // Code to add a link to submit an article. ?>
<?php if ($this->category->getParams()->get('access-create')) : ?>
<?php echo HTMLHelper::_('contenticon.create', $this->category, $this->category->params); ?>
<?php endif; ?>
<?php if (($this->params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?>
<div class="com-content-category-blog__navigation w-100">
<?php if ($this->params->def('show_pagination_results', 1)) : ?>
<p class="com-content-category-blog__counter counter float-md-end pt-3 pe-2">
<?php echo $this->pagination->getPagesCounter(); ?>
</p>
<?php endif; ?>
<div class="com-content-category-blog__pagination">
<?php echo $this->pagination->getPagesLinks(); ?>
</div>
</div>
<?php endif; ?>
</div>
Diese Anpassung ermöglicht es, innerhalb einer Kategorie "Haupteinträge" zu definieren und sie als "Führende" Beiträge im Bloglayout anzuzeigen.
Bildquelle: Image by Gerd Altmann from Pixabay