Cela ressemble à un bogue et j’ai testé à la fois sur les versions 2.5.x et 3.x, mais il n’existe aucun moyen d’obtenir un nom de modèle attribué dans onAfterInitialise
en utilisant
$app = JFactory::getApplication();
$templatename = $app->getTemplate();
echo $templatename;
En réalité, une fois que vous avez appelé $app->getTemplate()
, le modèle que vous avez attribué est remplacé par le modèle par défaut.
Dans mon plugin système, je le fais
public function onAfterInitialise() {
$app = JFactory::getApplication();
$templatename = $app->getTemplate();
echo $templatename;
}
Cela fonctionne bien si je l’utilise dans onAfterRoute
, mais comme demandé, j’en ai besoin à l’intérieur de onAfterInitialise
.
Quelqu'un peut-il s'il vous plaît poster une solution possible pour obtenir le nom du modèle attribué dans onAfterInitialise. SQL, méthode joomla n'importe quoi. Merci!
PDATE: Toute méthode de JFactory :: getApplication, lorsqu'elle est appelée dans onAfterInitialise, réinitialise le modèle attribué à celui par défaut. Je doute qu'il y ait une solution à ce problème car même si nous appelons $app->getMenu()->getActive()
pour voir le modèle attribué, notre modèle attribué est réinitialisé à celui par défaut.
Ceci ne fonctionne que si SEF est désactivé:
/**
* Get the assigned frontend template name
*
* @return string - template name
*/
public $assignedTemplate = '';
public function getAssignedTemplate() {
$jinput = JFactory::getApplication()->input;
$current = $jinput->getInt('Itemid');
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query
->select($db->quoteName(array('m.template_style_id', 't.template')))
->from($db->quoteName('#__menu', 'm'))
->join('INNER', $db->quoteName('#__template_styles', 't') . ' ON (' . $db->quoteName('m.template_style_id') . ' = ' . $db->quoteName('t.id') . ')')
->where($db->quoteName('m.id') . ' = '.$current.'');
// Make sure there aren't any errors
try{
$db->setQuery($query);
$currentTemplate = $db->loadObjectList();
if($currentTemplate){
$this->assignedTemplate = $currentTemplate[0]->template;
}
//
}catch (RuntimeException $e){
echo $e->getMessage();
exit;
}
return $this->assignedTemplate;
}
public function onAfterInitialise() {
echo $this->getAssignedTemplate();
}
Je peux me tromper, mais je ne pense pas que cela fonctionnera avant la fin du routage. Tout simplement parce que le modèle actif dépend du routage.
Si vous souhaitez le faire dans l'événement onAfterInitialise
pour une raison quelconque, vous devez probablement interroger la table de la base de données #__menu
et lisez le template_style_id
pour le Itemid
actuel.
Cela ne fonctionne que si SEF est désactivé
/**
* Get the assigned frontend template name
*
* @return string - template name
*/
public $assignedTemplate = '';
public function getAssignedTemplate() {
$jinput = JFactory::getApplication()->input;
$current = $jinput->getInt('Itemid');
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query
->select($db->quoteName(array('m.template_style_id', 't.template')))
->from($db->quoteName('#__menu', 'm'))
->join('INNER', $db->quoteName('#__template_styles', 't') . ' ON (' . $db->quoteName('m.template_style_id') . ' = ' . $db->quoteName('t.id') . ')')
->where($db->quoteName('m.id') . ' = '.$current.'');
// Make sure there aren't any errors
try{
$db->setQuery($query);
$currentTemplate = $db->loadObjectList();
if($currentTemplate){
$this->assignedTemplate = $currentTemplate[0]->template;
}
//
}catch (RuntimeException $e){
echo $e->getMessage();
exit;
}
return $this->assignedTemplate;
}
public function onAfterInitialise() {
echo $this->getAssignedTemplate();
}