tracker_listで内容が正しく抽出できないものがあった場合、sortの指定をしていると notice が出力されます。
Notice: Undefined index: state in .../plugin/tracker.inc.php on line 781
official:WebTrackのtracker_listでは、下記のようにsort指定しています。
#tracker_list(webtrack,,state:SORT_ASC;_real:SORT_DESC)
リスト表示時に正しくコンテンツを抽出できなかった場合、引数で指定した state が連想配列のキーとして存在しないため、Noticeが出ているようです。
かなりいい加減ですが、下記のようにすると Notice は出なくなります。
plugin/tracker.inc.php: 779行目付近 foreach ($this->rows as $row) { - $keys[$field][] = $this->fields[$field]->get_value($row[$field]); + $keys[$field][] = (isset($row[$field]))? $this->fields[$field]->get_value($row[$field]) : ''; }
修正案のベースは、cvs:plugin/tracker.inc.php (1.36) ですベースページ名をタイプミスした時か、除外パターンにすべてのページがヒットしてしまった時にしか、発生しないとは思いますが、修正案を書きます。
class Tracker_list { (中略) function sort($order) { - if ($order === '') + if ($order === '' || empty($this->rows)) { return; }
#tracker_list: Pages not found under: 'Tracker2/'
以下のようなときに発生
#tracker_list(,,_update:) //コロンより後ろにヘルプ記載の4種類以外を指定(空文字含む)switch (strtoupper($dir)) の中、 ヘルプ記載以外のを処理するdefault: の部分でcontinue; としているが、
これではswitch (strtoupper($dir)) を脱出するだけで、その後の$this->order[$key] = $dir; を実行してしまうので、無効なソートオプションをarray_multisort() に送ってしまう、というのが原因です。
- こちらは指摘の通りで、switch() の中で continue が期待通りに動作しない、というPHPの癖に泣かされている部分だった様です。まぎらわしいので、continueを使わない形にしました。でも確か、まだ明確にユーザーにエラーを返すようにはしていないはずです。(するべき) -- henoheno 2007-09-10 (月) 23:34:23
- cvs:plugin/tracker.inc.php (r1.51)
#tracker_list: Invalid sort key: SORT_HOGE- 空の時は、デフォルトの値になります -- henoheno 2007-09-18 (火) 23:58:02
以下のようなときに発生
#tracker_list(,,_update) //コロン以降を省略array_pad(explode(':',$item),1,'ASC') で配列を作る時、 「explode で最低でも1つの要素を作る」のに、array_pad では「要素の数が1未満なら'ASC' という要素を作って、要素数の不足を穴埋めする」と設定しているのが原因です。(本来なら、項目名とソートタイプの、2つの要素が必要)
2007-09-10 (月) 21:05:07 に追記: Warning が返ってきたのは、たぶん上の2つの状況を別々にテストしていたからで、v1.48 以降ではソートタイプの件を取り込んでいるので、Notice しか返ってきませんでした。
$fieldname(下のバージョンでは$key)と $order (同じく$dir)は初期化していないので、要素が1つの配列がくると片方の変数が存在しないのでNotice が返ってきます。
class Tracker_list { (中略) function sort($order) { if ($order == '') { return; } $names = array_flip(array_keys($this->fields)); $this->order = array(); foreach (explode(';',$order) as $item) { - list($key,$dir) = array_pad(explode(':',$item),1,'ASC'); + list($key,$dir) = array_pad(explode(':',$item),2,'ASC'); if (!array_key_exists($key,$names)) { continue; } switch (strtoupper($dir)) { case 'SORT_ASC': case 'ASC': case SORT_ASC: $dir = SORT_ASC; break; case 'SORT_DESC': case 'DESC': case SORT_DESC: $dir = SORT_DESC; break; default: - continue; + continue 2; } $this->order[$key] = $dir; }ベースからの差分ということで、「ヒット対象のページが~」の部分を、これには対応させてませんが、
修正案のベースは、cvs:plugin/tracker.inc.php (1.36) です普通なら、plugin_tracker_list_convert で表示されているフォームから飛ぶので、
refer や config なしで、plugin=tracker_list が呼び出されるのはありえないですが、 修正案を。
function plugin_tracker_list_action() { global $script,$vars,$_tracker_messages; + if (! isset($vars['refer'] ,$vars['config']) ) die_message('plugin_tracker_list_action error'); + $page = $refer = $vars['refer'];
$s_base = make_pagelink(trim($base)); + $title = htmlspecialchars(trim($base)); return array( - 'msg' => plugin_tracker_message('msg_list'), + 'msg' => str_replace('$1', $title , plugin_tracker_message('msg_list')), 'body'=> str_replace('$1', $s_base, plugin_tracker_message('msg_back')) . plugin_tracker_list_render($base, $base, $config, $list, $order, $limit) );上のように変更して、プラグイン側で置き換えするようにすればたぶん
tracker <= ここに #tracker_listを置くなら気付かない tracker/1 tracker/2 tracker/... foobar <= ここに #tracker_list を置くと、refer=tracker となるので戻れない
// $Id: bugtrack.inc.php,v 1.25 2005/04/03 03:33:47 henoheno Exp $ (中略) function plugin_bugtrack_list_convert() { (中略) $data = array(); $pattern = $page . '/'; $pattern_len = strlen($pattern); foreach (get_existpages() as $page) if (strpos($page, $pattern) === 0 && is_numeric(substr($page, $pattern_len))) array_push($data, plugin_bugtrack_list_pageinfo($page)); + if (count($data) === 0) return '<p>エラーメッセージ</p>'; + $count_list = count($_plugin_bugtrack['state_list']);