#author("2023-01-09T11:05:42+09:00","","")
#author("2023-01-09T11:06:00+09:00","","")
* attach.inc.php: 添付>[添付ファイル一覧] ページでタイトルがtopicpathにならない [#j51f84f8]

- ページ: [[BugTrack]]
- 投稿者: [[ぬぺぺ]]
- 優先順位: 低
- 状態: 提案
- カテゴリー: 本体バグ
- 投稿日: 2022-12-29 (木) 20:40:21
- バージョン: 1.5.4

** メッセージ [#b893088d]
添付>[添付ファイル一覧] ページでタイトルのリンクがtopicpathにならず、普通のリンクになります。

参考:ここの該当ページ~
https://pukiwiki.osdn.jp/dev/?plugin=attach&pcmd=list&refer=BugTrack%2F2593

***原因 [#rd836b13]
簡単にまとめると、
+ plugin_attach_action()で返されたページタイトル($retvar['msg'])が"$1"を含んでいると、pukiwiki.php中で"$1"は Backlink ページへのリンクに変換される (1)
+ Backlink が **/@@/~~ という表記だった場合、ページ受信時に topicpath に変換される
+ ページ受信後、DOMに <input class="page-name"> が存在しないと Backlink => topicpath の変換がされない (2)
+ GETで渡されたパラメータ page=** がそのまま <input class="page-name"> に設定される (3)

の前提条件の上で、
+$_attach_messages['msg_listpage'] がページタイトルに"$1"を含んでいる (4)
+添付ファイル一覧ページへのリンクのURLが''page=**を含んでいない'' (5-1, 5-2)

のが原因っぽい感じです。

***該当コード [#d5bedf4d]
(1) pukiwiki.php L86らへん
 $title = htmlsc(strip_bracket($base));
 $page  = make_search($base);
 if (isset($retvars['msg']) && $retvars['msg'] != '') {
 	$title = str_replace('$1', $title, $retvars['msg']);
 	$page  = str_replace('$1', $page,  $retvars['msg']);
 }

(2) main.js L571らへん
  function makeTopicpathTitle () {
    // :
    // 略
    // :
    var pageNameE = sitePropE.querySelector('.page-name')
    if (!pageNameE || !pageNameE.value) return

(3) html.php L261
 	// Page name
 	$h_page_name = htmlsc($page);
 	$page_name_data = <<<EOS
 <input type="hidden" class="page-name" value="$h_page_name" />
 EOS;

(4) ja.lng.php L155
 $_attach_messages = array(
 	// :
 	// 略
 	// :
 	'msg_upload'   => '$1 への添付',
 	// :
 );

(5-1) attach.inc.php > attach_form()
 	$navi = <<<EOD
   <span class="small">
    [<a href="$script?plugin=attach&amp;pcmd=list&amp;refer=$r_page">{$_attach_messages['msg_list']}</a>]
    [<a href="$script?plugin=attach&amp;pcmd=list">{$_attach_messages['msg_listall']}</a>]
   </span><br />
 EOD;

(5-2) attach.inc.php > AttachFile::info()
 		$retval['body'] = <<< EOD
 <p class="small">
  [<a href="$script?plugin=attach&amp;pcmd=list&amp;refer=$r_page">{$_attach_messages['msg_list']}</a>]
  [<a href="$script?plugin=attach&amp;pcmd=list">{$_attach_messages['msg_listall']}</a>]
 </p>

***修正案 [#n27fc88c]

① プラグインの動作を変えないシンプルな修正案

URLのパラメータにpageを追加することでちゃんとtopicpathになります。
ソースコード中で該当のURLを生成している場所は2ヶ所あります。(5-1, 5-2)

ここでもpage指定を追加することでちゃんとtopicpathになることを確認しました。~
https&#58;//pukiwiki.osdn.jp/dev/?plugin=attach&pcmd=list&refer=BugTrack%2F2593&page=BugTrack%2F2593

処理に手を加えないので安心です。
長いページ名のときにURLが長くなるのでそこはちょっと微妙。


② プラグインの動作を変更して修正する案

attach.inc.php L82あたり
 function plugin_attach_action()
 {
 	global $vars, $_attach_messages;
 	// :
 	// 略
 	// :
 	$pcmd  = isset($vars['pcmd'])  ? $vars['pcmd']  : '';
 	$refer = isset($vars['refer']) ? $vars['refer'] : '';
 	$pass  = isset($vars['pass'])  ? $vars['pass']  : NULL;
 	$page  = isset($vars['page'])  ? $vars['page']  : '';
 	
 	if ($refer === '' && $page !== '') {
 		$refer = $page;
 +		$vars['refer'] = $page;  // ローカル変数だけでなくvarsにも反映
 +	} elseif ($page === '' && $refer !== '') {
 +		// refer指定済でpage未指定の場合にも上と同様にパラメータをコピーする
 +		$page = $refer;          // 無くても良い(あるとURL手入力などした際に処理の分岐が変わることがある)
 +		$vars['page'] = $refer;  // ローカル変数だけでなくvarsにも反映
 	}
 	// :
 	// 略
 	// :
 }

自前のwikiで試しましたが問題なく動いていました。
// 動いてませんでした。①とごっちゃにしてました⇒変数名間違えてた…。

referとpageに同時に値が入っていることは考慮していないようです。~
関数の引数「$page」にpageを渡したりreferを渡したりしているくらいで、両方同じ値にしてしまっても問題は無いと思います。

--------
- というか、pageとreferの違いが全然わかりません…。 -- [[ぬぺぺ]] &new{2022-12-29 (木) 21:16:23};
- pcommentのpageとreferはわかるのですが、attach%%やref%%でpageではなくreferになっている意味がナゾです。どこかに書いてあったりするんでしょうか。 -- [[ぬぺぺ]] &new{2022-12-29 (木) 23:04:05};
-- 追記:refプラグインは関係ない。(なんで混入したのかナゾ)
- むしろtopicpathになるケースの方が特殊で[[BugTrack/2431]]で特別に対応しているのでこのままでいいかなと思っています。それほど表示される頻度が高いページでもありませんし。「オリジナルのタイトルとページ名が一致していること」がtopicpathに変換する条件になっているので、このページでは動作しない、という理屈になっています。これは意図しないタイトルの書き換えを防ぐためのガード条件です -- [[umorigu]] &new{2022-12-30 (金) 01:33:46};
- ありがとうございます。今回の場合、そもそもタイトルが渡されていないせいで (元タイトル !== リンク.textContent) の判定に行く前に抜けちゃってるので、ちょっと違うんじゃないでしょうか。(割とどうでもいいですが…) -- [[ぬぺぺ]] &new{2022-12-30 (金) 10:05:55};
- 変なタイトルを勝手に書き換えないようにする処理は以下のような感じでした。(途中関係ない処理省略)
 var pageNameE = sitePropE.querySelector('.page-name')
 var pageName = pageNameE.value
 var a = titleH1.querySelector('a')
 if (a.textContent !== pageName) return
簡単にまとめると「リンク名===ページ名 ならtopicpathに変換する」という処理だと思います。~
ja.lng.phpで$1が渡されて(リンク名===ページ名)となるリンクを生成しているのに、道中でパラメータからページ名が抜け落ちたせいで上記の処理が働かないのは、ちょっと変な感じがします。 -- [[ぬぺぺ]] &new{2022-12-30 (金) 10:26:07};
- (すごいどうでもいいとは思っています) -- [[ぬぺぺ]] &new{2022-12-30 (金) 12:19:49};
- まだあまり理解てきていません。topicpathの問題ではなく、『page= のパラメータがないと input.page-name が設定されない』ということでしょうか? page= と refer= のパラメータのどちらを使うかはプラグイン次第なので厳密な使い分けルールはないと思うのですが、なんとなく、各ページの付属の情報の場合には page= が、参照として使われる (典型的な例としては新規ページを作るときの直前に参照していたページ) 場合には refer= が多いように思っています -- [[umorigu]] &new{2023-01-08 (日) 18:46:54};
- ありがとうございます。確かにそうですね、盲点でした。『page= のパラメータがないと input.page-name が設定されない』のが問題であるとも言えます。 -- [[ぬぺぺ]] &new{2023-01-09 (月) 10:38:31};
- ちょっと違うかもでした。&br;① page=** がないと input.page-name が設定されないのに、&br;② ページと密接に関連するプラグインであるattachプラグインで pgae=** が渡されておらず、代わりに refer=** のみが設定されている&br;というようなところが問題なのではないでしょうか。 -- [[ぬぺぺ]] &new{2023-01-09 (月) 11:01:37};
- pageとreferの違い、助かりました。確かに言われてみればそんな雰囲気で使われてるような感じがします。 -- [[ぬぺぺ]] &new{2023-01-09 (月) 11:03:23};
- newプラグインでpage=aaaってなってたらページ名aaaを新規作成しそうですもんね。納得です。 -- [[ぬぺぺ]] &new{2023-01-09 (月) 11:05:42};
-- newプラグインでpage=aaaってなってたらページ名aaaを新規作成しそうですもんね。納得です。 -- [[ぬぺぺ]] &new{2023-01-09 (月) 11:05:42};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.129 sec.

SourceForge