Joomla插件扩展在每个页面上加载CSS文件

5

我是使用Joomla 2.5的自定义插件扩展。该插件针对我的网站上的单个页面。但由于某些原因,我注意到它在每个页面都加载css文件。

插件的代码会加载这个css文件:

$doc->addStyleSheet($pluginAssetsUrl . '/css/aecuserpage.css');

我不确定这是否常见,但对于插件我不确定。我能否使它仅适用于我想要的页面,而不是每个页面都应用。欢迎任何关于如何调试它的想法。

该插件在文章页面上打印一个简单的表格,并使用插件函数onContentPrepare


插件在做什么?例如,如果它针对特定的类/ID,则可以搜索该类/ID,如果存在,则包含CSS文件。 - George Wilson
4个回答

5

使用以下代码片段来解决问题:

1)通过检查活动菜单项加载CSS

$menu = &JSite::getMenu();
$menuItem = $menu->getActive();
$Itemid = $menuItem->id;
if($Itemid!=1)
{
 $doc->addStyleSheet($pluginAssetsUrl . '/css/aecuserpage.css');
}

2)在组件加载时加载CSS

if (JRequest::getCmd( 'option' ) == 'com_k2'){
        $doc->addStyleSheet($pluginAssetsUrl . '/css/aecuserpage.css');
}

3) 仅在首页加载CSS

<?php if(JRequest::getInt('Itemid') == $menu->getDefault()) {
   $doc->addStyleSheet($pluginAssetsUrl . '/css/aecuserpage.css');
}?>

4) 在激活的菜单ID上加载CSS

<?php
$menuID = JSite::getMenu()->getActive()->id ;
  if ($menuID == '6')
  {
   $doc->addStyleSheet($pluginAssetsUrl . '/css/aecuserpage.css');
  }
?>

5) 在激活的语言中加载CSS:

$lang =& JFactory::getLanguage();
switch ($lang) {
case 'en-gb':
$doc->addStyleSheet($pluginAssetsUrl . '/css/aecuserpage.css');
break;
}

6) 在用户访问时加载CSS

$user =& JFactory::getUser();
if($user->get('id')==0){
//user is logged in
 $doc->addStyleSheet($pluginAssetsUrl . '/css/aecuserpage.css');
}

7) 根据URL加载CSS

$u =& JFactory::getURI();
if($u=="http://www.example.com/joomla/index.php?task=view&id=12&Itemid=29")
{
$doc->addStyleSheet($pluginAssetsUrl . '/css/aecuserpage.css');
}

哎呀!#1做到了。感谢@Lodder,他很接近了。顺便说一下,这是一个很棒的选项列表!谢谢。 - Tom
谢谢,伙计。很高兴我能帮到你。 - vorillaz

0
尝试使用类似以下的代码:
$application = JFactory::getApplication();
$menu = $application->getMenu();
$item = $menu->getItem(1);
if ($item == 1){
    $doc = JFactory::getDocument(); //Remove it you already have this line
    $doc->addStyleSheet($pluginAssetsUrl . '/css/aecuserpage.css');
}

将数字“1”更改为页面所属的任何菜单项。

请注意,我还没有测试过这个,如果它不起作用,请告诉我。如果不行,我会看看能找到什么。


关闭,谢谢。这段代码确实阻止了它大部分的加载(奇怪的是它仍然显示在站点的根目录上)。我正在尝试更改菜单项的 ID,因为它现在也不能在我想要使用它的页面上工作……叹气。如果 getMenugetItem 没有达到预期效果,我会继续研究的。 - Tom
尝试了所有方法,但都没有成功。尝试使用getItems('menutype','mymenu'),至少返回了一些内容。而getItem则没有。还有其他的想法吗? - Tom

0
插件响应的是什么事件?它属于哪个组?对于许多事件,您可以检查页面的$context。如果您知道它只会在某个页面上加载,请使用这些标识符。
例如,这是分页插件中的一行:
if ($params->get('show_item_navigation') && ($context == 'com_content.article') && ($view == 'article')) {
或者从loadmodule中获取:
    $canProceed = $context == 'com_content.article';
    if (!$canProceed) {
        return;
    }

事件是:onContentPrepare - Tom
每个页面都会发生这种情况。所以你想做的是,进行一个 if ($context != whatever) {return;} 的判断,看看其他内容插件中的一些内容,基本上你是在检查 URL。 - Elin
我不确定我理解"whatever"部分是什么意思?其他插件有一些东西,就像你在回答中提到的那样,但我不确定它们的含义。例如,loadmodule,我不知道com_content.article是什么。 - Tom
文章的URL将是index.php?option=com_content&view=article&id=2(对于第二篇文章)。换句话说,这是在询问URL中是否包含文章信息,如果URL没有指示我们正在查看一篇文章,则不要继续运行插件。 - Elin
好的,接近成功了。如果我像loadmodule一样做,它只会加载文章。但现在更具体地说,我该如何指定例如文章ID 30? - Tom
使用jinput从请求中获取id(假设您无法将其添加到上下文com_content.article.30中)。 - Elin

0

我认为在插件中获取Itemid不会起作用。我的建议是将CSS代码移动到模板index.php中,并在那里检查itemid条件,这样会起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接