获取未分配给当前页面的模块的Joomla 2.5模块参数

时间:2013-05-03 21:21:07

标签: joomla parameters module joomla2.5 joomla-extensions

我想获取未分配给当前页面的模块的参数。辅助类JModuleHelper有一个getModule方法,但是在此定义:http://docs.joomla.org/JModuleHelper/getModule,必须将模块分配给当前菜单项或所有菜单项。

显然我可以直接进入数据库并自己提取参数,但我想以更整洁的Joomla方式进行。

我要做的是编写一个库,但是库需要一些参数化和它自己的数据库表(库不能做的两件事),所以我试图用一个模块填补空白。我需要从库代码中访问模块参数(可以从站点上的任何页面调用)。

感谢您的帮助


我采用的解决方案是将以下代码添加到我的库中:

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('m.params')
    ->from('#__modules AS m')
    ->where('m.module=' . $db->quote('mod_my_module_name'));
$db->setQuery($query);
$module = $db->loadObject();

$module_params = new JRegistry();
$module_params->loadString($module->params);

我没有添加这个作为这个问题的答案,因为我认为应该有一个更好的解决方案,不直接查询核心数据库。但是我认为以上是目前最好的解决方案。


更新

根据对Joomla这个问题的回答!开发人员组我已经实现了一个库/插件解决方案。插件可以使用以下代码从任何地方提取参数:

$plugin = JPluginHelper::getPlugin('plugin_type', 'plugin_name');
$parameteres = new JRegistry($plugin->params);
$param =$parameteres->get('parameter');

插件优于模块的优点是不需要将插件分配给所有项目ID,因为它们与模块一样。

我越是调查它,我就越有信心对原始问题没有优雅的解决方案,即获取未分配给当前项目ID的模块参数。因此,如果您发现了这个问题,因为您想要做类似的事情,那么我会推荐上面的解决方案或下面的cppl解决方案。两者都有效,可能在它们之间做出选择

1 个答案:

答案 0 :(得分:3)

要解决此问题,您可以获取当前文档,然后加载module渲染器。例如如果我想要一个标题为“体育新闻”的最新新闻模块,我可以使用它:

$module    = 'mod_articles_latest';
$title     = 'Sport News';

$document  = JFactory::getDocument();
$renderer  = $document->loadRenderer('module');
$theModule = JModuleHelper::getModule($module, $title);

因此,为了处理未将模块分配给当前或所有菜单项的情况,您可以创建自己的助手,该助手继承自JModuleHelper并覆盖 受保护的功能_load()

class MyModuleHelper extends JModuleHelper
{
    protected static function &_load()
    {
        static $clean;

        if (isset($clean))
        {
            return $clean;
        }

        $Itemid = JRequest::getInt('Itemid');
        $app = JFactory::getApplication();
        $user = JFactory::getUser();
        $groups = implode(',', $user->getAuthorisedViewLevels());
        $lang = JFactory::getLanguage()->getTag();
        $clientId = (int) $app->getClientId();

        $cache = JFactory::getCache('com_modules', '');
        $cacheid = md5(serialize(array($Itemid, $groups, $clientId, $lang)));

        if (!($clean = $cache->get($cacheid)))
        {
            $db = JFactory::getDbo();

            $query = $db->getQuery(true);
            $query->select('m.id, m.title, m.module, m.position,    m.content, m.showtitle, m.params, mm.menuid');
            $query->from('#__modules AS m');
            $query->join('LEFT', '#__modules_menu AS mm ON mm.moduleid =    m.id');
            $query->where('m.published = 1');

            $query->join('LEFT', '#__extensions AS e ON e.element =     m.module AND e.client_id = m.client_id');
            $query->where('e.enabled = 1');

            $date = JFactory::getDate();
            $now = $date->toSql();
            $nullDate = $db->getNullDate();
            $query->where('(m.publish_up = ' . $db->Quote($nullDate) . '    OR m.publish_up <= ' . $db->Quote($now) . ')');
            $query->where('(m.publish_down = ' . $db->Quote($nullDate) . '  OR m.publish_down >= ' . $db->Quote($now) . ')');

            $query->where('m.access IN (' . $groups . ')');
            $query->where('m.client_id = ' . $clientId);
            // Disable this line in your override class's _load()...
            // $query->where('(mm.menuid = ' . (int) $Itemid . ' OR     mm.menuid <= 0)');

            // Filter by language
            if ($app->isSite() && $app->getLanguageFilter())
            {
                $query->where('m.language IN (' . $db->Quote($lang) .   ',' . $db->Quote('*') . ')');
            }

            $query->order('m.position, m.ordering');

            // Set the query
            $db->setQuery($query);
            $modules = $db->loadObjectList();
            $clean = array();

            if ($db->getErrorNum())
            {
                JError::raiseWarning(500,   JText::sprintf('JLIB_APPLICATION_ERROR_MODULE_LOAD', $db->getErrorMsg()));
                return $clean;
            }

            // Apply negative selections and eliminate duplicates
            $negId = $Itemid ? -(int) $Itemid : false;
            $dupes = array();
            for ($i = 0, $n = count($modules); $i < $n; $i++)
            {
                $module = &$modules[$i];

                // The module is excluded if there is an explicit   prohibition
                $negHit = ($negId === (int) $module->menuid);

                if (isset($dupes[$module->id]))
                {
                    // If this item has been excluded, keep the     duplicate flag set,
                    // but remove any item from the cleaned array.
                    if ($negHit)
                    {
                        unset($clean[$module->id]);
                    }
                    continue;
                }

                $dupes[$module->id] = true;

                // Only accept modules without explicit exclusions.
                if (!$negHit)
                {
                    // Determine if this is a 1.0 style custom  module (no mod_ prefix)
                    // This should be eliminated when the class is  refactored.
                    // $module->user is deprecated.
                    $file = $module->module;
                    $custom = substr($file, 0, 4) == 'mod_' ?  0 :  1;
                    $module->user = $custom;
                    // 1.0 style custom module name is given by     the title field, otherwise strip off "mod_"
                    $module->name = $custom ? $module->module :     substr($file, 4);
                    $module->style = null;
                    $module->position = strtolower($module- >position);
                    $clean[$module->id] = $module;
                }
            }

            unset($dupes);

            // Return to simple indexing that matches the query order.
            $clean = array_values($clean);

            $cache->store($clean, $cacheid);
        }

        return $clean;
    }
}