如何修复“字段没有默认值”?

问题描述 投票:0回答:1

我在 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}">

typo3 fluid typo3-10.x
1个回答
0
投票

让我们先检查一下您的字段定义:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.