第四回は、メニューで設定したクラス接尾辞をテンプレートで利用してみます。
ページ毎(メニュー毎)にクラスの値を変えたり表示を変更するのは、$Itemid(メニューID)を下記のように取得すれば良いことをご存じの方は多いと思います。
$Itemid = JRequest::getInt('Itemid');これで取得したメニューIDでモジュールを表示したり、非表示にすることは、Joomla!1.0.xからも、普通に今まで行ってきました。ですが、これだとクラスの値だけをページ毎に設定したくてもコンテンツなどには、接尾辞は反映されるが、テンプレートまでは来ません。
そこで以下のようにしてメニューで設定したクラス接尾辞をテンプレートで利用できるようにしました。
$Itemid = JRequest::getInt('Itemid');
$pageclass_sfx = '';
if($Itemid > 0){
$menu = &JSite::getMenu();
$params = & $menu->getParams($Itemid);
$pageclass_sfx = $params->get('pageclass_sfx', '');
}
$this->params->set('pageclass_sfx', $pageclass_sfx);こうすることで、通常テンプレートのパラメータ(設定値)を得るように
$this->params->get('pageclass_sfx');で現在のメニューで設定した、クラス接尾辞が得られます。$Itemidで分岐してやることと大きな差はありませんが、最初に上記のコードを書いておく事で面倒な複数の分岐処理を書く必要がなくなります。
全く同じようにする必要はありませんが、何かの足しにはと・・・。
言われてみればその通り、関連記事モジュールには表示件数の制限が無いためたくさんヒットしたらそのまま表示されてしまいます。考えてみればこのサイトではそれだと見た目も悪くなるし、少し内容も表示したかったのでオリジナルの関連記事モジュールを作成したことを忘れていました。
とりあえず、表示件数の制限をつけることくらいは簡単なのでHackか、テンプレートでやっちゃえば簡単です。
まずは、Hackなら
$db->setQuery($query);
を
$db->setQuery($query, 0, 20);
のように、最初(0)から20個の記事というように20の部分に表示最大件数を入れます。自由に設定できるようにしたい場合は、
$db->setQuery($query, 0, intval($params->get('limit', 20)));
のようにし、xmlファイルのパラメータ部に
<param name="limit" type="text" size="3" label="最大件数" description="" />
などと追加すればバックエンドで最大件数が設定できるようになります。
ではテンプレート側でやるには
mod_related_items/tmpl/default.phpとindex.htmlを、使っているテンプレートフォルダ/html/mod_related_itemsにコピーします。そしてコピーしたdefault.phpを編集します。
<?php foreach ($list as $item) : ?>
を
<?php
$i = 0;
foreach ($list as $item) :
if($i > 20){
break;
}
$i++;
?>のようにすればOKです。
本体をHackする方法だとアップデート時に、忘れていたりしてかなり面倒になってきたりしますので、それを考慮にいれるとテンプレート側で対応する方法を行った方が良いかもしれません。
Fireboardのログインの件でJoomla!じゃぱんのフォーラムに投稿
しましたが、もう少しコードを変えてみます。
ROOT/components/com_login/login.php の22行目あたり...
コード:
global $mosConfig_live_site, $mosConfig_frontend_login, $mosConfig_db;
をコード:
global $mosConfig_live_site, $mosConfig_frontend_login, $mosConfig_db, $Itemid;
に。
同じく38行目あたりを..コード:
$params->def( 'login', $mosConfig_live_site );
をコード:
if($Itemid == あなたの飛ばしたいメニューID番号){
$params->set('login', sefRelToAbs('index.php?option=com_fireboard&Itemid=あなたの飛ばしたいメニューID番号'));
} else {
$params->def( 'login', $mosConfig_live_site );
}などとすれば可能なようです。
まずは、ROOT/components/com_fireboard/template/default/plugin/profilebox/profilebox.phpの110行目あたり
これは、もしかするとコミュニティビルダーなどのプラグインの使用状況により位置がことなるかもしれません。
(うちの環境ではプラグインは使用していません。)
else
{
$loginlink = sefRelToAbs('index.brush:php;?option=com_login&Itemid=' . $Itemid);
?>
を
else
{
$returnfunc = empty($func) ? '' : '&func='. $func;
$returnid = (int)$id ? '&id='. (int)$id : '';
$returncat = (int)$catid ? '&catid='. (int)$catid : '';
$returnlimit = (int)$limit ? '&limit='. (int)$limit : '';
$returnlimitstart = (int)$limitstart ? '&limitstart='. (int)$limitstart : '';
$returnQuery = $returnfunc. $returnid. $returncat. $returnlimit. $returnlimitstart;
$loginlink = sefRelToAbs('index.brush:php;?option=com_login&Itemid=' . $Itemid. $returnQuery);
に変更し、さらにROOT/comoponents/com_login/login.phpの38行目あたり
else
{
$params->def( 'login', $mosConfig_live_site );
を
if($Itemid == あなたのFireboardのmenuID){
$rtemp = mosGetParam($_REQUEST, 'func');
$returnfunc = $rtemp ? '&func='. $rtemp : '';
$rtemp = mosGetParam($_REQUEST, 'id');
$returnid = (int)$rtemp ? '&id='. (int)$rtemp : '';
$rtemp = mosGetParam($_REQUEST, 'catid');
$returncat = (int)$rtemp ? '&catid='. (int)$rtemp : '';
$rtemp = mosGetParam($_REQUEST, 'limit');
$returnlimit = (int)$rtemp ? '&limit='. (int)$rtemp : '';
$rtemp = mosGetParam($_REQUEST, 'limitstart');
$returnlimitstart = (int)$rtemp ? '&limitstart='. (int)$rtemp : '';
$returnQuery = $returnfunc. $returnid. $returncat. $returnlimit. $returnlimitstart;
$params->set('login', sefRelToAbs('index.brush:php;?option=com_fireboard&Itemid=あなたのFireboardのmenuID'. $returnQuery));
} else {
$params->def( 'login', $mosConfig_live_site );
}
?>
のように変更すれば、ログイン後表示していた記事に戻れます。
Joomla!のエクステンションで一番簡単に作成できるのがモジュールだと思います。もちろん、複雑な処理をするものも作成できるのですが簡単なものならすぐにできます。簡単なモジュールを作ってみましょう。
用意するもの
<h1>Joomla! Module</h1>と出力するだけのmod_example.phpを作成します。
(右ができあがりイメージ)
1.テキストエディタで新規作成し、適当な場所にmod_example.phpと名前をつけて(UTF-8のBOMなし)で保存してください。
2.1.と同様mod_example.xmlを作成してください。
3.現在あるモジュールを開いてみる。たとえば、mod_latestnews.phpを開く。
目につくのは、
// no direct access
defined( '_VALID_MOS' ) or die( 'Restricted access' );
これは、直接このファイルにアクセス(http://yoursite.com/modules/mod_latestnews.php)してもこのファイルを見ることができないようにします。これは必要です。
作成したmod_example.phpに
<?php
// no direct access
defined( '_VALID_MOS' ) or die( 'Restricted access' );?>
と書きます。コピーペーストでOK。
4.?>の後で改行して
<h1>Joomla! Module</h1>
と書きます。
5.mod_examlple.xmlにmod_latestnews.xmlの内容をすべてコピーします。
(コピーが一番簡単に作成できる方法です。)
変更必須のところ
ここだけです。他は、名前が重複したりしても構わないならそのままでOK。
<filename module="mod_example">mod_example.php</filename>
モジュール名を考えるとき(プラグインもコンポーネントも同じ)大文字を使わないでください。大文字を使っても呼び出されるのは、小文字の名前で呼び出されます。
6.完成しました。え!
mod_example.php
<?php
// no direct access
defined( '_VALID_MOS' ) or die( 'Restricted access' );?>
<h1>Joomla! Module</h1>
mod_example.xmlは、mod_latestnews.xmlの内容を一行変更しただけ。
<filename module="mod_example">mod_example.php</filename>
7.作成したmod_example.phpとmod_example.xmlをそのままzip圧縮します。
(二つのファイルを選択して圧縮)
8.インストールして公開。
xmlファイルのname部分を変えていないのでlatest newsという名前のモジュールが二つあるはずです。公開されていない方が今回作成したmod_exampleなので注意してください。
今回はmod_latestnewsをそのまま流用しましたが、パラメータの受け渡しを説明したかったからです。
インストールしたmod_example.phpの<?php ~ ?>の間に下記の行を加えてください。
var_dump($params);
ページを開くとどのようにパラーメータが保持されているかわかります。
パラメータ(設定値)を呼ぶ。
$params->get( 'パラメータ名', デフォルト値 );
または、
$params->get( 'パラメータ名' );
など。
パラメータの指定方法は、xmlファイルをみればわかるでしょう。
今回は、ただ出力するだけのものを作成してみました。 う~んこれなら1分て書いても良かったかな。