1

我正在制作一个 joomla 2.5 的自定义模板,开发的目标之一是在每个特色文章迭代之后包含一个横幅。

经过长时间的研究,我可以使用以下代码将横幅渲染到/template_name/html/com_content/featured/default_item.php中:

$document = JFactory::getDocument();
$renderer = $document->loadRenderer('modules');
$position = "nota";
$options = array('style' => 'raw');
echo $renderer->render($position, $options, null);

但问题是每次迭代都会重置横幅列表,因此我在每篇精选文章中都重复了相同的横幅。

我尝试在/template_name/html/com_content/featured/default.php中使用相同的代码包含横幅模块,但没有成功。最近我尝试过<jdoc:include type="modules" name="nota" style="raw" />,但它也不起作用,所以我将不胜感激任何帮助解决这一点。

提前致谢。

4

1 回答 1

1

您可以通过两种方式解决此问题。

正确的方式

复制并重命名横幅模块(fx. to mybanners),更改getList()帮助文件中的方法以在每次调用时检索不同的横幅。这可以解决。是:

class modMybannersHelper
{
    static function &getList(&$params)
    {
        static $index = 0;

        JModelLegacy::addIncludePath(JPATH_ROOT.'/components/com_banners/models', 'BannersModel');
        $document = JFactory::getDocument();
        $app      = JFactory::getApplication();
        $keywords = explode(',', $document->getMetaData('keywords'));

        $model = JModelLegacy::getInstance('Banners', 'BannersModel', array('ignore_request'=>true));
        $model->setState('filter.client_id', (int) $params->get('cid'));
        $model->setState('filter.category_id', $params->get('catid', array()));
        $model->setState('list.limit', 1);
        $model->setState('list.start', $index++);
        $model->setState('filter.ordering', $params->get('ordering'));
        $model->setState('filter.tag_search', $params->get('tag_search'));
        $model->setState('filter.keywords', $keywords);
        $model->setState('filter.language', $app->getLanguageFilter());

        $banners = $model->getItems();
        $model->impress();

        return $banners;
    }
}

这只是一个草图;您仍然需要处理$index大于记录数的情况。

骇人听闻的方式

检索代码只打开一个端口来注入条件——文档的关键字。因此,您可以(在您的模板文件中)存储原始关键字并用关键字替换它们以识别横幅。在这种情况下,横幅必须具有相同的关键字。

$document = JFactory::getDocument();
$keywords = $document->getMetaData('keywords');
$renderer = $document->loadRenderer('modules');
$position = "nota";
$options  = array('style' => 'raw');
$document->setMetaData('keywords', 'banner_key');
echo $renderer->render($position, $options, null);
$document->setMetaData('keywords', $keywords);

无论哪种方式,缓存都可能会阻止它工作,因此您可能必须将其关闭(我没有检查)。

于 2013-05-29T15:01:45.843 回答