【问题标题】:Joomla: How to change template on a specific articleJoomla:如何更改特定文章的模板
【发布时间】:2011-03-17 05:46:31
【问题描述】:

有没有办法只更改特定文章的模板? 请注意,它应该可以在不将文章链接到任何菜单的情况下工作。

【问题讨论】:

    标签: joomla joomla-template


    【解决方案1】:

    虽然这是一篇旧文章,但我想分享一下我的想法:您可以通过在系统插件中实现 onAfterInitialize() 函数轻松更改单个文章的模板。无需修改 Joomla 核心。

    这适用于 Joomla 1.5,但也适用于 2.5:

    function onAfterInitialise(){
      if(true){ // f.ex. test for article ID or whatever
        JRequest::setVar('template', 'beez'); // change template
      }
    }
    

    在 joomla 3.x 版本中,url 参数的处理方式不同。以下是在 joomla 3.4.8 中测试的:

    public function onAfterInitialise()
    {
      $app=JFactory::getApplication();
      if(true){ // f.ex. test for article ID or whatever
        $app->input->set('template', 'beez3');
      }
    }
    

    更多关于为 Joomla 编写插件here

    【讨论】:

    • 我已经用你的代码创建了一个插件,但是当我尝试检查当前组件时像这样$app->input->get('option') == "com_content" 什么都没有发生,你能帮我吗?
    • 尝试检查插件功能是否实际运行,f.ex。使用 print_r($app->input);死();在这里您还将看到 $app->input 对象中定义了哪些参数...
    【解决方案2】:

    正如布伦特所说,避免修改核心 Joomla 代码的诱惑!这样做可能会阻止您进行 Joomla 升级,因为您知道它会破坏您所做的核心更改。

    除了“隐藏菜单项”技术(这很有用,但在某些情况下会破坏 SEF URL),一个有用的工具是Chameleon。这允许您选择特定的文章/类别/部分(加上浏览器类型、用户组、组件等)并使用它们来触发某个模板。

    【讨论】:

      【解决方案3】:

      如果可以避免的话,您真的应该尽量避免将任何内容硬编码到模板中。不知道为什么要指定文章不从菜单链接。无需编写代码即可完成此操作的最简单方法是创建一个新菜单,然后添加一个菜单项,该菜单项链接到您要为其指定模板的文章。您不必将菜单放在模块中的任何位置,因此它永远不会显示在网站上,但它会显示在模板管理器的菜单分配中。

      您可以使用单个文章、类别、部分甚至组件来执行此操作。只要您有一个菜单链接来关联模板。我总是创建一个仅限管理员的菜单来放置运行站点所需但用户不需要访问的链接。

      【讨论】:

        【解决方案4】:

        如果您希望模板覆盖不依赖于菜单位置,那么将不同模板分配给菜单的标准 joomla 方式将不起作用。您将需要亲自动手并编写一些自定义代码。您需要使用 article_id 作为模板切换的触发器。

        我在工作中做过类似的事情,但现在不记得具体是如何实现的了。找到后我会在此处发布我的代码。

        编辑:找到代码:)

        您需要编辑文件 /includes/application.php,特别是 getTemplate() 方法。在这个方法的最后,就在之前:

        // Fallback template
        if (!file_exists(JPATH_THEMES.DS.$template.DS.'index.php')) {
          $template = 'rhuk_milkyway';
        }
        

        您可以添加应用自定义模板的条件,如下所示:

        //CUSTOM TEMPLATE FOR THE ARTICLE 13
        if (JRequest::getVar('id')=='13' && JRequest::getVar('option')=='com_content') {
          $template = $custom_template_name;
        }
        

        这会将名称在 $custom_template_name 中的自定义模板应用于 id=13 的文章。您还可以使用它为组件应用不同的模板,就像我对 simplecaddy 所做的那样:

        //TEMPLATE FOR SIMPLECADDY
        if (JRequest::getVar('option')=='com_caddy'){
          $template = 'shop';
        }
        

        【讨论】:

          猜你喜欢
          • 2015-12-19
          • 1970-01-01
          • 2012-06-06
          • 2013-05-07
          • 1970-01-01
          • 1970-01-01
          • 2012-01-01
          • 2018-05-06
          • 2012-11-17
          相关资源
          最近更新 更多