ドキュメント

プログラマから見たMoodle(ムードル)

弊社が「Moodle moot 2010 Hakodate」にて発表したテーマです。

執筆者

株式会社VERSION2 代表取締役 大西昭夫

1. VERSION2の自己紹介

2007年に独立し株式会社VERSION2を起業。

その年の後半に札幌学院大学、Don Hinkelman先生の依頼でコースフォーマットの開発を行う。札幌学院大学、はこだて未来大学のMoodle(ムードル)の開発/カスタマイズを経験。

会社としては、コースフォーマット、モジュール、ブロック、問題タイプ、本体のカスタマイズと、Moodle(ムードル)のほぼ全ての機能の開発・カスタマイズ経験あり。

現在は社内の優秀な技術者にお任せ。

2. Moodle(ムードル)の動作原理

Doc201002_02_img01

Moodle(ムードル)はホームページと同じ原理

HTMLでページを構成し、入力された値や各種ファイルをサーバーに保存したものを表示しています。

PHP、データベース(DB)

PHPとは、HTMLをプログラムで生成するためのスクリプト言語です。
DBとは、色々なデータを記録して検索や更新を行うことができるプログラムです。

3. Moodle(ムードル)の内部構造

Moodle(ムードル)の本体は巨大なライブラリの固まりで構成されています。

Moodle(ムードル)ライブラリ

  • ユーザー管理/認証
  • DB管理
  • ファイル管理
  • HTML生成
  • メディアプレイヤー

など、様々ライブラリーが用意されているので、それらをMoodle(ムードル)カスタマイズをする。

コースフォーマット
モジュール
ブロック
問題タイプ
バックアップ・リストア
管理者
言語

4. Moodle(ムードル)のプログラム構造

MVCではなく、1ページ1スクリプト構成

  • MVCとはModel, View, Controllerの頭文字で、基本プログラムの上で処理と画面表示を別々に行う最近のWebアプリでは常識となっている構造=管理や制作が効率的である。
  • それに対しMoodle(ムードル)はスクリプトの中でほとんど全ての処理を行う必要があるため、煩雑なプログラムになってしまう。

クラス化は一部のみで、大半が関数

  • クラス化されていると本体の上書きをすることができる。
  • 関数のため、本体にある機能を変更したい場合は本体を直接書き換える必要があるため、バージョンをあげた際に変更した部分が元に戻ってしまう。=アップデートできない。

5. MVCとMoodle(ムードル)の構造の比較

Doc201002_04_img01

6. Moodle(ムードル)のモジュール開発方法

  • 既に開発されているプログラムをコピーして改良していくというのがよくある手法。
  • 基本的なライブラリ情報のドキュメントは特に公開されていない。(利用されている関数を追って調べる必要がある。)
  • そのためプログラムのコードを1つずつ調べていく。
    バグが含まれた状態のプログラムを参考にすると、そのままバグやバージョン間の問題が引き継がれてしまう。

7. 基本的なプログラム構成

Doc201002_06_img01

例)course/category.php

  • ライブラリを読み込む(*)
  • 入力値のチェック
  • パーミッションのチェック
  • ヘッダの表示
  • 各種ページ内の処理
  • フッタの表示
Doc201002_06_img02 作り手によって、統一されていない場合が多々ある。

同じ処理がいたるところに書かれている。

コメントが少ないものが多い。

8. ロール(パーミッション)の処理

内部ではcapabilityというコードで実行される。プログラム中で、以下のように利用する。

パーミッションが与えられていなければエラー

require_capability('moodle/category:viewhiddencategories', $context)

パーミッションがあるかどうかをチェック

has_capability (‘moodle/course:update’, $coursecontext)

※これはMoodleのロールの管理画面で使われている名称と同じ。

9. DBの定義方法

  • XMLファイルを使って定義すると、管理者の通知機能で自動的に実行してくれる。
  • Moodle側で使っているDBに合わせて処理を行ってくれる。
  • ただし、アップデート時はDB固有の処理を書かなければならない。
