web-dev-qa-db-ja.com

onAfterInitialiseで割り当てられたテンプレート名を取得するにはどうすればよいですか?

これはバグのようで、2.5.xと3.xの両方でテストしましたが、onAfterInitialiseでテンプレート名を割り当てる方法はありません。

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

$app->getTemplate()を呼び出すと、実際に何が行われるかによって、割り当てられたテンプレートがデフォルトのテンプレートに切り替えられます。

私のシステムプラグインでこれを行います

_public function onAfterInitialise() {

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

}
_

onAfterRouteで使用すると問題なく動作しますが、onAfterInitialise内で必要なように尋ねました。

onAfterInitialiseで割り当てられたテンプレート名を取得するための可能な解決策を誰でも投稿できますか。SQL、joomlaメソッドは何でも。ありがとうございます!

PDATE: JFactory :: getApplicationのメソッドをonAfterInitialise内で呼び出すと、割り当てられたテンプレートがデフォルトのテンプレートにリセットされます。割り当てられたテンプレートを表示するために$app->getMenu()->getActive()を呼び出しても、割り当てられたテンプレートはデフォルトのテンプレートにリセットされるため、これに対する解決策はないと思います。

これはSEFがオフの場合にのみ機能します:

_/**
 * 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

私は間違っているかもしれませんが、ルーティング部分が完了する前にそれがまったく機能しないと思います。アクティブテンプレートがルーティングに依存しているからです。

何らかの理由でonAfterInitialiseイベントでそれを実行する場合は、データベーステーブル#__menuにクエリを実行し、現在のItemidtemplate_style_idを読み取る必要があります。

7
Bakual

これは、SEFがオフの場合にのみ機能します

/**
 * 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