2017-08-08 98 views
0

我想在cakephp 3中为多选择下拉菜单创建一个自定义数据类型。我在我的形式multiple => true控制:Cakephp 3:自定义数据类型不能正常工作

- 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. 得到string只要我想显示该值为一个字符串。

+1

首先,为什么?为什么不使用正确的'1:n',或者更好的'n:m'相关联? – ndm

+0

@ndm该数据没有太多的意义,只是在视图模式下显示它作为一个字符串,这就是为什么我没有正常化它 –

+0

但为了更干净的代码,我试图做到这一点... –

回答

0

正如在评论中提到,你最好适当正常化您的架构,并使用belongsToMany关联。数据是(目前)只是“装饰”的事实不是一个正常化的好时机。

这就是说,类型看起来OK-ISH。如果仅在检索数据时出现问题,那么我只能猜测该类型实际上未应用,这可能是检索数据的表对象的问题。

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

又见

+0

首先我尝试了setter和getters,但没有奏效(可能在那里我可能会做一些错误)..然后我诉诸这个解决方案...但是,感谢正确的方向使用协会..我会重构我的数据库结构的那部分.. –

+0

我没有创建虚拟财产,但修改了一次实际。 。 –