- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2022-12-30T01:40:45+09:00;2022-12-30T01:37:59+09:00","default:user","user")
#author("2022-12-30T12:19:49+09:00","default:user","user")
* 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)
+ ページ受信後、DOMに .page-name なエレメントが存在しないとmain.jsによるBacklinkへの変換がされない (2)
+ GETで page=** が渡されるとその値がそのまま input.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 への添付',
// :
);
***修正案 [#n27fc88c]
(5-1) attach.inc.php > attach_form(): 修正前
(5-1) attach.inc.php > attach_form()
$navi = <<<EOD
<span class="small">
[<a href="$script?plugin=attach&pcmd=list&refer=$r_page">{$_attach_messages['msg_list']}</a>]
[<a href="$script?plugin=attach&pcmd=list">{$_attach_messages['msg_listall']}</a>]
</span><br />
EOD;
(5-1) 修正後(GETでpageも渡すように)
$navi = <<<EOD
<span class="small">
[<a href="$script?plugin=attach&pcmd=list&refer=$r_page&page=$r_page">{$_attach_messages['msg_list']}</a>]
[<a href="$script?plugin=attach&pcmd=list">{$_attach_messages['msg_listall']}</a>]
</span><br />
EOD;
----
(5-2) attach.inc.php > AttachFile::info(): 修正前
(5-2) attach.inc.php > AttachFile::info()
$retval['body'] = <<< EOD
<p class="small">
[<a href="$script?plugin=attach&pcmd=list&refer=$r_page">{$_attach_messages['msg_list']}</a>]
[<a href="$script?plugin=attach&pcmd=list">{$_attach_messages['msg_listall']}</a>]
</p>
(5-2) 修正後(同上)
$retval['body'] = <<< EOD
<p class="small">
[<a href="$script?plugin=attach&pcmd=list&refer=$r_page&page=$r_page">{$_attach_messages['msg_list']}</a>]
[<a href="$script?plugin=attach&pcmd=list">{$_attach_messages['msg_listall']}</a>]
</p>
***修正案 [#n27fc88c]
----
① プラグインの動作を変えないシンプルな修正案
URLでpageを指定することでちゃんとtopicpathになることを確認しました。~
URLのパラメータにpageを追加することでちゃんとtopicpathになります。
ソースコード中で該当のURLを生成している場所は2ヶ所あります。(5-1, 5-2)
ここでもpage指定を追加することでちゃんとtopicpathになることを確認しました。~
https://pukiwiki.osdn.jp/dev/?plugin=attach&pcmd=list&refer=BugTrack%2F2593&page=BugTrack%2F2593
page=**の追加によって編集や差分等のリンクも増えますが、特に問題ないと思います。
処理に手を加えないので安心です。
長いページ名のときにURLが長くなるのでそこはちょっと微妙。
長いページ名のときに長さが倍になりますが、人間の目に触れやすいだったりURLをコピーされるようなページでもないですし、QUERY_STRING_MAXほどは行かないのでそっちも問題ないんじゃないでしょうか。
referも外しちゃって
[<a href="$script?plugin=attach&pcmd=list&page=$r_page">{$_attach_messages['msg_list']}</a>]
とやりたいですが、その場合はソースコードの修正箇所が増えます。
② プラグインの動作を変更して修正する案
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};
- むしろ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};
#comment