スキンファイルの中でdie_message()を呼ぶとループが発生する (MenuBarに設置された任意のプラグインが die_message() を呼ぶとループが発生する)

修正

関連

メッセージ

スキンファイルの中で die_message() をコールした場合、また、MenuBarのページにプラグインを設置した場合、それがきっかけで以下のようなエラーが表示されることがあります。

概要

  1. スキンファイルの中で呼ばれる関数 pkwk_output_dtd() は、絶対に一度しか呼ばれない関数であるため、二度目に呼んだ時には "pkwk_output_dtd() already called. Why?" というエラーを表示し、スキンファイルにまつわる異常な処理があることを間接的に知らせます。
  2. die_message()の現在の仕様上、スキンファイルの中でコールすると、結果的に catbody() 関数を再帰的に呼び出すループが発生します。
    • 代わりにdie()を使わねばなりません。
  3. MenuBarの処理はスキンファイルの中で行われています。
  4. 個々のプラグインは、基本的にそれがMenuBarで実行されるのか、本文で実行されるのかをいちいち考慮しません。(一部の例外: includeプラグイン)
  5. counterプラグインは、その用途上 MenuBar のページに設置されます。
  6. counterプラグインは、counter周りのファイルに書き込みができない場合に die_message() をコールします。

MenuBarのページにcounterプラグインを設置する => 再表示しようとする => スキンファイルの処理開始 => pkwk_headers_sent() や pkwk_output_dtd() がコールされる => MenuBarのページが、スキンファイルの内部で処理される => counterディレクトリ周りの書き込み権限がないことをcounterプラグインが見つける => counterプラグインが die_message() をコール => die_message() のループが成立する => pkwk_output_dtd() あるいは pkwk_headers_sent() がもう一度コールされる => "pkwk_output_dtd() already called. Why?" といったエラーだけが表示される => 原因がわからず、ユーザーは困惑する

※counterプラグインに限った話ではありません




*1 他の直書きプラグインの挙動を確認する必要はあるでしょう
*2 というか、携帯用のスキンでは呼び出してないだけ?
*3 例えば、スキンに直接書いた部分が原因で、ヘッダーの出力後に呼び出される場合
*4 改造に失敗しないと起こらないと思いますが、ヘッダーが出力されていない状態でcatbody() → die_message() → catbody() → 以降ループ、となる場合を回避するため

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-04-18 (土) 09:49:22
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.169 sec.

OSDN