<TABLES>
    <TABLE NAME="assignment" COMMENT="Defines assignments"
           NEXT="assignment_submissions">
    <FIELDS>
        <FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true"
               DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="grade"/>
    </FIELDS>
    <KEYS>
        <KEY NAME="primary" TYPE="primary" FIELDS="id" />
    </KEYS>
    <INDEXES>
        <INDEX NAME="course" UNIQUE="false" FIELDS="course"/>
    </INDEXES>
</TABLE>

10. 多言語表示

  • それぞれの言語別テキストファイルを持っている。
  • プログラム内では get_string()関数を利用
$strsubmitted = get_string( “submitted”, “assignment”);

/lang/en_utf8/assignment.php

$string['submitted'] = 'Submitted';

/lang/ja_utf8/assignment.php

$string['submitted'] = '提出';

11. バックアップ/リストア

  • バックアップ/リストアを行ったときに、Moodleの本体がコースに登録されているモジュールに含まれるバックアップ/リストア機能を実行する。
  • それぞれのモジュールのバックアップやリストア処理が、XMLとコピーすべきファイル名一覧を返す。
  • その情報に従い、Moodle本体がXMLを含む圧縮ファイルを生成。

Doc201002_11_img01

12. 入力フォーム

  • HTML_QuickFormをMoodle用にカスタマイズした、MoodleQuickFormを使用。
  • HTMLを書かずに入力欄を生成できる。また、Moodleの標準機能(HELPボタンやエラーチェック)を1行で実現することができる。
$mform->addElement('select', 'single',
	get_string('answerhowmany','qtype_multichoice'), $menu);
$mform->setDefault('single', 1);

$mform->addElement('advcheckbox', 'shuffleanswers',
	get_string('shuffleanswers', 'qtype_multichoice'), null, null, array(0,1));
$mform->setHelpButton('shuffleanswers', array('multichoiceshuffle',
	get_string('shuffleanswers','qtype_multichoice'), 'quiz'));
$mform->setDefault('shuffleanswers', 1);

13. コーディングガイドライン

http://server6.moodle.com/ja/コーディング

  • プログラムの書き方についてのガイドラインが定められている。
  • DBへのアクセスについては、ほとんどが守られていない。そのため、バージョンやDBの構成が変更になると動かないことがある。

14. ガイドラインの実態

例)ユーザー情報を取得

  • DBライブラリにあるget_users ()を使うのが推奨されているが、実際はDBを直接制御して取得していることが多い。
  • つまり、データ構造に変更があった場合、関連するプログラムを全て書き換える必要がある。

15. Moodle(ムードル)ソースの実態

  • コメントに批判や悪態が見られる。
    /// Get all existing participants in this context.
    // Why is this not done with get_users???
    // IE workaround: if I do it THIS way, it works! WTF?
  • TODO:未着手が多い。(400カ所くらいにTODOコメントがある)

16. おすすめの開発環境

eclipse + xampp をおすすめします。
メール送信のチェックにはsendまねーる(Windows専用)が簡単。

  • http://www.eclipse.org/
  • http://www.apachefriends.org/
  • http://xoops.hypweb.net/ (ダウンロード-sendまねーる)

理由1:eclipse

  • 利用している関数をすぐに探してくれる。
  • その場でプログラムのエラー箇所を教えてくれる。
  • コード補完が素晴らしい。

理由2:xampp

  • 簡単なインストールでWebサーバー、PHP、MySQL、DB管理ツール(phpMyAdmin)をインストールしてくれて、自分のPC上で全ての動作を確認できる。

理由3:sendまねーる

  • 簡単な設定で開発中のMoodleからメールを送信できる。

17. まとめ

  • Moodleのプログラムは完全に体系化されていないので、開発者の実力と経験に頼ることが多い。
  • 特にデータベースへのアクセスで、コーディングガイドラインに従わない場合や、ライブラリを利用していないことが多く、バージョン間の問題が発生する原因となっていると思われる。
  • 同じ処理をするプログラムが多岐にわたってコピーされているため、Moodle全体に関わるちょっとした修正等が容易ではない。
  • 使うツールを選ぶことで開発が楽になる。


サービスに関するお問い合わせはこちら