Joomla!の管理画面で、こんなことってありませんか?まずは、画像をご覧下さい。

画像ファイルに長いファイル名をつけなきゃ良いのですが、FirefoxアドオンのFireShotなどを使っているとついつい、長いファイル名で保存しがちになります。
画像ファイルのファイル名が長いため、タイトル部分がつぶれちゃって選択リストが幅をきかしています。これってすごく鬱陶しくてたまらないんです。どうせタイトルが狭くなるなら縦書きにしてくれと言いたくなるくらい・・・。
テンプレートを作成したり、Javascriptを変更・開発していたりするときブラウザのキャッシュで2度手間になったってことは経験されたことがあると思います。以下のサイトで動的にリンクを出力することでキャッシュさせない(毎回ロードさせる)方法が紹介されていましたのでそれをJoomla!に適用してみます。
http://davidwalsh.name/prevent-cache
http://www.electrictoolbox.com/javascript-css-file-timestamps/
スタイルシートのlinkタグのhref属性部分を例に
簡単に書く
(デバッグ時のみ動的にする。)
<?php echo $this->baseurl;?>/templates/<?php echo $this->template;?>/css/style.css<?php echo JFactory::getConfig()->getValue('debug')? '?'. time(): '';?>変更のあったときだけ
$filetime = filemtime(JPATH_THEMES. DS. $this->template. DS. 'css'. DS. 'style.css'); <?php echo $this->baseurl;?>/templates/<?php echo $this->template;?>/css/style.css?<?php echo $filetime;?>
何れもcssのリンクは、スタイルシートのhrefの部分です。
こうすることでブラウザのリロードボタンや、CacheをDisableにする手間が少しは軽減できるのでは無いかと思います。開発時は特に持ってこいかもしれません。また、同じファイル名で画像変更したときのブラウザキャッシュ対策にも使えるかもしれません。
お試しあれ
Javascriptやスタイルシートをシステムで出力されるより先に出力したい場合があります。
その時は、Joomla!1.5の場合テンプレート「index.php」の以下のタグより先に書けば可能です。
ここに書く
<jdoc:include type="head" />
ですが、これだとmetaタグなどよりも先に出力されてしまうことになります。
そこでJoomla!1.5の出力するJavascriptやスタイルシートが出力される前に出力されるように順番を変えてみることにします。
まずは、Javascript
まず、何がすでにJavascriptとして登録されているかを取得します。
テンプレートの「index.php」内の「defined( '_JEXEC' ) or die( 'Restricted access' );」の行より下に以下のように書いてみます。
$myHead = $this->getHeadData();
これで「$myHead」にheadタグで出力される内容が得られます。これは配列になっています。
次に登録されているJavascirptを取得します。
$myScript = $myHead['scripts'];
「$myScript」に配列でJavascriptの一覧が入りました。
では先に出力されるようにしたいJavascriptを以下のように書きます。
$myOutputScript['/templates/mytemplate/js/myscript.js'] = 'text/javascript';
そして
$myScript = array_merge($myOutputScript, $myScript);
$this->setHeadData(array('scripts' =>$myScript));
これですでに登録済みのJavascriptより先に自分のJavascriptが出力されるようになります。
まとめて書くと以下のようになります。
<?php
$myHead = $this->getHeadData();
$myScript = $myHead['scripts'];
$myOutputScript['/templates/mytemplate/js/myscript.js'] = 'text/javascript';
$myScript = array_merge($myOutputScript, $myScript);
$this->setHeadData(array('scripts' =>$myScript));
?>スタイルシートも同様に以下のようにすれば可能です。
<?php
$myHead = $this->getHeadData();
$myStyleSheets = $myHead['styleSheets'];
$myOutputStyle['/templates/mytemplate/css/mystyle.css'] = array('mime' => 'text/css', 'media' => 'screen', 'attribs' => array());
$myStyleSheets = array_merge($myOutputStyle, $myStyleSheets);
$this->setHeadData(array('styleSheets' => $myStyleSheets));
?>Joomla!1.5では、パラメータの保存やランゲージファイルにINIファイルが使われています。
ここでふと気づいたのですが、ランゲージファイルは問題ないでしょうが、パラメータは見られては困るものも出てくるのではないでしょうか。テンプレートのパラメータくらいなら重要な値は無いでしょうが、もしかすると今後エクステンションで重要な値を保存する際にINIファイルを利用するものが出てくるかもしれません。
試しにお使いのテンプレートのparams.iniにアクセスしてみてください。
http://yoursite.com/templates/yourtemplate/params.ini
もう対策されている方もおられるでしょうが、以下のような書き方でhtaccessファイルに追加すると指定したファイルは外部からアクセスできないようにすることができます。
<Files ~ "\.(htaccess|dat|log|csv|ini|xml)$">
Deny from all
</Files>
ついでにdat, log, csv, xmlも追加してみました。
Joomla!1.5では、パラメータをINIファイルに保存したりPHPファイルとして保存したりするメソッドが用意されています。それを使えば作成・保存はもちろんのことパラメータの呼び出しも楽にできるようになっています。その反面それを見せたくないパラメータとして保存しているならば、外部から見ることができないようにすることも大事だと思います。
Joomla!というより一般的なことですが、Joomla!1.5ではデフォルトで利用されているので書いてみました。
Joomla!1.5でエラーページをどうにかしたいと検索していたら、forum.joomla.orgに投稿を見かけたので・・・。
以下のように説明されていました。phpファイルをincludeと説明にはありましたが、わかりやすいようにHTMLを直接書くように変更しました。元ネタはこちら。
root/templates/あなたが使っているテンプレート/error.php
を設置します。
<?php
switch ($this->error->code) {
case '404':
?>
ここに好きな404用HTML
<?php
break;
case '500':
?>
ここに好きな500用HTML
<?php
break;
case '403':
?>
ここに好きな403用HTML
<?php
break;
default:
?>
ここに好きなデフォルトHTML
<?php
break;
}
?>
ちなみにサイトのホームURLへのリンクは、以下のように書けばOKです。
<a href="/<?php echo $this->baseurl; ?>" title="HOME">戻って</a>
オーバーライドって便利ですね。
Joomla!1.5は、大抵のことがエクステンションを作成せずともできそうな感じですね。テンプレートにパラメータをエクステンションのように割り当てることができるので自由度の高いそれだけでアプリケーションとも言えそうなテンプレートができそうですね。
以前からテンプレートの開発を数多くされているところのテンプレートを見るとJoomla!1.0.xのものであってもメニューを独自にテンプレート内で作成したりして大変参考になったりでしたが、Joomla!1.5ではもうひとつ考え方を変えなきゃならないようです。でも、まだフリーのテンプレートは数少ないみたいですね。