スタッフブログ
TOKYOPenはもともとXOOPS Cube Legacy2.1系をベースに開発されたホダ塾ディストリビューションがベースになっているため、それほど苦労することなくアップグレードできました。
いくつか発生した問題をメモ的にかいておきますと
・日本語がEUC-JPで直書きされてて文字化け→文字コード変換
・Smartyプラグインが見つからなくて真っ白→html/class/smarty/pluginに追加してたプラグインをxoops_trust_path/libs/smartypluginsへ移動
というあたりがメインでしたね。
TOKYOPenは自分たちで開発してるので、できて当たり前といえば当たり前ですが、エラーメッセージを見ながらひとつひとつ対処してけばちゃんと動くようになってよかったです。
・TOKYOPen
先週開催されたXOOPS Cubeサタデーラボでデモを少しみなさんに見てもらったのですが、わりと好評だったようで、さらに開発がんばっていこうとおもってるところです。
このTOKYOPenについての情報は主にfacebookやtwitterで公開することが多いと思いますので、是非facebook, twitterもチェックしてくださいね。
・TOKYOPen facebookページ
・TOKYOPen twitter
今回、ご紹介するのは自転車レビューサイトの「サイクルベース名無し」です。
サイクルベース名無し:自転車レビューサイト
→ http://cbnanashi.net/cycle/
日本最大のユーザー参加型自転車レビューサイト。サイクルパーツ・ウェア・ツールなどの使用感・インプレが投稿されています。
使われているモジュール
about : pico
→ http://xoops.peak.ne.jp/md/mydownloads/singlefile.php?lid=111
パーツレビュー、お知らせ、など汎用的に利用: newbb
→ http://xoopscube.jp/module/261
Contact: inquirysp
→ http://www.xugj.org/modules/mydownloads/singlefile.php?cid=1&lid=2
あなたのパーツ見せてください!: myalbum
→ http://xoops.peak.ne.jp/md/mydownloads/singlefile.php?lid=61
今回、ご紹介するのは杉並区役所運営の「すぎなみ子育てサイト」です。
すぎなみ子育てサイト
http://www.suginami-kosodate.jp/xoops/
使われているモジュール
子育てNAVI・特集・カラムなど: pico
→ http://xoops.peak.ne.jp/md/mydownloads/singlefile.php?lid=96&cid=1
掲示板: yybbs
→ http://www.kuri3.net/modules/mydownloads/singlefile.php?cid=2&lid=11
食育: weblog(d3blog)
→ http://www.kuri3.net/modules/mydownloads/singlefile.php?cid=1&lid=30
区からのお知らせ: bulletin
→ http://xoops.peak.ne.jp/md/mydownloads/singlefile.php?lid=106
サイト更新情報: whatsnew
→ http://linux.ohwada.jp/modules/wfdownloads/singlefile.php?cid=1&lid=77
イベントカレンダー: piCal
→ http://xoops.peak.ne.jp/md/mydownloads/singlefile.php?lid=89&cid=1
お問い合わせ: liaise
→ http://linux.ohwada.jp/modules/wfdownloads/singlefile.php?cid=1&lid=74
サイトマップ: sitemap
→ http://xoops.peak.ne.jp/md/mydownloads/singlefile.php?lid=90&cid=1
熱心な参加者の皆さんにささえられて、今度の土曜(2011/07/23)で第17回目になるXOOPS Cubeサタデーラボですが、facebookページがあるのご存知ですか?
けっこう前につくってたんですが、ryus.co.jp でお知らせするのをすっかり忘れてました(^^;
■Facebookでサタラボ最新情報を入手しませんか?
ちょっと今回は実験的に参加申込もfacebook ページからできるようにしてみました。
# 今回は更に実験的に、ATNDでも受け付けてます。
どこでもお好みの方法で申込していただければと思ったんですが、あちこちで申込できるとかえってどこで申込したらいいか迷いますかね?
XOOPS Cubeにありそうでなかった機能の一つが、「モジュール一括アップデート」機能です。 モジュールのアップデートを行うとなると、個々のモジュールのアップデートページで ひとつひとつ対応していくことになります。 決まった作業なのに、手作業とは手間ですね。 そこで、モジュールアップデート作業を自動で処理できるようなプラグイン(プリロード)を作りました。
RapidModuleUpdateは、モジュール一括アップデート機能をモジュール管理に追加するプラグイン(プリロード)です。 まずは、そのでも動画をごらんください。30秒で終わります。
このように、RapidModuleUpdateは複数のモジュールアップデート作業を自動化し、なんとも手間いらずです。
インストールの方法も簡単です。FTPでRapidModuleUpdate.class.phpを/preloadフォルダに置くだけで完了です。 あとは、管理者権限でログインして、「モジュール管理」を開いてみてください。 上の動画にあったような一括アップデートのチェックボックスが出ているはずです。
mainfile.phpはXOOPSの設定ファイルで、XOOPSのパスやデータベースのアカウント情報などが書かれています。これらの設定情報は、当然 環境に依存しています。
開発フローを、開発→ステージング→プロダクションという流れでやる場合、同じサイトが少なくとも3つ以上できてしまいます。そうすると、mainfile.phpも複数できあがるわけです。ところが、XOOPS Cube Legacyはサイトプロフィールという概念がないため、mainfile.phpの取り扱いは悩ましいものがあります。(他のCMS、Drupalなどではあると聞いています。)
複数のmainfile.php問題を解決する方法はいくつか考えられます。
1. どの環境もそっくりの環境にする
XOOPS_ROOT_PATHなどはdirname(__FILE__)で解決し、データベースのアカウント情報はどのサーバでも共通のものにするという手法です。 ただ、この方法だとチームで開発に取り組む場合、あまりうまくいきません。SVNで管理しているサイトだと、お互いのmainfile.phpを上書きしあう心配があります。
2. mainfile.phpはSVNで管理しない
mainfile.phpは環境依存が強いため、SVNでは管理しないようにしておく方法があります。こうしておくと、チームでお互いのmainfile.phpを上書きする心配もありません。ところが、この方法では、リポジトリにmainfile.phpがないのが欠点になります。mainfile.phpが無いので、チェックアウトしてきても直ぐに動かせません。また、そのサイト全体で使われている定数をmainfile.phpに書いておくことがありますが、定数をいちいち手動で追加しなければなりません。(本来、環境依存ではない定数は、/settings/definition.phpに書くべきですが。)
そこで、今回紹介するのは、mainfile.phpをサイトごとに切り替える方法です。
まず、サイトごとのmainfile.phpを適当に名前を変更して、settingsの下に置きます。 例えば、今ローカル環境にあるmainfile.phpは開発環境なので、名前をmainfile.dev.phpに変えて、settingsに移動します。
. ├── mainfile.php ├── settings │ ├── mainfile.dev.php │ ├── mainfile.stag.php │ └── mainfile.prod.php (略)
次に、XOOPS_ROOT_PATHに空のmainfile.phpを作り、そこに下のコードをコピペします。
<?php require XoopsProfiler::getProfile(); class XoopsProfiler { // ホスト名 => ファイル名 protected static $map = array( 'suinasia.local' => 'mainfile.dev.php', // 開発 'stag.suin.asia' => 'mainfile.stag.php', // ステージング 'suin.asia' => 'mainfile.prod.php', // プロダクション ); public static function getProfile() { $xoopsRootPath = dirname(__FILE__); $serverName = $_SERVER['SERVER_NAME']; $ds = DIRECTORY_SEPARATOR; if ( !isset(self::$map[$serverName]) ) { trigger_error("Profile not found."); die; } $mainfile = self::$map[$serverName]; $path = $xoopsRootPath.$ds.'settings'.$ds.$mainfile; return $path; } }
あとは、$map配列のところを適宜書き換えるだけです。 配列のキーはホスト名で、値はそのホストで使うmainfile.phpになります。
上のコードを少し書き換えれば、開発環境でも複数のデータベースを簡単に切り替えたり、いろいろ応用できると思います。
今回JavaScriptネタが思い浮かばなかったので普通のPHPネタです。
個人的にXOOPS管理画面の一般設定で設定完了後に良く分からないページに飛ばされるのがムカついたので、ちょっと弄って元のページにリダイレクトするようにしてみました。
{XOOPS_ROOT_PATH}/modules/legacy/admin/actions/PreferencesEdit.class.php を開いて以下の様に置き換えます。
line 304
$controller->executeForward("./index.php?action=PreferenceList");
include_once XOOPS_ROOT_PATH . "/include/cp_functions.php";
$controller->executeRedirect("./index.php?action=PreferenceEdit&confcat_id=" .xoops_getrequest('confcat_id'), 2, '設定を完了しました');
line 352
$controller->executeForward(XOOPS_MODULE_URL . '/' . $this->_mMaster->mModule->get('dirname') . '/admin/');
include_once XOOPS_ROOT_PATH . "/include/cp_functions.php";
$controller->executeRedirect("./index.php?action=PreferenceEdit&confmod_id=" .xoops_getrequest('confmod_id'), 2, '設定を完了しました');
好みによりますが、これで多少快適にXOOPS使えるようになるんじゃないかなー。
XOOPS Cube Legacyの互換モジュールでは、
以下のプリファレンスがメニューに表示されません。
・禁止用語設定
・検索オプション
・メール設定
XOOPS2のころは、上のプリファレンスもメニューに表示されていたはずなのですが…。
XOOPS2に慣れていると、XOOPS Cube Legacyの「XOOPSコンフィグ」が目に入ってこないものです。
そこで、XOOPS2っぽいメニュー表示をするプリロードを作ってみました。
使い方
・こちらからプリロードを入手します。
・Xoops2StyleMenu.class.phpをpreloadフォルダに入れます。
・管理権限でログインするとメニューの表示が変わっています。
Before | After |
主にJavaScriptを使ってXOOPSサイトとプチカスタマイズしてみよう の第3回です。
今回はブロック管理をちょこっとカスタマイズしてみようと思います。
XOOPSのブロック管理画面は通常、表示設定がされているブロックが全て一覧で出てくると思いますが、これを表示されるモジュール毎にフィルタリングが出来るようにしてみたいと思います。
あまり使ったことがないのですが、XOOPS2にはそんな感じの機能がデフォルトであるらしいですね。
※今回のはlegacyモジュールや、themes/adminの下を弄ったりする為XCLをアップデートする際注意が必要になるかもしれません。
JavaScriptだけでやるには色々データが足りないので、まずブロック一覧が表示されるページのプログラムを弄ります。
XOOPS_ROOT_PATH/modules/legacy/admin/actions/BlockListAction.class.phpの89行目にある、executeViewIndexアクションを以下のように置き換えます。
function executeViewIndex(&$controller, &$xoopsUser, &$render)
{
$render->setTemplateName("block_list.html");
foreach (array_keys($this->mObjects) as $key) {
$this->mObjects[$key]->loadModule();
$this->mObjects[$key]->loadColumn();
$this->mObjects[$key]->loadCachetime();
$this->mObjects[$key]->loadBmodule();
}
//
// Build active modules list and set.
//
$handler =& xoops_gethandler('module');
$moduleArr[0] =& $handler->create();
$moduleArr[0]->set('mid', -1);
$moduleArr[0]->set('name', _AD_LEGACY_LANG_TOPPAGE);
$moduleArr[1] =& $handler->create();
$moduleArr[1]->set('mid', 0);
$moduleArr[1]->set('name', _AD_LEGACY_LANG_ALL_MODULES);
$criteria =& new CriteriaCompo();
$criteria->add(new Criteria('hasmain', 1));
$criteria->add(new Criteria('isactive', 1));
$t_Arr =& $handler->getObjects($criteria);
$moduleArr = array_merge($moduleArr, $t_Arr);
$render->setAttribute('moduleArr', $moduleArr);
$render->setAttribute("objects", $this->mObjects);
$render->setAttribute("pageNavi", $this->mFilter->mNavi);
//
// Load cache-time pattern objects and set.
//
$handler =& xoops_gethandler('cachetime');
$cachetimeArr =& $handler->getObjects();
$render->setAttribute('cachetimeArr', $cachetimeArr);
$render->setAttribute('actionForm', $this->mActionForm);
}
次に、XOOPS_ROOT_PATH/themes/admin/modules/legacy/block_list.htmlの23行目辺り(formタグの上)に以下のコードを貼り付けます。
<select id='module_filter'>
<{xoops_optionsArray from=$moduleArr value=mid label=name}>
</select>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript">
$("#module_filter").change(function() {
var mid = new RegExp(" " + $(this).val() + " ");
$("form table.outer tr").each(function() {
if ($(this).attr('bmids')) {
console.log($(this).attr('bmids').match(mid));
($(this).attr('bmids').match(mid)) ? $(this).show() : $(this).hide();
}
});
});
</script>
これで、ブロック管理ページで以下の画像のように表示先のモジュールでフィルタリングができるようになります。