it-swarm.com.de

Zwei verschiedene Module, die den gleichen Inhalt zeigen

Ich habe das Modul mod_article_category aus Joomla 3.3.3 repliziert, um nur einen Artikel anzuzeigen, der nach der ID gefiltert ist (die Sie in einer Dropdown-Liste auswählen können).

Mein Hauptcode:

defined('_JEXEC') or die;
require_once __DIR__ . '/helper.php';
$article = ModArticleHelper::getArticle($params)[0];
require JModuleHelper::getLayoutPath('mod_article', $params->get('layout', 'default'));

Und mein Vorlagencode:

<?php defined('_JEXEC') or die;
$show_title = $params->get('show_title',true);
$h = $params->get('h','h3');
$class = htmlspecialchars($params->get('moduleclass_sfx'));
?>
<article class="<?= $class ?>">
    <?php if($show_title){echo "<$h>$article->title</$h>";} ?>
    <?= $article->introtext.$article->fulltext ?>   
</article>

Wenn ich dieses Modul verwende, um einen Artikel in einer Modulposition anzuzeigen, funktioniert es. Das Problem tritt auf, wenn ich dieses Modul mehrmals habe. Der angezeigte Artikel ist immer der des zuletzt hinzugefügten Moduls und alle modulspezifischen Parameter (wie der Titel des Artikels) hören auch nur das zuletzt hinzugefügte Modul. Die Einstellungen des Sitewide-Moduls (wie das Anzeigen des Modultitels) ändern sich.

Warum funktioniert das Modul an mehreren Positionen nicht?

VOLLSTÄNDIGER CODE (helper.php)

defined('_JEXEC') or die;
$com_path = JPATH_SITE . '/components/com_content/';
require_once $com_path . 'helpers/route.php';
JModelLegacy::addIncludePath($com_path . '/models', 'ContentModel');

abstract class ModArticleHelper{
    public static function getArticle(&$params){
        // Get an instance of the generic articles model
        $articles = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true));

        // Set application parameters in model
        $app = JFactory::getApplication();
        $appParams = $app->getParams();
        $articles->setState('params', $appParams);
        $articles->setState('filter.published', 1);

        // Access filter
        $access = !JComponentHelper::getParams('com_content')->get('show_noauth');
        $authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get('id'));
        $articles->setState('filter.access', $access);

        // Item ID filter
        $articles->setState('filter.id', $params->get('article_id', array()));

        // Filter by language
        $articles->setState('filter.language', $app->getLanguageFilter());

        $items = $articles->getItems();

        foreach ($items as &$item){
            $item->slug = $item->id . ':' . $item->alias;
            $item->catslug = $item->catid . ':' . $item->category_alias;

            if ($access || in_array($item->access, $authorised)){
                // We know that user has the privilege to view the article
                $item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug));
            } else {
                $item->link = JRoute::_('index.php?option=com_users&view=login');
            }
        }
        return $items;
    }
}
2
xaddict

Ich habe den gesamten Hilfecode (in weniger als zwei Minuten) überarbeitet, um nativen Joomla-Datenbankcode anstelle von Komponenten-Hilfsprogrammen zu verwenden. Der vollständige helper.php Code ist jetzt:

defined('_JEXEC') or die;

$com_path = JPATH_SITE . '/components/com_content/';
//require_once $com_path . 'router.php';
require_once $com_path . 'helpers/route.php';

abstract class ModArticleHelper{

    public static function getArticle(&$params){
        $app = JFactory::getApplication();
        $appParams = $app->getParams();

        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select('content.*,c.id as catid,c.alias as category_alias');
        $query->from('#__content as content, #__categories as c');
        $query->where('content.id = '.$params->get('article_id'));
        $query->where('content.state = 1');
        $query->where('content.catid = c.id');
        $db->setQuery($query);
        $items = $db->loadObjectList();

        foreach ($items as &$item){
            $item->slug = $item->id . ':' . $item->alias;
            $item->catslug = $item->catid . ':' . $item->category_alias;
            $item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug));
        }
        return $items;
    }
}

und es funktioniert!

2
xaddict

ContentModelArticles verfügt über einen internen Cache.

ContentModelArticles-> getItems () => JModelList-> getItems (), Zeile 155

    public function getItems()
    {
    // Get a storage key.
    $store = $this->getStoreId();

    // Try to load the data from internal storage.
    if (isset($this->cache[$store]))
    {
        return $this->cache[$store];
    }

Da der Cache-Zugriff auf der StoreId basiert, sollten Sie für jedes Modul einen anderen Kontext definieren. Z.B. $ articles-> set ('context', 'mod_mymodule'. $ id);

1
Anibal