これはバグのようで、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();
}
_
私は間違っているかもしれませんが、ルーティング部分が完了する前にそれがまったく機能しないと思います。アクティブテンプレートがルーティングに依存しているからです。
何らかの理由でonAfterInitialise
イベントでそれを実行する場合は、データベーステーブル#__menu
にクエリを実行し、現在のItemid
のtemplate_style_id
を読み取る必要があります。
これは、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();
}