Cakephp 3:自定义数据类型无法正常工作

时间:2017-08-08 13:10:47

标签: php cakephp cakephp-3.0

我正在尝试在cakephp 3中为多选下拉菜单创建自定义数据类型。我的表单中有一个multiple => true控件:

- PHP
- HTML
- CSS

当我提交此表单时,我将该控件的值作为数组(0 => PHP, 1 => HTML)获取,这很好,现在我想以字符串格式保存这些值,如PHP,HTML并检索再次作为阵列返回。

保存此输入进展顺利,但仅以string的形式检索数据。为此我遵循了这个answer并创建了一个自定义数据类型:

class MultiSelectType extends Type
{
    public function toPHP($value, Driver $driver)
    {
        if (!$value) {
            return null;
        }
        return explode(',', $value);
    }

    public function marshal($value)
    {
        return explode(',', $value);
    }

    public function toDatabase($value, Driver $driver)
    {
        return implode(',', $value);
    }

    public function toStatement($value, Driver $driver)
    {
        if ($value === null) {
            return PDO::PARAM_NULL;
        }
        return PDO::PARAM_STR;
    }
}

如何修改此代码

  1. 返回array,以便我的表单会自动从多个选择框中选择值。

  2. 只要我想将该值显示为字符串,
  3. 就会返回string

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,您最好正确地规范化您的架构并使用belongsToMany关联。数据(目前)只是“装饰”的事实并不是放弃正常化的好理由。

话虽如此,这种类型看起来还不错。如果仅检索数据存在问题,那么我只能猜测实际上没有应用该类型,这可能是检索数据的表对象的问题。

但是,您无法使用类型对象在视图层进行决策,到那时类型对象已经完成了它们的工作。如果您需要视图中的数据有时是数组,有时是字符串,那么最好总是以数组格式检索它,并使用帮助器将其转换为字符串列表,或者甚至可以使用虚拟属性相应的实体类(但请记住,实体不应该真正负责演示)。

另见