ti-enxame.com

Como obter o nome do modelo atribuído em onAfterInitialise?

Isso parece um bug e eu testei no 2.5.xe 3.x, mas não há como obter o nome do modelo atribuído em onAfterInitialise usando

$app = JFactory::getApplication();
$templatename =  $app->getTemplate();
    echo $templatename;

O que ele realmente faz quando você chama $app->getTemplate() muda o modelo atribuído para o padrão.

No meu plugin do sistema eu faço isso

public function onAfterInitialise() {

    $app = JFactory::getApplication();
    $templatename =  $app->getTemplate();
    echo $templatename;

}

Funciona bem se eu usá-lo em onAfterRoute, mas conforme solicitado, preciso dentro de onAfterInitialise.

Alguém pode, por favor, postar uma solução possível para obter o nome do modelo atribuído em onAfterInitialise. SQL, método joomla qualquer coisa. Obrigado!

PDATE: Qualquer método de JFactory :: getApplication, quando chamado dentro de onAfterInitialise, redefine o modelo atribuído para o padrão. Duvido que exista alguma solução para isso, pois, mesmo se chamarmos $app->getMenu()->getActive() para ver o modelo atribuído, nosso modelo atribuído será redefinido para o padrão.

Isso funciona apenas se o SEF estiver desativado:

/**
 * 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();

}
5
Dan

Posso estar errado, mas acho que não funcionará antes que a parte do roteamento seja concluída. Simplesmente porque o modelo ativo depende do roteamento.

Se você quiser fazer isso no evento onAfterInitialise por qualquer motivo, provavelmente precisará consultar a tabela do banco de dados #__menu e leia o template_style_id para o atual Itemid.

7
Bakual

Isso funciona apenas se o SEF estiver desativado

/**
 * 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();

 }
1
Dan