Category::Plugin

tracker_listで Notice が出力される

  • ページ: BugTrack2
  • 投稿者: teanan
  • 優先順位: 普通
  • 状態: 完了
  • カテゴリー: プラグイン
  • 投稿日: 2005-11-25 (金) 03:37:15
  • バージョン: 1.4.6

メッセージ

tracker_listで内容が正しく抽出できないものがあった場合、sortの指定をしていると notice が出力されます。

Notice: Undefined index: state in .../plugin/tracker.inc.php on line 781

[fixed] Notice部分の調査

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]) : '';
  }

  • 拙速の対策として充分だと思います。カッコはなくても良いとは思いますが問題ないですし、連想配列にisset()を追加したということは「キーが存在しない場合がある」と指摘しているのと同じことなので短期的にはコメントも不要です。このコミットで(外部動作の)状況も好転します。 -- henoheno 2005-11-29 (火) 00:23:59
  • (内部で)「どんなときにそうなるのか」「なぜそうなるのか」という部分が不明である(読み手も疑問に思う)のは変らないというのもその通りかと思いますが、長くなりそうですから (^^; 期待しないデータを拾ったときの話題かなーと想像しています。 -- henoheno 2005-11-29 (火) 00:26:21
  • コメントありがとうございます。とりあえず、回避したものをコミットしました。 -- teanan 2005-11-29 (火) 02:52:05
  • ちなみに、officialのtrackerにパッチあてしようと思ったのですが、文字コードを合わせられなかったので断念しました orz. -- teanan 2005-11-29 (火) 03:10:12
    • 意外とofficial,というかUTF-8のPukiWikiは(サーバー側に作業環境が整っていないと)手間取るんですよね。 -- henoheno 2005-11-29 (火) 23:20:33

その他

  • まだ、error_reporting(E_ALL) とするとNotice: やWarning: を返してくるパターンがあります。差分の書き方がいい加減ですみません。*1 -- 2007-05-29 (火) 18:24:15

[fixed] Tracker_list sort指定関係: 対象がない場合

  • ベースページ名の下に、ヒット対象のページが1件も存在しなかった時に、sortの指定をしていると、
    「Notice: Undefined index」と、「Warning: array_multisort()」を返してくる。 -- 2007-05-29 (火) 18:24:15

    ベースページ名をタイプミスした時か、除外パターンにすべてのページがヒットしてしまった時にしか、発生しないとは思いますが、修正案を書きます。

    修正案のベースは、cvs:plugin/tracker.inc.php (1.36) です
    class Tracker_list
    {
    (中略)
    	function sort($order)
    	{
    -		if ($order === '')
    +		if ($order === '' || empty($this->rows))
    		{
    			return;
    		}
  • これは #tracker_list がしかるべきフィードバックをユーザーに返さないのと、Tracker_list がそれを想定していないのが原因でしたので、最終的に以下のようなメッセージを返す様に直しました。 -- henoheno 2007-09-10 (月) 23:28:58
    #tracker_list: Pages not found under: 'Tracker2/'

[fixed] Tracker_list sort指定関係: 無効なtype

  • 追加です。 -- 2007-06-07 (木) 15:25:53
    • ソートタイプが無効な文字の時、「XML ページを表示できません」と、「Warning: array_multisort()」を返してくる。

      以下のようなときに発生

      #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

[fixed] Tracker_list sort指定関係: コロン以降を省略したとき

  • 追加です。 -- 2007-06-07 (木) 15:25:53
    • ソートタイプを省略した時に、「Notice: Undefined index」と、「Warning: array_multisort()」を返してくる。

      以下のようなときに発生

      #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 が返ってきます。

    • 無効なtype とコロン以降を省略したときの修正案
      修正案のベースは、cvs:plugin/tracker.inc.php (1.36) です。
      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 (r1.51) sort key が空でもエラーは出しませんが、キーとしては受け付けてしまいます -- henoheno 2007-09-11 (火) 23:28:40
    • tracker.inc.php (v 1.51) で試して特にエラーは返って来ないのを確認しました。 -- 2007-09-13 (木) 19:06:37
  • 適当に省略した場合、よきに計らうように直しました。 -- henoheno 2007-09-19 (水) 00:02:52

[fixed] plugin_tracker_list_action() の Notice / $baseでないページに #tracker_list を設置した時に $refer が適切なリンクを表示しない / sort key の個数制限と短縮

  • plugin_tracker_list_action で、「$vars['refer'] や$vars['config'] が入力されていない時に、
    「XML ページを表示できません: XSL スタイル シートを使用した XML 入力は表示できません。」や「Notice: Undefined index」が
    エラーとして返ってきます。 -- 2007-05-29 (火) 18:24:15

    普通なら、plugin_tracker_list_convert で表示されているフォームから飛ぶので、
    refer や config なしで、plugin=tracker_list が呼び出されるのはありえないですが、 修正案を。

    修正案のベースは、cvs:plugin/tracker.inc.php (1.36) です
    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'];
  • 引数をそれなりに厳格にチェックしているので、これはもう出ないはずです。 -- henoheno 2007-09-11 (火) 23:28:40
    • エラーが出なくなったのはいいんですが、referからbaseに変更になったことでひとつ不具合が。referが自動でセットされなくなったのでlib/pukiwiki.php でページ名をタイトルに埋め込んでくれなくなりました。plugin/tracker.inc.php (1.51) で、
      	$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)
      	);
      上のように変更して、プラグイン側で置き換えするようにすればたぶん大丈夫だと...思う。 -- 2007-09-13 (木) 20:27:23
    • 大丈夫じゃなかった。よく読まずに$s_pageの仲間だと思ってしまったのが原因。なので修正しました(変数名はいい加減ですけど)。 -- 2007-09-13 (木) 23:19:29
      • ボケてそのままにしてしまった部分をさらに修正 -- 2007-09-13 (木) 23:51:20
  • コメントありがとうございます。勘違いしていなければ、tracker_listは任意のページに置けるので、現状の仕様では、あるtracker_listが設置されていたページでリンクをクリックした場合、そのページに戻るためのリンクを refer が表示しない可能性があります。もう一ひねりいりそうなんですが、そこまでする必要があるのかどうかも含めて、無駄な検討中です。どう思いますか? -- henoheno 2007-09-19 (水) 00:12:21
    tracker   <= ここに #tracker_listを置くなら気付かない
    tracker/1
    tracker/2
    tracker/...
    foobar    <= ここに #tracker_list を置くと、refer=tracker となるので戻れない
    • 確かに、同じ窓を使って開いてしまった場合「戻る」を使わないといけないんですよね~、なので別ウィンドウ使って開くことが多いです。でももし実現するとして、それをアドレスに含めてしまうと、ただでさえ長いのがさらに長くなってリミッターに引っ掛かる、なんてことにならないかがちょっと心配です。BugTrack2/243#s2cf6a37のアドレス書き換えできるのと併せてどうするのか…。 -- 2007-09-19 (水) 01:06:27
    • r1.55 にて、各種デフォルトの値の場合、URLを短くするような小細工を加えられる状態にはなりました。同時に、sortする列数に制限をかけましたから(制限値の適切な値がいくつかはともかく)野放図に長くなる事は減るでしょう。またsort key についても、SORT_ASC を ASC と書くような短縮系を取り込んだりするともう少し減るでしょう。その辺りのネタが見えるので、追加で refer=foobar をURLに追加する事自体にはあまりコストを感じていません -- henoheno 2007-09-20 (木) 00:50:30
    • r1.66 に一通りフォローを追加しました。これで tracker_list を設置していたページに戻ることが簡単にできる様になりましたから、今までよりまっとうな状態になったはずです。 -- henoheno 2007-09-23 (日) 00:13:36
    • 「&refer」 がセットされていない場合のタイトル表示はどうなっているのでしょう?official:質問箱4などでソートを変更すると「の項目一覧」と表示されてしまいます。BugTrack2/227と似てるようで違う問題なのかな。 -- 2007-09-23 (日) 16:34:05
  • コメントありがとうございます。タイトルの部分がケアしきれていなかった(上ですでに提示されている件)ので、修正します -- henoheno 2007-09-23 (日) 23:26:03
    • cvs:plugin/tracker.inc.php (r.1.78) で修正しましたが、officialは今現在 PukiWiki 1.4.6 ベースなので挙動が変わらない様です (^^;-- 2007-09-23 (日) 23:40:03
  • CVS版 としては、この部分は完了でいいですよね?official のタイトルの挙動を変えてくれ、だったらofficial:WebTrack 行きですし。 -- 2007-11-10 (土) 15:12:00
  • 完了扱いにしておきます ;) -- henoheno 2007-11-11 (日) 21:27:33

おまけ: bugtrackプラグインの plugin_bugtrack_list_convert()

  • おまけで、plugin_bugtrack_list_convert でも、「ヒット対象のページが~」と同じことがあったのでこちらの修正案も。 -- 2007-05-29 (火) 18:24:15
    // $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']);
  • これももう少しましな状況になっているはずです。 -- henoheno 2007-09-11 (火) 23:29:36
  • とりあえず、で同じページに置いたのがまずかったかな。このおまけだけBugtrackプラグインのリストなんですけど。それとも、これからコミットするところだとか。 -- 2007-09-11 (火) 23:45:35
    • まだこれから始めるところなら、BugTrack2/112も片付けて欲しいです。
    • や、やだなあ、trackerとbugtrackを見間違えるなんて、そんな単純な罠に引っかかるわけ無いじゃないですか、ハハハ・・・ -- henoheno 2007-09-13 (木) 23:14:38
  • tracker の次はその流れでbugtrack ですかね?タイミング的に放置してたBugTrack2/112や、BugTrack2/187と、BugTrack2/243 のコメントにある'move to' を追跡する機構の修正をbugtrack にも、ってことで。 -- 2007-11-10 (土) 15:04:41

コメント

  • 確認ありがとうございます。できれば時系列順に追記していただけると助かります(新しいコメントの追記を、過去のコメントの下に)。過去に見た人が話を追い辛くないように。 -- henoheno 2007-09-13 (木) 23:13:32

*1 下記三件

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

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.256 sec.

OSDN