【问题标题】:TYPO3 Extbase: How to store NULL in DB for empty numeric fields?TYPO3 Extbase:如何在 DB 中为空数字字段存储 NULL?
【发布时间】:2015-04-10 15:18:34
【问题描述】:

在 Viewhelper 表单中,我有很多数字字段,默认情况下应该为空,而不是填充“0”或“0.00”。

我需要这个,因为 saveAction 中的数据应该有不同的处理方式,这取决于留下的空白字段或填充的值(包括 0)。

为此我将数据库表中的字段属性默认设置为NULL,如:

CREATE TABLE IF NOT EXISTS `tx_myext_domain_model_result` (
    mw double (10,2) DEFAULT NULL,
    mw2 double (10,2) DEFAULT NULL,
    ....
);

TCA 如下所示:

  'mw' => array(
    ...
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'double2,null'
        )
    ),

另外,在Result模型类中,对应的属性初始化为NULL;

/**
 * mw
 *
 * @var float
 */
protected $mw = null;

我进行了这项检查以确保将 NULL 处理给空表单字段的 getter:

public function setMw($mw) {
        if ($mw == NULL)
            $this->mw = 999;
        else
            $this->mw = $mw;
}

这做了我例外的事情:mw 字段 DB 设置为 '999' 用于一个空的表单字段。

但是现在,切换回正常的二传手,

public function setMw($mw) {
       $this->mw = $mw;
}

只有当所有其他表单字段也都为空时,DB 表中的字段才为空。 IE。只要我在其中一个表单域中输入值,所有其他空表单域都会在保存时设置为“0”。

在 TCA eval 字段中添加 null 也没有奏效。

如何改变这种行为?我正在使用 TYPO3 6.2.x

【问题讨论】:

  • 您的 TCA 配置是什么?也许您可以在控制器中使用type converter (initializeAction)。
  • 添加了 TCA。如何使用类型转换器?我不会改变类型;我只是 NULL 应该保持 NULL。操作不应该是问题,因为 NULL 到达 getter。

标签: typo3 extbase typo3-6.2.x


【解决方案1】:

第 1 步:在 initializeAction 中为属性设置 null 第 2 步:检查 $mw 是否为空的想法是个好主意。 TYPO3 并不总是做你可以使用逻辑思维假设的事情:) 所以检查if(is_null($mw)) $this->mw = null

这两件事应该可以解决问题

你也可以在setter param中设置一个默认值

setMw($mw = null)

【讨论】:

  • 我不明白为什么 $mw is NULL 时 $this->mw = $mw$this->mw = NULL 之间有区别?在 initializeAction 中设置 null 是什么意思?该属性不应始终为空,仅当表单字段为空时...is_null() 不起作用,因为 0 应存储在数据库中。
  • 1.当您认为 TYPO3 将设置为 2 时,它可能不会设置为 null。initializeAction 是每个模型中都有的操作,但您不需要使用它。它初始化不同的东西。例如,如果您有集合而不是我这个动作,您将对其进行初始化。它是一种构造函数 3。如果 null 应该仅在它为空时为空,那么当您将属性的默认值设置为 null 时,它应该可以解决问题。我写道:setMw($mw = null) 这会将 null 设置为默认值
  • 1.这与 TYPO3 无关,它只是 PHP - 或逻辑:就像说 $mw = 1; $this->mw = $mw$this->mw = 1; 会产生不同的效果一样。 2. 我知道什么是 intitializeAction ,但这将如何解决我的问题?当它为 NULL 时,为什么我应该在那里设置 $mw=NULL 呢? NULL 到达他的设置器,因此该操作不会改变任何内容 3. 我只想在设置 $mw=NULL 时将 NULL 存储在数据库中(等于空的表单字段)。但出于某种原因,Extbase 不允许这样做。 setMw($mw = null) 和调用 setMw(null) 应该会导致相同的结果。
  • 关于it's just PHP,你可能会惊讶于我把头撞到墙上多少次,因为我和你一样想;)回到问题。空表单字段不会总是在 extbase 的 setter 方法中设置为 null。我认为您应该尝试将默认 null 设置为 setter 的参数。关于你是正确的initializeAction。如果我们谈论的是现有对象,那么它将没有效果,它只会在创建新对象时生效。我仍然认为在 setter 中将 null 作为默认值会有所帮助。你试过了吗?
  • :) 你找到我了——我昨天没试过。但是现在我检查了它,它也不起作用。顺便说一句,我得到了一个提示,if ($mw == NULL) 没有做我期望的事情,因为0 == NULL 是真的......所以它仍然是合乎逻辑的。我必须检查三重===
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多