編集画面の終了時の処理について質問

編集画面の終了時の処理について質問

- Tatsuya Shirai の投稿
返信数: 16

 先週辺りのバージョン(Moodle1.8.4+)から,コース内のブロックやリソースを編集した後に,元の画面に戻らずに真っ白な画面になる現象が発生しています.先ほど(2008/02/02)最新版に更新しましたが状況は変わりません.

 リソース等の設定を変更した際に,画面の一番下に「変更を保存して表示する」と「変更を保存してコースに戻る」の二つのボタンが表示されるようになりました.そもそもこの二つの違いがよく分かりません.(どちらを押しても真っ白な画面になってしまう)

 この現象は当方だけで発生している問題でしょうか?
 phperror.logには,

[02-2-2008 12:55:56] PHP Warning:  Invalid argument supplied for foreach() in C:\xampplite\htdocs\mech\moodle\admin\cron.php on line 277

このようなワーニングが列挙されていますが本件とは無関係でしょう(これも気になるといえば気になりますが...).

Tatsuya Shirai への返信

Re: 編集画面の終了時の処理について質問

- Haruhiko Okumura の投稿
        if ($submitbutton) {
            redirect("$CFG->wwwroot/mod/$module->name/view.php?id=$fromform->coursemodule");
        } elseif ($submitbutton2) {
            redirect("$CFG->wwwroot/course/view.php?id=$course->id");
        }



        if ($submitbutton2) {
            redirect("$CFG->wwwroot/course/view.php?id=$course->id");
        } else {
            redirect("$CFG->wwwroot/mod/$module->name/view.php?id=$fromform->coursemodule");
        }

とでも書いていれば少なくとも真っ白にはならないのですが,コーディングが甘いんですね。
Haruhiko Okumura への返信

Re: 編集画面の終了時の処理について質問

- Tatsuya Shirai の投稿

2008-01-25 Friday 03:23 nicolasconnault
    * course/modedit.php, course/moodleform_mod.php,
    lang/en_utf8/moodle.php:

    MDL-6826 backporting new "save changes and return to course" button
    for all modules' edit and add forms.

 これの副作用ですね.  モジュールの編集画面のソースを見る限り,submitbutton, submitbutton2はFORMのmethodが'post'であるにも関わらず,course/modedit.phpの頭では,

    $submitbutton  = optional_param('submitbutton', null, PARAM_ALPHANUM);
    $submitbutton2 = optional_param('submitbutton2', null, PARAM_ALPHANUM);

このようにURLからデータを得ようとしているので,どちらもnullになってしまう. その結果,奥村先生が示された箇所のif文を両方ともすり抜けてしまうのですね.

 なんとかうまくFORMからsubmitbuttonとsubmitbutton2の値を受け取れるようにしないといけないのですね.

 

Tatsuya Shirai への返信

解決

- Tatsuya Shirai の投稿

 一応,解決しました.

 やはり,course/modedit.phpの275行以降のブロックですね.
 フォームから帰ってきたデータ(POST)は$fromformにget_data()で渡されています."変更を保存して表示"(submitbutton),"変更を保存してコースに戻る"(submitbutton2)のいずれかにvalueが代入して格納されています.したがって,

//      if ($submitbutton) {
        if (!empty($fromform->submitbutton)) {
            redirect("$CFG->wwwroot/mod/$module->name/view.php?id=$fromform->coursemodule");
//      } elseif ($submitbutton2) {
        } elseif (!empty($fromform->submitbutton2)) {
            redirect("$CFG->wwwroot/course/view.php?id=$course->id");
//      }
        } else redirect("$CFG->wwwroot/course/view.php?id=$course->id"); // (ADD)
        exit;

これが正しいようです.

#Trackerに報告しておきます.

Tatsuya Shirai への返信

Re: 解決

- Haruhiko Okumura の投稿
白井先生,ありがとうございます。

じつは修正をしても,ユーザの先生から「どっちのボタンを押すのかわからない」という苦情が来ました。下手に便利にしようと思ってかえって初心者を困らせる例でしょうか。この場合はボタンに書かれていることばの意味がつかみにくいことも原因かもしれません。
Haruhiko Okumura への返信

Re: 解決

- Tatsuya Shirai の投稿

 ボタンの意味は確かに分かり難いですが,便利な機能であるのは徐々に分かってきました.

 ”変更を保存してコースに戻る”はいままでの機能ですので良いとして,”変更を保存して表示”は謎ですよね.機能が正常に働くと,その意味が分かるのですが.

 では,”変更を保存してこのモジュールを表示する”とすれば今度は長くて読みにくいですし,”モジュールってなんだ?”となります.プレビューという言葉もここで使うべきかどうか悩みますね.

 ”変更を保存して戻る”(あるいは閉じる)+チェックボックス(モジュールへ直行ウインク)という選択肢もあったかと思います.あまり詳しく無い方はいつもどおりにコースの画面に戻るのですが,ある日,「なんだろうこのチェックボックスは?」とチェックを付けると便利なモジュールへの直行機能を発見する.こういうストーリーの方がユーザのスキルアップには有効ですね.

Haruhiko Okumura への返信

Re: 解決

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
Moodle Trackerの投稿MDL-6826をもとに、ボタンの文字が変更されたようです。

