ラベル(リソース)に単なる水平線(hr)が使えない

ラベル(リソース)に単なる水平線(hr)が使えない

- Tatsuya Shirai の投稿
返信数: 4

 コース上のトピックスを区切るために,ラベル(リソース)として単なる水平線のみを入力すると,

Notice: Undefined index: 847 in C:\xampplite\htdocs\mech\moodle\course\lib.php on line 1344

Notice: Trying to get property of non-object in C:\xampplite\htdocs\mech\moodle\course\lib.php on line 1344

のエラーが出ます.直接的な原因は,mdl_labelを見る(添付)と分かるように,nameの項目が空である点にあると思います.多分,HTMLのタグを取り除いて残った文字列をnameとしているのでしょう.

 対策方法はまだ何も考えていません.多分,nameが空になってしまう時は適当な文字列を割り当てるだけで良いのじゃないかな,と思うのですが,副作用が出るかも知れませんね.既にこの問題を解決した方はいらっしゃらないでしょうか?

添付 resource_horizontalLine.jpg
Tatsuya Shirai への返信

Re: ラベル(リソース)に単なる水平線(hr)が使えない

- Tatsuya Shirai の投稿

かなり適当ですが...

mode/label/lib.phpの冒頭にある,

function label_add_instance($label) {
/// Given an object containing all the necessary data,
/// (defined by the form in mod.html) this function
/// will create a new instance and return the id number
/// of the new instance.
    $textlib = textlib_get_instance();

    $label->name = addslashes(strip_tags(format_string(stripslashes($label->content),true)));
// (Shirai): ここから追加
    if (strlen($label->name) == 0) $label->name = 'noname';
// (Shirai): ここまで追加
    if ($textlib->strlen($label->name) > LABEL_MAX_NAME_LENGTH) {
        $label->name = $textlib->substr($label->name, 0, LABEL_MAX_NAME_LENGTH)."...";
    }
    $label->timemodified = time();

    return insert_record("label", $label);
}

function label_update_instance($label) {
/// Given an object containing all the necessary data,
/// (defined by the form in mod.html) this function
/// will update an existing instance with new data.
    $textlib = textlib_get_instance();

    $label->name = addslashes(strip_tags(format_string(stripslashes($label->content),true)));
// (Shirai): ここから追加
    if (strlen($label->name) == 0) $label->name = 'noname';
// (Shirai): ここまで追加
    if ($textlib->strlen($label->name) > LABEL_MAX_NAME_LENGTH) {
        $label->name = $textlib->substr($label->name, 0, LABEL_MAX_NAME_LENGTH)."...";
    }
    $label->timemodified = time();
    $label->id = $label->instance;

    return update_record("label", $label);
}

こうすることで,データベース(mdl_label)のnameの欄は'noname'となり,画面表示も正しく行なえるようになりました.
詳しく調べた訳ではないのですが,$label->nameには日本語も使えるようですし,さらにもし長すぎた場合(50文字以上)は省略していたり('...'を付加)していたりしますので,あまり名前に重要な意味は無さそうですので,多分,大丈夫なのではないかな.


MDL-15205に報告しました.

添付 HTMLtagOK.jpg
Tatsuya Shirai への返信

Re: ラベル(リソース)に単なる水平線(hr)が使えない

- Tatsuya Shirai の投稿

 敢えて先の修正パッチの悪い点を挙げれば,削除時に”nonameを削除して良いか?”と聞かれることですね複雑な.かといって”水平線”とは限らない訳で...”HTMLタグのみのラベルなのでnoname”という名前にしても利用者にとっては意味不明ですし.

 "選択したラベル”という名前にすれば削除時に違和感ありませんが,データベースを見たときに「なんじゃこりゃ」ですし....

Tatsuya Shirai への返信

Re: ラベル(リソース)に単なる水平線(hr)が使えない

- Tatsuya Shirai の投稿

 本日ダウンロードしたMoodle1.9.1+では直っていますね.

 get_label_name()という関数が追加されており,その中でempty($name)ならば"labell{$label->instance}"という名前にするようになっています.

 function label_add_instance()とlabel_update_instance()の両方ともこの関数を呼ぶようになっているので大丈夫そうです.

#Moodle1.8.5+の方は対策されていませんねぇ.
#Trackerの方はOpenのままなので,自分でヒッソリとResolvedにしておきます.