Der Übersicht halber versuche ich es hier noch einmal (sorry für die obige Darstellung:)
Guten Abend zusammen,
ich habe aus dem Core Modul "Mod_Articles_News" des aktuellen Joomla ein Accordion-Modul erstellt (der Name lautet "mod_accordion", welches die Beiträge einer im Modul ausgewählten Kategorie anzeigt: Die Titel des Beitrages werden im Frontend als Button Überschrift angezeigt und der Inhalt des Beitrages im Slider des Accordions.
So weit so gut - es klappt alles (mit ein wenig Javascript aufgepeppt).
Nun möchte ich jedoch auch die Möglichkeit eines verschachtelten Accordions (innerem Accordion) hinzufügen.
Dazu habe ich in der "mod_accordion.xml" ein zusätzliches Feld eingefügt:
<field
name="catid2"
type="category"
label="Kategorie 2"
description="Bitte tragen Sie hier die Unterkategorie ein, sofern Sie mit verschachtelten Akkordions arbeiten"
extension="com_content"
multiple="true"
filter="int_array"
class="multipleCategories"
/>
Alles anzeigen
Wie kann ich den Parameter des Feldes "catid2" ansprechen, dass dieser ebenfalls ausgegeben wird?
Der php Code in meiner "default.php" sieht wie folgt aus:
<div class="accordion accordion-outer<?php echo $moduleclass_sfx; ?>">
<?php foreach ($list as $item) : ?>
<div class="accordion-item">
<button class="accordion-button accordion accordion-outer"><?php echo $item->title; ?></button>
<div class="panel content content-outer">
<?php require JModuleHelper::getLayoutPath('mod_accordion', '_item'); ?>
<?php foreach ($sub as $item2) : ?>
<div class="accordion-inner">
<button class="accordion-inner"><?php echo $item2->title; ?></button>
<div class="panel content content-inner">
<?php require JModuleHelper::getLayoutPath('mod_accordion', '_item'); ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
</div>
Die "helper.php" hatte ich ebenfalls erweitert um die "public static function getSub":
public static function getSub(&$params)
{
// Get an instance of the generic articles model2
$model2 = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true));
// Set application parameters in model
$app = JFactory::getApplication();
$appParams = $app->getParams();
$model2->setState('params', $appParams);
$model2->setState('list.start', 0);
$model2->setState('filter.published', 1);
// Set the filters based on the module params
$model2->setState('list.limit', (int) $params->get('count', 5));
// This module does not use tags data
$model2->setState('load_tags', false);
// Access filter
$access = !JComponentHelper::getParams('com_content')->get('show_noauth');
$authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get('id'));
$model2->setState('filter.access', $access);
// Category filter
$model2->setState('filter.category_id', $params->get('catid', array())); //Kategorie ID => Wechsel auf catid2 funktioniert nicht
// Filter by language
$model2->setState('filter.language', $app->getLanguageFilter());
// Filer by tag
$model2->setState('filter.tag', $params->get('tag', array()));
// Featured switch
$featured = $params->get('show_featured', '');
if ($featured === '')
{
$model2->setState('filter.featured', 'show');
}
elseif ($featured)
{
$model2->setState('filter.featured', 'only');
}
else
{
$model2->setState('filter.featured', 'hide');
}
// Set ordering
$ordering = $params->get('ordering', 'a.publish_up');
$model2->setState('list.ordering', $ordering);
if (trim($ordering) === 'rand()')
{
$model2->setState('list.ordering', JFactory::getDbo()->getQuery(true)->Rand());
}
else
{
$direction = $params->get('direction', 1) ? 'DESC' : 'ASC';
$model2->setState('list.direction', $direction);
$model2->setState('list.ordering', $ordering);
}
// Check if we should trigger additional plugin events
$triggerEvents = $params->get('triggerevents', 1);
// Retrieve Content
$items2 = $model2->getItems();
foreach ($items2 as &$item2)
{
$item2->readmore = strlen(trim($item2->fulltext));
$item2->slug = $item2->id . ':' . $item2->alias;
/** @deprecated Catslug is deprecated, use catid instead. 4.0 */
$item2->catslug = $item2->catid2 . ':' . $item2->category_alias; //Kategorie ID
if ($access in_array($item2->access, $authorised))
{
// We know that user has the privilege to view the article
$item2->link = JRoute::_(ContentHelperRoute::getArticleRoute($item2->slug, $item2->catid2, $item2->language)); //Kategorie ID
$item2->linkText = JText::_('MOD_ARTICLES_NEWS_READMORE');
}
else
{
$item2->link = new JUri(JRoute::_('index.php?option=com_users&view=login', false));
$item2->link->setVar('return', base64_encode(ContentHelperRoute::getArticleRoute($item2->slug, $item2->catid2, $item2->language))); //Kategorie ID
$item2->linkText = JText::_('MOD_ARTICLES_NEWS_READMORE_REGISTER');
}
$item2->introtext = JHtml::_('content.prepare', $item2->introtext, '', 'mod_fraladesign_accordion.content');
// Remove any images belongs to the text
if (!$params->get('image'))
{
$item2->introtext = preg_replace('/<img[^>]*>/', '', $item2->introtext);
}
// Show the Intro/Full image field of the article
if ($params->get('img_intro_full') !== 'none')
{
$images = json_decode($item2->images);
$item2->imageSrc = '';
$item2->imageAlt = '';
$item2->imageCaption = '';
if ($params->get('img_intro_full') === 'intro' && !empty($images->image_intro))
{
$item2->imageSrc = htmlspecialchars($images->image_intro, ENT_COMPAT, 'UTF-8');
$item2->imageAlt = htmlspecialchars($images->image_intro_alt, ENT_COMPAT, 'UTF-8');
if ($images->image_intro_caption)
{
$item2->imageCaption = htmlspecialchars($images->image_intro_caption, ENT_COMPAT, 'UTF-8');
}
}
elseif ($params->get('img_intro_full') === 'full' && !empty($images->image_fulltext))
{
$item2->imageSrc = htmlspecialchars($images->image_fulltext, ENT_COMPAT, 'UTF-8');
$item2->imageAlt = htmlspecialchars($images->image_fulltext_alt, ENT_COMPAT, 'UTF-8');
if ($images->image_intro_caption)
{
$item2->imageCaption = htmlspecialchars($images->image_fulltext_caption, ENT_COMPAT, 'UTF-8');
}
}
}
if ($triggerEvents)
{
$item2->text = '';
$app->triggerEvent('onContentPrepare', array ('com_content.article', &$item2, &$params, 0));
$results = $app->triggerEvent('onContentAfterTitle', array('com_content.article', &$item2, &$params, 0));
$item2->afterDisplayTitle = trim(implode("\n", $results));
$results = $app->triggerEvent('onContentBeforeDisplay', array('com_content.article', &$item2, &$params, 0));
$item2->beforeDisplayContent = trim(implode("\n", $results));
$results = $app->triggerEvent('onContentAfterDisplay', array('com_content.article', &$item2, &$params, 0));
$item2->afterDisplayContent = trim(implode("\n", $results));
}
else
{
$item2->afterDisplayTitle = '';
$item2->beforeDisplayContent = '';
$item2->afterDisplayContent = '';
}
}
return $items2;
}
Im inneren Bereich des Accordion werden jetzt aber leider lediglich die Beitragstitel (als Button) der äußeren Kategorie ausgewiesen (also quasi doppelt).
Ich sehe momentan den Wald vor lauter Bäumen nicht mehr.
Was übersehe ich?
Vielen Dank für Eure Hilfe
Liebe Grüße Pete