TYPO3扩展:'字段列表中的未知列'错误

时间:2017-12-06 14:12:38

标签: typo3

基本上:每次我使用extension_builder添加新的类/模型然后想要创建该类的记录时,我会收到以下错误消息:

  

2:SQL错误:'未知列'已编辑'在'字段列表''   (tx_icingaconfgen_domain_model_checkperiod:NEW5a27f9da8a41d636846075)

有趣的是:“编辑”不是该类的属性,而是该扩展中其他类的属性。我已经搜索了抛出错误的类的TCA以及MySql表本身,但是“编辑”字段确实不是该类的一部分。这是怎么回事?

编辑:我感到有趣的是,当我手动向MySql表添加“已编辑”列时,可以创建记录。但我绝不会在我的模型中使用此属性。为什么它需要该名称的MySql列呢?

2 个答案:

答案 0 :(得分:0)

如果没有看到代码,我只能猜测是怎么回事。当记录持续存在时,该领域肯定是必需的。所以你有可能在你的TCA中引用它。如果不在columns部分的ctrl中:

'ctrl' => [
    'tstamp' => 'tstamp',
    'crdate' => 'crdate',
    'cruser_id' => 'cruser_id',
    ...
],

如果更改或创建了recods,这些字段会自动更新。这些领域更多。请检查您的ctrl部分。

也可以将另一个属性(甚至可能是另一个类)映射到TypoScript中的数据库字段,如下所示:

plugin.tx_myextension {
    persistence {
        classes {
            MyVendor\MyExtension\Domain\Model\Person {
                mapping {
                    tableName = tt_address
                    recordType = \MyVendor\MyExtension\Domain\Model\Person
                    columns {
                        birthday.mapOnProperty = dateOfBirth
                    }
                }
            }
        }
    }
}

取自here

的示例

答案 1 :(得分:0)

事实证明,罪魁祸首实际上是ext_localconf.php中的这行代码:

$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['extkey'] = 'Cjk\\Icingaconfgen\\Hook\\EvalHook';
$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['extkey'] = 'Cjk\\Icingaconfgen\\Hook\\EvalHook';

这是我在我的扩展中实现的一个钩子,它只标记是否在BE中编辑了一条记录。我实际上使用这个Hook,每当编辑一个记录时,将编辑的propety从0改为1.这当然是预期的,但是类checkperiod没有属性'edited'。但由于Datamapper的钩子适用于每个更改或创建的记录,因此它也会尝试在没有此属性的类中更改“已编辑”。 Hook本身的一个简单的if条件,如果$ fieldArray的'编辑'键是NULL解决了我的问题。

class EvalHook {
    function processDatamap_postProcessFieldArray($status, $table, $id, &$fieldArray, &$pObj) {


            if($status == "update" && $table != 'tx_icingaconfgen_domain_model_checkperiod'){
            $fieldArray[edited] = 1;
            }
            elseif($status != "update" && $table != 'tx_icingaconfgen_domain_model_checkperiod){
                $fieldArray[edited] = 0;
            }


            }


}