ページ 11

getTemplateVars()で$fieldsを指定するとエラーになる

Posted: 2026年1月31日(土) 17:19
by okazunori
ほぼ影響はないと思いますがご報告します。
getTemplateVars()で$fieldsに空文字と'*'以外の文字列を指定するとArray to string conversionエラーになります。

コード: 全て選択

# document.parser.class.inc.php Line:4754から
        if ($fields === '*' || $fields === '') {
            $fields = "tv.*, IF(tvc.value!='',tvc.value,tv.default_text) as value";
        } else {
            $fields = sprintf(
                "%s, IF(tvc.value!='',tvc.value,tv.default_text) as value",
                array_map(
                    function ($v) {
                        return 'tv.' . $v;
                    },
                    explode(',', $fields)
                )
            );
        }

sprintf()の%sに対して、array_map()の戻り値である配列を渡しているのが原因だと思います。
evo()->join()を使用して、

コード: 全て選択

        if ($fields === '*' || $fields === '') {
            $fields = "tv.*, IF(tvc.value!='',tvc.value,tv.default_text) as value";
        } else {
            $fields = sprintf(
                "%s, IF(tvc.value!='',tvc.value,tv.default_text) as value",
                evo()->join(',', explode(',', $fields), 'tv.')
            );
        }
とすれば回避できました。

'value'は指定しなくても取得しますが、これは仕様なんですね。
と思ったのですが、$fields='value'とするとUnknown column 'tv.value' in 'field list'エラーになります。
実装した方には大変申し訳ないのですが、修正する手間と現実には'*'しか使われていないことを考えると、いっそのこと

コード: 全て選択

$fields = "tv.*, IF(tvc.value!='',tvc.value,tv.default_text) as value";
だけにして['id']や['value']で取得させる方が良い気がしてきました。

getTemplateVars()で$fieldsを指定するとエラーになる

Posted: 2026年1月31日(土) 19:05
by okazunori
下手くそですが修正案です。
$fields='value'、$fields='id, value'でも取得できます。

コード: 全て選択

        if ($fields === '*' || $fields === '') {
            $fields = "tv.*, IF(tvc.value!='',tvc.value,tv.default_text) as value";
        } else {
            $fieldsArr = array_map('trim', explode(',', $fields));
            $fieldsArr = array_diff($fieldsArr, ['value']);
            $joinedFields = evo()->join(',', $fieldsArr, 'tv.');
            $fields = ($joinedFields ? $joinedFields . ',' : '')
            . "IF(tvc.value!='',tvc.value,tv.default_text) as value";
        }