moodle.php
1.141.2.26 -> 1.141.2.27
diff -u -r1.141.2.26 -r1.141.2.27
--- moodle.php 4 Feb 2008 10:58:25 -0000 1.141.2.26
+++ moodle.php 4 Feb 2008 12:17:49 -0000 1.141.2.27
@@ -1,4 +1,4 @@
-<?PHP // $Id: moodle.php,v 1.141.2.26 2008/02/04 10:58:25 nicolasconnault Exp $
+<?PHP // $Id: moodle.php,v 1.141.2.27 2008/02/04 12:17:49 nicolasconnault Exp $
 // moodle.php - created with Moodle 1.7 beta + (2006101003)
@@ -1267,8 +1267,8 @@
 $string['rsstype'] = 'RSS feed for this activity';
 $string['saveandnext'] = 'Save and show next';
 $string['savechanges'] = 'Save changes';
-$string['savechangesanddisplay'] = 'Save changes and display';
-$string['savechangesandreturntocourse'] = 'Save changes and return to course';
+$string['savechangesanddisplay'] = 'Save and display';
+$string['savechangesandreturntocourse'] = 'Save and return to course';

日本語の言語ファイルも下記のように変更させて頂きました。笑顔

-$string['savechangesanddisplay'] = '変更を保存して表示する';
-$string['savechangesandreturntocourse'] = '変更を保存してコースに戻る';
+$string['savechangesanddisplay'] = '保存して表示する';
+$string['savechangesandreturntocourse'] = '保存してコースに戻る';

Mitsuhiro Yoshida への返信

Re: 解決

- Tatsuya Shirai の投稿

 ご苦労様です!

 でも個人的には'changes'を取り除いてボタンの幅を狭くするという解決よりも,'Save and Quit'ボタンと'Display'チェックボックスという解決が良かったですねぇ.

Tatsuya Shirai への返信

Re: 解決

- Tatsuya Shirai の投稿

 少し勘違いしていました.突っ込みが甘かったです.

$submitbutton  = optional_param('submitbutton', null, PARAM_ALPHANUM);
$submitbutton2 = optional_param('submitbutton2', null, PARAM_ALPHANUM);

ですが,optional_param()は$_POST[]も$_GET[]も受け入れ可能な便利な関数でした(関数内部までしっかりチェックしなかったのはミスです).ではなぜ,$submitbuttonも$submitbutton2も両方ともnullになってしまうのか,というと,原因はPARAM_ALPHANUMです.いま自宅なので確認できませが,これをPARAM_RAWに変更すれば,多分,最小限の修正で済みます.$submitbuttonは<FORM>中でtypeがsubmitですので,値はvalue="変更を保存して表示する"になります.これをALPHA+NUMでparam_clean()されてしまうので,一文字も残らず抹殺されてnullになる.これがメカニズムのようです.

#MoodleTarckerでは”Blank pageが表示されるのはキャッシュのせいでは?”等々,コメントがありました.うーん,なぜこれが1週間以上も問題にならないのか不思議だったのですが,非ラテン言語圏でのみ発生する問題だったからなのですね...

Tatsuya Shirai への返信

Re: 解決

- Haruhiko Okumura の投稿
なるほど! 気づきませんでした。
PARAM_MULTILANG にしてみました。
Haruhiko Okumura への返信

Re: 解決

- Tatsuya Shirai の投稿

ありがとうございます.PARAM_MULTILANGの使用は全く考え付きませんでした.

 PARAM_MULTILANGはclean_param()中のcaseには無いので変だなぁと思って検索したところ,lib/modellib.php中で宣言されていますね.PARAM_TEXTと同じ0x0009にdefineされているので,PARAM_TEXTと等価であると.

 PARAM_RAWでもPARAM_MULTILANGでも,今回に関しては戻り値が同じであることを確認しました.Trackerには両方どちらでもOKだが,PARAM_ALPHANUMはNGの旨,報告しておきます.でも,今後のことを考えるとPARAM_MULTILANG(PARAM_TEXT)を用いた方が問題発生を未然に防げそうですね.


 if - elseif にelse が無しでexit,これはエンジニアとしてマズいですね(時々,自分も忘れますが).もし”バグを発見するためだ”というのであればエラーメッセージを表示するようにすべきですね.サービスするアプリケーションとしては”それでも辛うじて動く”ようにすべきです.
Haruhiko Okumura への返信

Re: 解決

- Tatsuya Shirai の投稿

 MDL-6826の雰囲気では,逆にoptional_param()は止めよう,という方向に流れが変わりそうですね.ボールは投げたので,あとは本家にお任せしましょう.


 いま現在の最新版では,optional_param()は残っているけれども,!empty($fromform->submitbutton)でチェックする,という中途半端な状態で更新されていますね.Martin Dougiamas氏の鶴の一声でもう一度,変わるかも知れませんが.

#if-elseif-"else"はきちんと対策して頂けたようで一安心です.!empty()でもisset()でも.

Haruhiko Okumura への返信

Re: 解決

- Tatsuya Shirai の投稿

 いまMoodle1.8.4+の最新版をダウンロードして動作を確認しました.

 完璧に対応していただけたようです.

 もし,編集画面で”変更を保存”して画面が真っ白になってしまう方は最新版をダウンロードして更新しましょう.