0

我正在使用 cakephp 2.1,让我告诉你:我就是喜欢它。
在我的表单中,我有一个可以有多个答案的字段(复选框)。
我不想为每个选项创建一个数据库字段,也不想使用 HABTM。

更新:

因为我需要几组标志,所以我采用了 $hasAndBelongsToMany 的方式。(也可以在不修复代码但编辑表格的情况下添加新标志(例如,通过 phpmyadmin)。

1.-为我需要的每组标志制作一个表格/模型:

2.- 在我的主要模型中,声明了与每个模型的关系:

var $hasAndBelongsToMany = array('Sample','Format','Report','Openend','Dataproce','Prefield');  

3.- 在我的主控制器中,为每个表填充一个数组以使用:

$openends = $this->Project->Openend->find('list', array(
                    //'order' => 'name'
            ));

4.-并在视图中使用数组:

echo $this->Form->input('Dataproce', array('label' => false, 'type' => 'select', 'multiple' => 'checkbox', 'size' => 2));  

=== 老问题从这里开始;正确答案仅适用于一组标志 ===

我想保存一个字符串并用它来神奇地创建一组属于单个数据字段的复选框。

我已经在中间了。

我的观点:

echo $this->Form->input('pr_reports', array('type' => 'select',
                             'multiple' => 'checkbox',
                             'options' => array('0' => 'Interrnal',
                                                '1' => 'Disposition',
                                                '2' => 'Web Disposition',
                                                '3' => 'Marginal',
                                                '4' => 'Custom')))

我的控制器添加方法,在保存之前

        // Used serialize() to convert the array to string
        $dataString = serialize($this->request->data['Project']['pr_reports']);
        $this->request->data['Project']['pr_reports'] = $dataString;

字符串正在被保存(编码它似乎但没问题:a:5:{i:0;s)

我的问题是在编辑记录以使复选框相应地检查自己时,我将如何进行?也就是说,我在哪里 unserialize() 字符串字段并在编辑视图上处理它?

有没有更好的方法呢?

非常感谢您的帮助。

卡洛斯·加西亚

==== 解决后,有多个字段的不同标志
数据的麻烦只保存一个字段,忽略另一个====

你好;
对于表格上的一个字段,它可以正常工作,如前所述;
我很难使用另一个字段(单独的一组标志)。
似乎只附加了一种行为;我想知道我是否应该以不同的方式附加它们。

我的领域:

pr_data_format` tinyint(3) unsigned NOT NULL,
pr_report_format` tinyint(3) unsigned NOT NULL,  

我的控制器

$this->Project->Behaviors->attach('Bitmasked', array('mappedField'=>'pr_data_formats', 'bits'=>'Project::pr_data_formats'));
$this->Project->Behaviors->attach('Bitmasked', array('mappedField'=>'pr_report_formats', 'bits'=>'Project::pr_report_formats'));

我的模型

        const STATUS_ASCII = 1;
        const STATUS_SPSS = 2;
        const STATUS_EXCEL = 4;
        const STATUS_CUSTOM = 8;

        public static function pr_data_formats($value = null) {
            $options = array(
                self::STATUS_ASCII => __('ASCIId'),
                self::STATUS_SPSS => __('SPSSBd'),
                self::STATUS_EXCEL => __('Exceld'),
                self::STATUS_CUSTOM => __('Customd'),
            );
            return parent::enum($value, $options);
        }                    


        const REP_ASCII = 1;
        const REP_SPSS = 2;
        const REP_EXCEL = 4;
        const REP_CUSTOM = 8;

        public static function pr_report_formats($value = null) {
            $options = array(
                self::REP_ASCII => __('ASCIIr'),
                self::REP_SPSS => __('SPSSBr'),
                self::REP_EXCEL => __('Excelr'),
                self::REP_CUSTOM => __('Customr'),
            );
            return parent::enum($value, $options);
        }                                

我的观点

echo $this->Form->input('pr_data_formats', array('options' => Project::pr_data_formats(), 'multiple' => 'checkbox'));
echo $this->Form->input('pr_report_formats', array('options' => Project::pr_report_formats(), 'multiple' => 'checkbox'));

就是想不通,试了下:

$this->Project->Behaviors->attach('Bitmasked', array('mappedField'=>'pr_report_formats', 'bits'=>'Project::pr_report_formats'), array('mappedField'=>'pr_data_formats', 'bits'=>'Project::pr_data_formats'));  

但没有用,只更新了一个字段。

你能帮我吗?我们将使用大约 4 或 5 个标志集。

非常感谢。

卡洛斯

4

1 回答 1

1

正确的方法是使用行为。这使您的模型保持干净,只需将其放入模型中即可应用于多个模型:

public $actsAs = array('MyBehavior');

现在,对于序列化,我使用我的 Jsonable 行为: http: //www.dereuromark.de/2011/07/05/introducing-two-cakephp-behaviors/ 它基本上使您的输入数组在保存时成为可存储的字符串,并将字符串返回到读取数组。您可以轻松地根据自己的需要进行调整。

但是对于您想要对多个复选框执行的操作,甚至还有更好的方法 - 位掩码。我开发了一种所谓的 Bitmasked 行为 - 你需要使用 1,2,4,8,... 但除此之外它是相同的: http: //www.dereuromark.de/2012/02/26/bitmasked -using-bitmasks-in-cakephp/ 我完全用它来做同样的事情。

于 2012-05-24T08:32:13.133 回答