Repository navigation
AJAX シェルでエラー画面などが入れ子表示される不具合を修正 - #488
Conversation
shell.js は応答ヘッダー X-Evo-Pane の有無だけで断片かどうかを決めるため、
header.inc.php / footer.inc.php 側で送信済みの X-Evo-Pane を見て出力を抑止する。
dumpError() や processor の権限エラー画面など、自前で header/footer を読み込む
すべての箇所で、#mainPane 内に <html>・メニュー・ツリーが入れ子になる問題を防ぐ。
- evoIsPaneResponse(): 送信済みの応答ヘッダーで断片応答かを判定する
- evoRenderPaneFooterExtras(): 1リクエスト1回に限定し、システムアラートの二重表示を防ぐ
- dump_error.tpl: シェルでは EvoShell.navigate() で遷移し、モーダルは再取得なしで閉じる
- shell.js: EvoShell.closeModal({ reloadMain: false }) を追加
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012HYGUfDZvEu42YU3ejKKEo
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 36 minutes. View limit detailsLimit details: You’ve used the included review currently available. Review configuration: ⚙️ Run configuration
📒 Files selected for processing (5)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🔵 Needs a closer look
複数のエラー経路とモーダル遷移に影響し、ブラウザでの動作確認が未実施のため。
0 open findings
What changed in this PR
AJAX 断片応答で完全な HTML が入れ子表示される不具合を修正。
Changes:
- 応答ヘッダーに基づく断片判定を共通化
- フッター追加出力の重複を防止
- モーダル終了後の画面遷移競合を回避
| File | Description |
|---|---|
manager/media/style/common/dump_error.tpl |
シェル対応のエラー後遷移 |
manager/media/script/shell.js |
再取得を抑止できるモーダル終了 API |
manager/includes/helpers.php |
断片応答判定と一度限りの追加出力 |
manager/actions/header.inc.php |
断片応答の完全 HTML 出力を抑止 |
manager/actions/footer.inc.php |
断片応答の閉じタグ出力を抑止 |
🧠 Review effort: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
Add Carrot credits or activate Agent usage billing to use Autofix |
Summary
管理画面の AJAX シェル(shell.js)で、エラー画面などが
#mainPaneの中に<html>・メニュー・ツリーごと入れ子で表示され、画面が崩れてローディング表示が残る不具合を直します。#483 を作り直したものです。原因
X-Evo-Pane: 1があるかどうかだけで、断片として#mainPaneに差し込むかを決めている(shell.jsのrequest())manager/index.phpは、断片応答のときに header.inc.php / footer.inc.php を読み込まない。しかし、errorHandler::dumpError()や processor の権限エラー画面などは、header/footer を自前で読み込んでいる。そのため、X-Evo-Pane: 1を付けたまま完全な HTML を返していたdumpError()、publish / unpublish / duplicate / undelete / move の各 processor、save_user・save_web_user・save_module、ManagerAPI::getTplModule()などdump_error.tplはtop.main(旧 frameset)で遷移しようとしていたので、シェルでは OK を押しても遷移できなかった#483 との違い
#483 は
dumpError()だけを直していて、次の問題が残っていた。X-Evo-Paneは送らない。二重アクションのエラー(必ず POST)だと、shell.js が jAlert の<script>だけの断片で画面全体を差し替え、真っ白になる。PR 前は完全な HTML で差し替わり、正しく表示されていた$isPaneRequest・定数EVO_PANE_REQUEST・応答ヘッダーの 3 つに分かれる。execute_module はヘッダーを外して変数を戻すが、定数は戻せないので食い違うこの PR では、判定を「
X-Evo-Pane: 1を送ったか」の 1 つにまとめ、header/footer の側で吸収する。変更内容
helpers.php:evoIsPaneResponse()を追加。送信済みの応答ヘッダー(headers_list())にX-Evo-Pane: 1があるかを返すactions/header.inc.php: 断片応答なら何も出力しないactions/footer.inc.php: 断片応答ならevoRenderPaneFooterExtras()(システムアラートと DatePicker)だけを出力するevoRenderPaneFooterExtras(): 1 リクエストで 1 回だけ出力する。processor が読み込む footer.inc.php と、index.php の末尾の両方から呼ばれ得るため。sysAlert()はセッション側だけを空にするので、2 回呼ぶとアラートが二重に出るdump_error.tpl: シェルでは、モーダルを閉じてからEvoShell.navigate()で遷移する。シェルがないときは従来どおりtop.mainを使うshell.js:EvoShell.closeModal({ reloadMain: false })を追加。モーダル内で保存したあとにエラーになった場合、閉じたときの#mainPaneの取り直しと navigate が競合して古い画面が残るのを防ぐアクション確定前のエラーは
X-Evo-Paneを送らないので、これまでどおり完全な HTML で返る。shell.js はドキュメントごと差し替える(POST)か、フルリロードする(GET)。確認方法
php -l(helpers.php・header.inc.php・footer.inc.php)とnode --check(shell.js)で構文を確認したevoIsPaneResponse()を PHP の組み込みサーバーで確かめたX-Evo-Pane: 1→ pane(小文字でも pane)header_remove()で外した場合(execute_module と同じ)→ full0→ fullEvoShell.navigate)#mainPane・メニュー・ツリーが 2 つ、応答 41KB の完全な HTML)EvoShell.openModal)aを付けて送信(アクション確定前・POST)#mainPaneも本文もなくなる)各シナリオで確かめた項目: 応答の
X-Evo-Pane、断片の応答に<html>が含まれないこと、#mainPane・#topMenuが 1 つであること、jAlert が出ること、OK を押したあとにダイアログ・モーダル・ローディング表示(#workText)が残らないこと確認中に見つけた既存の不具合(この PR では直さない)
jAlert()を呼んでも同じ。原因は、body.evo-shellがグリッドで、jquery.alerts が追加した時点の幅(outerWidth)でmin-width/max-widthを固定するため(いずれも 10px になる)checkPermissions()(document.parser.subparser.trait.php)がCOUNT()の結果ではなく、結果の行数(常に 1)で判定しているので、ドキュメントグループによる制限がほぼ効かないWebFXTabPaneの二重宣言エラーがコンソールに出る(main でも同じ)Notes
OnManagerMainFrameHeaderHTMLBlockイベントを発火している。断片応答ではこれを発火しなくなる。index.php は以前から、断片応答では header.inc.php を読み込んでいないので、扱いはそれと同じになる🤖 Generated with Claude Code
https://claude.ai/code/session_012HYGUfDZvEu42YU3ejKKEo