我想获取未分配给当前页面的模块的参数。辅助类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解决方案。两者都有效,可能在它们之间做出选择
答案 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;
}
}