Joomla: How to change template on a specific article

20,416

Solution 1

If you want the template override not to depend on the menu position than the standard joomla way of assigning a different template to a menu will not work. You will need to get your hands dirty and write some custom code. You will need to use the article_id as a trigger for template switch.

I did something like that at work but don't remember now how exactly this is achieved. I will post my code here as soon as I locate it.

EDIT: Found the code :)

You need to edit the file /includes/application.php, specifically the getTemplate() method. At the end of this method, just before:

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

you can add your condition for applying a custom template, like so:

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

This will apply the custom template which name is inside the $custom_template_name to article with id=13. You can also use it to apply a different template to components, like I did with simplecaddy:

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

Solution 2

As Brent said, avoid the temptation to modify core Joomla code! Doing this will likely stop you from doing Joomla upgrades 'cos you know it's going to break the core changes that you made.

Apart from the "hidden menu item" technique (which is useful but can break SEF URLs in some situations), a useful tool is Chameleon. This allows you to select specific articles/categories/sections (plus things like browser type, user group, component, whatever) and use these to trigger a certain template.

Solution 3

You should really try to stay away from hard coding anything in to the template if it can be avoided. Not sure why you would specify that the article not be linked from a menu. The easiest way to accomplish this without having to write and code is to create a new menu, then add a menu item that links to the article you want to specify the template for. You don't have to put the menu in a module anywhere so it will never show up on the site, but it will show up in the menu assignment in the template manager.

You can do this with single articles, categories, sections, or even components. As long as you have a menu link to associate the template to. I always create an Admin only menu to put links that are needed to run the site, but do not need to be accessed by users.

Solution 4

Though this is an old post, I thought I'd share my thoughts: You can easily change template on a single article, by implementing the onAfterInitialize() - function in a system plugin. No need to modify the Joomla core.

This works for Joomla 1.5, but should also work in 2.5:

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

In joomla 3.x versions, url-parameters are handled differently. The following was tested in 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');
  }
}

More on writing plugins for Joomla here

Share:
20,416
Kratz
Author by

Kratz

Updated on July 18, 2022

Comments

  • Kratz
    Kratz almost 2 years

    Is there a way to change the template on a specific article only? Note that it should work without linking the article to any menu.

  • ivayloc
    ivayloc over 8 years
    I have create a plugin with your code but when I try to check for the current component like this $app->input->get('option') == "com_content" nothing happens, could you help me?
  • jonasfh
    jonasfh over 8 years
    Try to check if the plug-in function is actually run, f.ex. with print_r($app->input); die(); Here you will also see what parameters are defined in the $app->input object...