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));  

=== 古い質問はここから始まります。正解は 1 セットのフラグのみで機能しました ===

文字列を保存し、それを使用して、単一のデータ フィールドに属するチェックボックスのグループを魔法のように作成したいと考えています。

私はもうその真っ只中にいます。

私の見解:

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() し、編集ビューでこれを処理するのでしょうか?

これにはもっと良い方法がありますか?

助けてくれてありがとう。

カルロス・ガルシア

==== 解決後、フラグ データのセットが異なる複数のフィールドを持つ問題は、1
つのフィールドに対してのみ保存され、他のフィールドは無視されます ====

こんにちは;
テーブルの 1 つのフィールドでは、前述のように問題なく機能します。
別のフィールド (フラグの別のセット) を使用するのに苦労しています。
動作が 1 つだけ添付されているようです。別々に付けようか迷っていました。

私のフィールド:

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'));  

1 つのフィールドのみが更新されます。

手伝ってくれますか?4 つまたは 5 つのフラグセットを使用します。

どうもありがとう。

カルロス

4

1 に答える 1

1

これを行う適切な方法は、ビヘイビアーを使用することです。これにより、モデルがクリーンに保たれ、これをモデルに配置するだけで複数のモデルに適用できます。

public $actsAs = array('MyBehavior');

今、シリアル化のために私は私のJsonable Behaviorを使用します: http ://www.dereuromark.de/2011/07/05/introducing-two-cakephp-behaviors/ それは基本的にあなたの入力配列を保存時に保存可能な文字列にし、文字列を読み取り時の配列。これはニーズに合わせて簡単に調整できます。

しかし、複数のチェックボックスで何をしたいのかについては、さらに良いことがあります-ビットマスク。私はいわゆるビットマスクされた動作を開発しました-1、2、4、8、...を使用する必要がありますが、それ以外は同じものです: http ://www.dereuromark.de/2012/02/26/bitmasked -using-bitmasks-in-cakephp/ まったく同じ目的で使用しています。

于 2012-05-24T08:32:13.133 に答える