SitmapスニペットをPHP8に対応させました  【解決済み】

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

SitmapスニペットをPHP8に対応させました  【解決済み】

投稿記事 by okazunori »

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

https://github.com/modxcms-jp/sitemap
こちらのSitemapスニペットをPHP8に対応させるため最小限の修正をしました。
ただし「document.parser.class.inc.php」でエラーが出るので、こちらの修正も条件です。

Error : Undefined variable $result
ErrorType[num] : WARNING[2]
File : /*/manager/includes/document.parser.class.inc.php
Line : 4751
Source : return $result;
Execution Context : Snippet - Sitemap

8 $modx->evalSnippet()
manager/includes/document.parser.class.inc.php on line 3208
9 eval()
manager/includes/document.parser.class.inc.php on line 2779
10 getDocs()
manager/includes/document.parser.class.inc.php(2779) : eval()'d code on line 95
11 getDocs()
manager/includes/document.parser.class.inc.php(2779) : eval()'d code on line 265
12 getTV()
manager/includes/document.parser.class.inc.php(2779) : eval()'d code on line 259
13 $modx->getTemplateVar()
manager/includes/document.parser.class.inc.php(2779) : eval()'d code on line 220
14 $modx->getTemplateVars()
manager/includes/document.parser.class.inc.php on line 4721


該当するブロックは下記です。

コード: 全て選択

if (!$resource['template']) {
    foreach ($resource as $key => $value) {
        if ($idnames === '*' || (is_string($idnames) && in_array($key, explode(',', $idnames)))) {
            $result[] = ['name' => $key, 'value' => $value];
        }
    }
    return $result;  // 4,751行目
}
Sitemapスニペットを使うページはテンプレート「blank」を指定します。
ところがテンプレートID:0にはテンプレート変数が存在しないため$resultは未定義のままとなります。

4,785行目の「$result = [];」を関数定義直後の4,728行目に移動すればエラーは回避できますが、これが本当に正しい修正なのか自信がありません。
私の環境では今のところ他に影響は出ていないようです。
添付ファイル
sitemap_1.0.12.txt
(11.85 KiB) ダウンロード数: 23 回
最後に編集したユーザー okazunori [ 2026年1月19日(月) 13:04 ], 累計 1 回
アバター
yama
管理人
記事: 3267
登録日時: 2009年7月29日(水) 02:50

SitmapスニペットをPHP8に対応させました【条件あり】

投稿記事 by yama »

https://github.com/modxcms-jp/evolution ... 53b47c4a78
https://github.com/modxcms-jp/evolution ... ds/dev.zip
他にも同様の箇所がいくつかあったので、まとめて修正しました
okazunori
メンバー
メンバー
記事: 7
登録日時: 2020年12月21日(月) 21:15

SitmapスニペットをPHP8に対応させました【条件あり】

投稿記事 by okazunori »

修正ありがとうございます。

コード: 全て選択

public function getTemplateVars($idnames = '*', $fields = '*', $docid = '', $published = 1, $sort = 'rank', $dir = 'ASC')
{
    $result = [];  // 初期化を追加
    // get document record
    if ($docid === '' && $this->documentIdentifier) {
上記のように関数定義直後に追加するのではなくて、

コード: 全て選択

if (!$resource['template']) {
    $result = [];  // 初期化を追加
    foreach ($resource as $key => $value) {
ブロックごとに初期化するのですね。参考になります __φ(・д・。)
返信する