ページ 11

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

Posted: 2026年1月10日(土) 13:31
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行目に移動すればエラーは回避できますが、これが本当に正しい修正なのか自信がありません。
私の環境では今のところ他に影響は出ていないようです。

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

Posted: 2026年1月17日(土) 22:11
by yama
https://github.com/modxcms-jp/evolution ... 53b47c4a78
https://github.com/modxcms-jp/evolution ... ds/dev.zip
他にも同様の箇所がいくつかあったので、まとめて修正しました

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

Posted: 2026年1月19日(月) 13:01
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) {
ブロックごとに初期化するのですね。参考になります __φ(・д・。)