Home日記コラム書評HintsLinks自己紹介
 

Hints: Xoops

※このページは未完成なので、期待しない方が吉。 内容も少し古いし。

XOOPS Cube install (Windows)

XOOPS コアモジュールの最新版をダウンロードする。 XOOPS Cube 公式サイトの左側のメニューの ドキュメント をクリックすると、 子メニューが表示されて ダウンロード という項目が出てくるので、 それをクリックする。

最新版をダウンロードして、 展開する。 docs、extras、html、の3つのディレクトリが入っている。 この中の、docs ディレクトリに、 INSTALL.html と INSTALL.ja.html というファイルがある。 それぞれ英語、日本語のインストール手順を書いたドキュメントなので、 事前にチェックしておくといい。

インストールはウィザード風の画面で、 ブラウザで操作するので、特に操作上の問題はないと思う。 ただし、事前に Apache と、MySQL、PHP をインストールしておく必要がある。

手順通りにインストールしたら、 最初の画面には、

Notice [PHP]: Only variable …

という Notice が山のように表示されていると思う。 これは正しくインストールされている状態なので、 気にしなくていい。

インストールに成功したら、 まず、次の2つの作業を行う必要がある。

!.
html ディレクトリの下にある、 install というディレクトリを削除する。

2.
html ディレクトリの下にある、 mainfile.php というファイルを書き込み禁止の状態にする。

この作業を忘れると、 最初に管理者でログインしたときに警告が表示される。 これらは、 セキュリティ的に非常に重要なので、 外部のネットワークに公開する場合は必ず行うこと。

管理メニューの 一般設定 を選択する。 18番目あたりに、 「デバッグモードを有効にする」 という項目がある。 インストール直後の状態では、 PHPデバグ が選択されているはず。 これを「オフ」にすれば、例のメッセージは出なくなる。 変更したら、 画面の最後の方に出てくる [送信] ボタンを押して、変更を保存しておくこと。

あとは、モジュールをどんどんインストールして動作を試してみるといい。 システム管理の画面から [モジュール管理] を選択するのだが、 パッと見てもインストール方法が分からないかもしれない。 操作という欄に表示されている 左側のアイコンをクリックすればインストールできるようになっている。 なお、右側のアイコンをクリックすると、 モジュールの簡単な説明が別ウィンドウに表示される。

あまり XOOPS を一人で使うことはないと思うが、 一人で使うにしても、ユーザー登録はしておいた方がいい。 基本的に、 管理者権限はシステムを設定・管理するときのみ使うもので、 普段の投稿は別のユーザーアカウントを使うのがいい。

ユーザーの登録は、 ユーザー管理画面から、 新規アカウント作成を選択する。 とりあえず、 ユーザー名、メールアドレス、パスワードを入力すればユーザーは登録できる。

(under construction)

インストール (Windows)

※以下の内容は古いです

Apache、PHP、MySQL はインストールされている前提とする。

Note

Apache 2 を使用している。 2004年5月時点で、 Apache 2 で PHP を使うのはまだリスキーらしいが、 とりあえず動作上の問題はなさそうだ。

http server のドキュメントのどこかに html の下をまるごとコピーして、 index.php を実行すると、 初回はインストール画面が表示される。 ただ、 インストール時に文字化けして訳が分からない。

Xoops_01

これは、 Xoops のインストーラーが http のヘッダーで charset を出力しないことがあるためのようだ。 インストールページは EUC で書かれているので、 Apache のデフォルトが EUC になっていれば、 このページは多分うまく表示される。 Apache は、http header の charset が指定されていない場合、 httpd.conf で設定されているデフォルトの charset を出力するらしい。 HTML の内部で META タグで指定されている charset は無視している (HTML としてはそのまま出力するが、http のヘッダーをそれに合わせるようなことはしない)。 ブラウザの「ページ情報」で確認すれば、 ページの文字コードが s-jis で、 なおかつ META 情報が EUC となっていることが分かる。 なぜか、 インストールが完了した後のページの大部分は、 Xoops の処理によって http header の charset が指定されているので、 画面は文字化けしない。

この文字化けを防ぐために、とりあえず、 html\install\index.php の、

///// main

という行の後に、

