我在 TYPO3 10.4 中使用 femanager 进行前端注册。我创建了一些新字段,除了
textarea
之外,它们都工作正常。
提交注册表时出现错误
Field 'my_new_field' doesn't have a default value'
我的 fe_users.sql 中的条目如下所示:
my_new_field text DEFAULT '' NOT NULL
我的 user.php 的文本区域设置与输入字段的设置相同:
protected $myNewField;
public function getMyNewField(): string
{
return $this->myNewField;
}
public function setMyNewField($myNewField): void
{
$this->myNewField = $myNewField;
}
所以我尝试将sql设置为
NULL
,这使得注册能够工作。
但是,当我使用
getMyNewField() must be of the type string, null returned
时,显示流体模板现在会出现错误
<f:if condition="{user.myNewField}">
让我们先检查一下您的字段定义:
my_new_field text DEFAULT '' NOT NULL
NOT NULL
告诉数据库该值不能为空,并且需要为INSERT
语句设置它。一般来说,如果 NOT设置或在插入语句中设置为
DEFAULT
,则会使用 NULL
值。
但是,TYPO3 支持的所有数据库供应商都不允许为
DEFAULT
字段声明 TEXT
值 - 因此它不跨数据库兼容。
我建议在您的
ext_emconf.sql
中使用以下内容
my_new_field text
避免所有 DBMS 系统的这两个陷阱。
不要在数据库级别声明默认值,而是在该字段的 TCA 定义中进行配置
Configuration/TCA/my_table.php
return [
'my_new_field' => [
// ...
'config' => [
'type' => 'textarea',
'default' => '',
// ...
],
],
];
并在 extbase 模型中使用属性的默认值:
/**
* @var string
**/
protected $myNewField = '';
public function getMyNewField(): string
{
return (string)$this->myNewField;
}
/**
* @param string $myNewField
**/
public function setMyNewField($myNewField): void
{
$this->myNewField = (string)$myNewField;
}
根据您可以确保开发和生产/登台的最低 PHP 版本,您还可以将本机类型添加到 setter 和属性中。因此,使用 PHP7.4 确保您可以在 extbase 模型中使用以下内容
/**
* @var string
**/
protected string $myNewField = '';
public function getMyNewField(): string
{
return $this->myNewField;
}
public function setMyNewField(string $myNewField): void
{
$this->myNewField = $myNewField;
}