Nov
1
2012

Joomlaがはき出すheadタグ内を編集したい

Print
0 votes
Blog - Joomla! CMS, Blog - Joomla!2.5, Blog - Joomla!3.x
Written by:Joomler! 16843 hits

昨日見たサイトである意味間違ってはいないが、普通それはやらないことが書かれていたので書いてみる。

Joomlaは、1.5以下は管理画面からのアップデートが無いので比較しながら、コアファイルをアップロードしていくという方法を行ってもまあ、できる範囲かと思っていた。1.5より上位バージョンからは、管理画面からアップデート可能なので大抵ファイルを比較することなくアップデートしていると思う。私もそうだ。ところが、そうなるとコアファイルを変更していてそのファイルが更新された場合、再度編集し直さないといけないことになる。それが致命的なことであれば大変なことになるだろう。だから、コアファイルを編集することは、極力避けるべきだと思います。

現在のJoomla(ほぼ1.5から)では、コアファイルを編集せずとも大部分のことがエクステンションでカスタマイズすることが可能です。ですが、少しのことでエクステンションを作成していては無駄なこともあります。表題のheadタグ内の編集もそうです。逆に自由に編集するためにエクステンション化する事の方が面倒なくらいです。

JFactory::getDocument()->setGenerator('ExampleGenerator');

この一行をテンプレートのindex.php上部に追加するだけ。ExampleGeneratorを書き換えてください。

$doc = JFactory::getDocument();
$scripts = $doc->_scripts;
$doc->_scripts = array();
$script = $doc->_script;
$doc->_script = array();

function renderScript($scripts, $script)
{
	$buffer = '';
	$tab = "\11";
	$lnEnd = "\12";
	// Generate script file links
	foreach ($scripts as $strSrc => $strAttr)
	{
		$buffer .= $tab . '' . $lnEnd;
	}

	echo $buffer;
}

このコードをテンプレートのindex.phpの上部に加える。さらにタグの直前(別に他の場所でも良い)に下記の一行を追加する。

renderScript($scripts, $script);

先のコードで、documentオブジェクト内のscripts, scriptを別の変数に確保し、documentオブジェクト内のscriptを空にすることで、head内で出力されなくなります。そして、独自に定義した関数でbody閉じタグ直前に書き出します。

これは、同じようにstylesheets, styleでも可能です。また、書き出される順番を変更したいなら、renderScript関数内のforeachループ部分でそれようの処理をすれば可能です。

もちろん、テンプレート自身もアップデートされる可能性はありますが、書き換えたファイルが散在するより管理は楽だし、あらかじめ元ファイルを残しておき、変更部分だけをマージすれば良い。もっと良いのは、自分で自由にカスタマイズ可能なプラグインを作成するの方が良いでしょうけど。また、別ファイルで作成し、それを読み込むコードと書き出すコードの2行だけの追加にするというのも一つの方法です。

安直にコアファイルを書き換えるのは避けて通るべきですね。

追記:

これでは、足りない事に気づきました。

function renderScript($scripts, $script)
{
    $doc = JFactory::getDocument();
    $lnEnd = "\12";
    $tab = "\11";
    $ss = $doc->_scripts;
    $s = $doc->_script;
    $doc->_scripts = $doc->_script = array();
    if(count($ss)){
        $scripts = array_merge($ss, $scripts);
    }
    $buffer = '';
    foreach ($scripts as $strSrc => $strAttr)
    {
        $buffer .= $tab . '<script src="' . $strSrc . '"';
        {
            $buffer .= ' type="text/javascript"';
        }
        $buffer .= '></script>' . $lnEnd;
    }
    foreach($s as $type => $content)
    {
        $buffer .= $tab . '<script type="' . $type . '">' . $lnEnd;
        $buffer .= $content . $lnEnd;
        $buffer .= $tab . '</script>' . $lnEnd;
    }
    foreach ($script as $type => $content)
    {
        $buffer .= $tab . '<script type="' . $type . '">' . $lnEnd;
        $buffer .= $content . $lnEnd;
        $buffer .= $tab . '</script>' . $lnEnd;
    }
	echo $buffer;
}

関数部分は、上記のように変更します。
これは、Moduleではき出されるスクリプトに対応しています。先のコードでは、Moduleで登録されるJavascriptのみheadタグ内に出てしまいます。そして、これらを使うためには、mootoolsやjQueryなどを使用したJavascriptは(後で実行される関数内のものは良い)直接書き出すようにしてはいけません。必ずJoomlaのJFactory::getDocument()->addScriptDeclaration($JS);などを使ってJoomlaに登録するように書きます。これを使うことにより、エラーが出るようならまず、それを疑うべきでしょう。

Tagsテンプレート,エクステンション,追加,変更,doc,foreach,管理,1.5,可能,ファイル,アップデート,scripts,buffer,lnEnd,作成,script,編集,tab,Generate,直前
 

JContentPlus for Joomla!1.5 powered by Joomler!.net