if (!headers_sent()) {
	header ('Content-Type:text/html; charset='._CHARSET);
	header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
	header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
	header('Cache-Control: no-store, no-cache, must-revalidate');
	header("Cache-Control: post-check=0, pre-check=0", false);
	header("Pragma: no-cache");
}

という8行を追加しておくと、 読める画面になる。

Xoops_02

後は適当にクリックしていけばインストールできるのだが、 データベースの設定の所。

Xoops_03

データベースサーバのホスト名は、 同じpcでMySQL を動かしているのなら localhost のままでいい。 これに対して、 XOOPSへのURLは、 LAN内の他のpcから使いたい場合には、 このpcをアクセスするためのURLを指定する。 例えばこのpcにxoopsserver という名前が付いていて、 httpd (apache など) の Document root が「/」なら、 http://xoopsserver/ のように指定する。 あるいはIPを直接突っ込んで、 http://192.168.0.16/ のようにしてもいい。 ここが localhost だと、他のマシンからこのページをアクセスしたときに、 リンクが http://localhost/ほげほげ… となってしまって、困ったことになる。 画面例は localhost となっているが、これは固定アドレスを持たないpc上でのみ使い、 他から使わないという前提であえてそうしてある。

データベースユーザ名、 データベースパスワードは、 MySQLの GRANT でユーザーを作っておき、それを指定する。 セキュリティがアレなので、画面では隠してあるが、 例えば mysql というユーザーで、パスワードを honyarara、みたいな感じにしておく。 データベース名も同様に隠してあるが、 とりあえず他と衝突しなければ何でもいいはず。

その他は何か警告っぽい表示があっても、 指示に従って処理していけば、 巷で言われているように、 5分でインストールは完了する。

Xoops_01

もっとも、これでログインしたら、 一瞬こんな表示が出たりして、 どへー、という状態ではあるが。

Xoops_01

こんなの気にしないから放置しておく、 というのも現実的な正しい解決策だと思うが、 自分的には、何かこういうのイヤだから、 functions.php に、 こんな関数を追加してみた。

function xoops_send_headers_if_unsent()
{
    if (!headers_sent()) {
        header ('Content-Type:text/html; charset='._CHARSET);
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header('Cache-Control: no-store, no-cache, must-revalidate');
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");
    }
}

そして、 functions.php で定義されている redirect_header の定義の最初 (global の次の行あたり) に、

    xoops_send_headers_if_unsent();

という1行を追加する。 これで、例の画面は文字化けしなくなる。 しかし、 こんな所を安易に変更すると影響が大きすぎるので、 間違いなく、こういうことをしてはいけない罠。 しかも、まだ文字化けする処理はあるので、 Xoops、侮りがたし。みたいな?

本来は、http ヘッダーを送るという処理が一箇所に集められていて、 必ず1度だけ呼ばれるようなプログラムになっていなければならないのだが、 PHP はよく分からん。 というか Xoops か。

モジュールの作成

配置

Xoops の ルートに modules というディレクトリがある。 この下に、ディレクトリを作成し、 さらにそこにナニを全部突っ込めば桶。

モジュールを作るにあたって、 いちいち一から作るのは面倒なので、 雛形になるモジュールを作ることにした。

この種のモジュールは template という名前を付けたいものだが、 Xoops が template を特別な意味に使っているため、 混乱を避けるために sample という名前にすることにした。

まず、 modules ディレクトリの下に sample というディレクトリを作る。 このモジュールは次のような構成にした。

 modules
  +-- sample
       +-- header.php
       +-- index.php
       +-- language
       |    +-- english
       |    |    +-- index.html
       |    |    +-- main.php
       |    |    +-- modinfo.php
       |    |
       |    +-- index.html
       |    +-- japanese
       |         +-- index.html
       |         +-- main.php
       |         +-- modinfo.php
       |
       +-- templates
       |    +-- contents.html
       |    +-- index.html
       |
       +-- xoops_version.php

index.php

<?php
include "header.php";
include XOOPS_ROOT_PATH."/header.php";
echo 'Test page';
include XOOPS_ROOT_PATH."/footer.php";
?>

ポイントは、 XOOPS_ROOT_PATH."/header.php";XOOPS_ROOT_PATH."/footer.php";include すること。 header.php は、 XOOPS_ROOT_PATH.'/class/xoopsblock.php';require_once しているだけのように見えるのだが、 とりあえず気にしない。

フォームの作成

