T6 - 設定画面

ブロックの動作を変更するのに、ページ編集画面で各ブロックについてる歯車アイコンをクリックするのだが、われわれのSimpleClockには、歯車が出てない。

maharapg-t6-20170903-181009.png

ブロックが設定画面を持っていないからだ。ブロックが設定画面を持っていることをMaharaに伝えるために、has_instance_config というメソッドを実装する。そして、設定画面の内容に相当するものを instance_config_form というメソッドの戻り値として Mahara に伝えるようにする。そうすると、画面で設定した値などをMaharaが自動的に保存し、次回ブロック表示時に読み込んでくれる。

ここでは、以下のような設定画面で時刻の表示形式を変更できるようにしてみる。

maharapg-t6-20170903-175457.png

設定の読み込みなど

has_instance_config

このメソッドが true を返せば、設定画面を持っているということで、編集画面でブロックに歯車がつく。以下のコードをクラスに追加しよう。

public static function has_instance_config() {
    return true;
}

instance_config_form

設定のためのボタンなどがどのように画面に並ぶのかを決めるのがこのメソッド。チェックボックスやテキスト欄などが並んでいる画面を一般に入力フォームと呼ぶ。MaharaではPieFormというシステムを使って、この入力フォームを作るようになっている。

instance_config_form は、PieFormに渡すフォーム部品のリストを返す。今の場合、作りたい入力フォームは以下のような構造になっている。

maharapg-t6-20170903-204616.png

最初の「ブロックタイトル」それと下にある「格納」や「保存」などは、Maharaが勝手に用意する。

部品が二つあって、それぞれに hourform、showsec という「名前」をつけていることに注目してほしい。それらの定義をリストにして、すなわち

array(1つ目の部品'hourform'の定義, 2つ目の部品'showsec'の定義)

のようにして、instance_config_form の戻り値にする。部品の定義の仕方は後述。

われわれの instance_config メソッドは次のような内容になるはずだ。

   public static function instance_config_form (BlockInstance $instance) {
       $configdata = $instance->get('configdata');

       if ( ! $configdata ) {
           $configdata['hourform'] = 0;
           $configdata['showsec'] = 1;
       }

       return array (
           1つ目の部品定義,
           2つ目の部品定義
       );
   }

メソッドの引数には、render_instance の時と同様に、ブロック自身を表すオブジェクト $instance が渡されてくる。$instance から get('configdata') で、ブロック用に保存された設定データが読み出せる。読み出した結果は連想配列になっていて、hourformやshowsecといった「部品につけた名前」をキーにして、値を取り出すことができる。

PieForm

instance_config_formが返すのは、PieFormに渡す部品の定義なのだが、部品の名前をキーとした連想配列で、それぞれの要素は、さらに一つ一つの部品を定義する連想配列になっている。部品を定義する連想配列は、Mahara開発者Wikiのドキュメント APIForm Array に定義してあるようなキーと値のペアを使って記述する。わかりにくいですね。コードで見た方が早い気がする。こんな感じだ。

         array (
           'hourform' => array (
               'type' => 'radio',
               'title' => '時間表示のフォーマット',
               'options' => array (
                   '0' => '24時間表示',
                   '1' => '12時間表示',
               ),
               'defaultvalue' => $configdata['hourform']
           ),
           'showsec' => array (
               'type' => 'checkbox',
               'title' => '秒の表示',
               'description' => '時刻部分に秒の表示をする',
               'defaultvalue' => $configdata['showsec']
           )

キーと値のペアは、部品の種類によって使えるものが変わってくる。繰り返しになるが、APIForm Array に使えるものが掲載してあるので、必ずそこを目に通す必要がある。とはいえ、ソースとして書かれたものを読む場合は、どんな働きかほぼ想像つくと思う。

ここで注意が必要なのは、前回保存された設定データ $configdata['hourform'] などを、各部品のデフォルト値として設定してあるところだ。これをしておかないと、前回の設定が部品の状態に反映されない。

instance_config_form 完成版

ということで、前項の定義を入れて instance_config_form の完成版に!と思いたいが、まだ早い。日本語英語の切り替えに対応できるよう、「24時間表示」などの文言はlangファイルに入れる必要があったことを思い出してほしい。

それを入れてやっと完成だ。

   public static function instance_config_form (BlockInstance $instance) {
       $configdata = $instance->get('configdata');

       if ( ! $configdata ) {
           $configdata['hourform'] = 0;
           $configdata['showsec'] = 1;
       }

       return array (
           'hourform' => array (
               'type' => 'radio',
               'title' => get_string('hourform_title', 'blocktype.simpleclock'),
               'options' => array (
                   '0' => get_string('hourform_options_0', 'blocktype.simpleclock'),
                   '1' => get_string('hourform_options_1', 'blocktype.simpleclock'),
               ),
               'defaultvalue' => $configdata['hourform']
           ),
           'showsec' => array (
               'type' => 'checkbox',
               'title' => get_string('showsec_title', 'blocktype.simpleclock'),
               'description' => get_string('showsec_description', 'blocktype.simpleclock'),
               'defaultvalue' => $configdata['showsec']
           )
       );
   }

render_instance を修正

設定に応じて、時刻表示が変えられるように render_instance の該当部分を変更する。元は

date("Y/m/d H:i:s")

と決めうちしているところを設定に応じて変更するようにする。具体的には、12時間表示にする場合は時刻部分の指定「H」を「h」に変更し、秒を表示しない場合には最後の「:s」を外す。

実際に書いてみよう。render_instanceの最初のところ、$uid=...の下に以下のように2行追加する。

       $uid = (!empty($USER) ? $USER->get('id') : 0);

       $configdata = $instance->get('configdata');
       $datestring = "Y/m/d ".($configdata['hourform']? "a h":"H").":i".($configdata['showsec']? ":s":"");

$instance から設定データを取り出すところは前述した。その時と同じく $configdata という連想配列に保存している。$configdata['hourform'] には、設定画面で「24時間表示」とした場合には0が、「12時間表示」とした場合には1が入る。なので

($configdata['hourform']? "a h":"H")

の部分は、24時間表示に設定されている場合には"H"に、12時間表示になっている場合には "a h" となる。同様に

($configdata['showsec']? ":s":"")

の部分は、「秒を表示」のチェックが入っている場合には ":S" になり、入っていない場合には "" すなわち空文字列になる。

さらに、もともと "Y/m/d H:i:s" と書いていた部分を $datestring と置き換える。以上で変更は完了。


ここまでのファイル:filesimpleclock-v2-t6.zip


添付ファイル: filesimpleclock-v2-t6.zip 13件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-09-04 (月) 03:48:17 (75d)