[PHP8のみ] Doc Manager「テンプレート変数」が動作しない

質問全般・改善要望
返信する
okazunori
メンバー
メンバー
記事: 21
登録日時: 2020年12月21日(月) 21:15

[PHP8のみ] Doc Manager「テンプレート変数」が動作しない

投稿記事 by okazunori »

お世話になっております。
エラーが出ましたので報告します。

【現象】
注:PHP7.4だと正常に動きます
Doc Manegerの「テンプレート変数」が動作しません。
本来であればテンプレート名のラジオボタンを選択すると下部にテンプレート変数一覧が出るはずですが、反応がありません。
イベントログに下記のエラーが記録されていました。

【環境】
さくらのレンタルサーバ
MODX 1.2.0J
PHP 8.3.8
MySQL 8.0.40

【エラーメッセージ】
Parser line:59
« PHP Parse Error »
PHP error debug
Error : Undefined array key "value"
ErrorType[num] : WARNING[2]
File : /*/assets/modules/docmanager/tv.ajax.php
Line : 59
Source : $row['value'],
LastQuery : SELECT * FROM `modx`.`modx_site_tmplvars` tv LEFT JOIN `modx`.`modx_site_tmplvar_templates` tvtpl ON tv.id = tvtpl.tmplvarid WHERE tvtpl.templateid ='2'
Basic info
REQUEST_URI : /assets/modules/docmanager/tv.ajax.php
Referer : https://*/manager/index.php?a=112&id=1
User Agent : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.2 Safari/605.1.15
Backtrace
(空白でした)
okazunori
メンバー
メンバー
記事: 21
登録日時: 2020年12月21日(月) 21:15

[PHP8のみ] Doc Manager「テンプレート変数」が動作しない

投稿記事 by okazunori »

本件、原因は分かったような気がします。

/home/techmation/www/techmation.co.jp/assets/modules/docmanager/tv.ajax.php
28行目

コード: 全て選択

$rs = db()->select(
    '*',
    ["[+prefix+]site_tmplvars tv", "LEFT JOIN [+prefix+]site_tmplvar_templates tvtpl ON tv.id = tvtpl.tmplvarid"],
    "tvtpl.templateid ='" . $tplID . "'"
はテンプレート変数の定義の取得なのでtvc.value='value'が存在しないはずです。
そのため59行目の

コード: 全て選択

            $row['value'],
で`Undefined array key "value"`が発生します。
応急処置で、

コード: 全て選択

            $row['value'] ?? '',
としました。

ところが今度は`Undefined array key 1`エラーが発生しました。
テンプレート変数(dropdown)のオプション('elements')が'継承==||0||1'の場合に発生しているようです。

/home/techmation/www/techmation.co.jp/assets/modules/docmanager/tv.ajax.php
137行目

コード: 全て選択

                [$item, $itemvalue] = (is_array($itemvalue)) ? $itemvalue : explode("==", $itemvalue);
'elements'が`string==var`の形式でないとexplode("==", $itemvalue)で要素がひとつだけの配列が作られてしまうため`Undefined array key 1`が発生してしまいます。
'dropdown'だけでなく'listbox'、'checkbox'、'option'でも同じ処理があります。

一か所対応するとまた別の個所がWARNINGになる。yama様の苦労がほんの少しですが分かりました。
もう少し考えてみます。
返信する