モジュールの画面表示内にフォームを作る。 基本的には、次のような手順になる。

 modules
  +-- sample
       +-- functions.php
       +-- header.php
       +-- index.php
       +-- language
       |    +-- english
       |    |    +-- index.html
       |    |    +-- main.php
       |    |    +-- modinfo.php
       |    |
       |    +-- index.html
       |    +-- japanese
       |         +-- index.html
       |         +-- main.php
       |         +-- modinfo.php
       |
       +-- sampleform.php
       +-- sql
       |    +-- index.html
       |
       +-- templates
       |    +-- contents.html
       |    +-- index.html
       |
       +-- xoops_version.php

0. XOOPS_ROOT_PATH."/class/xoopsformloader.php" を include しておく。 ここにフォームを扱う関数が定義されている。 inlude_once を使ってどこかで読み込んでおけばいい。

1. class XoopsForm* を使って、フォームの部品のインスタンスを生成する。

2. class XoopsThemeForm のインスタンスを生成する。 ここに 1. で作った部品を突っ込む。 addElement メソッドを使えばよい。

$変数1 = new XoopsFormほげほげ(…);
$変数2 = new XoopsFormほげほげ(…);
    …
$form = new XoopsThemeForm(…);
$form->addElement($変数1);
    …

エレメントの作成は、 エレメント作成API を。

フォームにエレメント(フォームを構成する各部品)を追加するには、 addElement を呼び出す。

こうやって作ったエレメントをフォーム内に配置するには、 addElement メソッドを使う。

XoopsForm::addElement

引数内容
$formElement object & XoopsFormElement への参照を指定する。
$required bool 入力必要なフィールドなら true を指定する。 省略した場合は false を指定したことになる。

処理の流れ

既存のモジュールを見た感じでは、 index.php は基本的に次のような構造になる。

index.php
  include header.php
  include /header.php
  // 処理
  include /footer.php

header.php というのは、最初、ページとかブロックのヘッダー部分を表示するのかと思ったのだが、 どうもそうではないような感じがする。 むしろ、前処理というか、 プログラムのコードの最初に include するヘッダーというニュアンスで、 こういう名前になっているのかもしれない。

footer.php は、このモジュールが実際に画面に表示する処理になる。

header.php では mainfile.php を include している。 この中で他のソースを include しまくっているので、 多分このあたりで訳が分からなくなる筈。 条件によって include されるファイルが微妙に変化するが、 おおむね次のような感じで読み込まれる。

/module/{module.php}/index.php
  include header.php
    include /mainfile.php
      include /include/common.php
        include /class/errorhandler.php
        include /class/logger.php
        include /include/functions.php
        require /class/database/databasefactory.php
        require /kernel/object.php
        require /class/criteria.php
        include /class/module.textsanitizer.php
        include /include/version.php
        include /language/$xoopsConfig['language']/global.php
        include /language/$xoopsConfig['language']/$xoopsOption['pagetype']

        $HTTP_POST_VARS['xoops_login'] がセットされていない場合
        include /include/checklogin.php

        $HTTP_POST_VARS['xoops_login'] がセットされている場合
        include /class/template.php
        include /modules/$xoopsModule->getVar('dirname')/language/$xoopsConfig['language']/main.php
        include /language/$xoopsConfig['language']/global.php
        include /language/$xoopsConfig['language']/$xoopsOption['pagetype'].php

Xoops のコードの最大の欠点がこの include の多用ではないか。 include 自体は別に構わないと思うのだが、 使い方がいまいちなのでは。 ある include で生成したインスタンスが他の include の中で使われるような書き方がされていて、 「このインスタンスはどこで生成されたのだろうか?」というのが分からない。 生成された所が分からないということは、 どのような設定になっているか(したらよいか)、 使っている時点で分からない。 これはオブジェクト指向的でないばかりか、 構造化もされていないということになってしまい、 可読性を著しく下げる原因になっていると思う。

もっとも、こういう書き方が好きだという人がいることも否定しない。 実は最初、Xoops のコードを見た時に、 N88BASIC のコードを思い出したりした。

参考サイト

XOOPS日本公式サイト
公式サイトのフォーラム
Xoops2.0.6-ja : メインページ
日本語のAPIマニュアル。但し、殆ど英語のままだし、殆ど解説はないと思った方がよい。公式サイトはどこだ?