1

CakePHP (2.2) アプリの一部として、ユーザー コントローラー admin_add() に書いています。ユーザーがアクセスできるドキュメントに関連する一連のチェック ボックスが必要です。ただし、各チェック ボックスの結果を同じ DB フィールドに入力する必要があります。

たとえば、値が 1、2、および 3 の 3 つのチェックボックスがあるとします。3 つすべてにチェックを入れると、次の文字列と同じ db フィールドに入ります。

1,2,3

これどうやってするの?

私はこれが厄介であることを知っており、通常はこれを ACL で制御しますが、これを別の方法で行う必要が生じました (主に、このアプリの以前の化身が作成された方法と、私の制御外の他の要因による)。

前もって感謝します

デビッドのコメントを更新**

以下のように、提案されたコードのわずかに修正されたバージョンがあります。

if(isset($this->request->data['User'])){
    foreach($this->request->data['User']['manuals'] as $key => $value) {
    if ($value == 1) {
        $field .= $key .", ";
    }
}
    $this->request->data['User']['manuals'] = rtrim($field, ', ');
}

このコードは、コントローラーの add() 関数 (必要に応じて正しい文字列を db に書き込みます) で正常に動作しますが、beforeSave() モデル関数で実行すると次のエラーが発生しました

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Array' in 'field list'

上記のエラーの原因となる SQL ステートメントは次のとおりです。

SQL Query: INSERT INTO `cakeapp`.`users` (`webforms_email`, `manuals_email`, `user_status_id`, `view_uat`, `username`, `password`, `forename`, `surname`, `company`, `position`, `version_numbers_id`, `support_case_reference`, `support_web_password`, `group_id`, `manuals`, `modified`, `created`) VALUES ('1', '1', 2, '1', 't800@cyberdyne.com', '48e813c14688aff66054d1f1eb93c02d977648c1', 'T800', '101', 'Cyberdyne', 'terminator', 1, '', '', 14, Array, '2012-11-21 12:28:33', '2012-11-21 12:28:33')

問題は、配列の内容ではなく、挿入しようとしている配列にあるようです。何か案は?ご協力いただきありがとうございます。

ご要望に応じて -

public function beforeSave() {

    // Added this if for cases when user being saved but password isnt set 
    if (isset($this->data['User']['password'])) {       
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
        return true;
    }


    if(isset($this->request->data['User'])){
        foreach($this->request->data['User']['manuals'] as $key => $value) {
            if ($value == 1) {
                $field .= $key .", ";
            }
        }
        $this->request->data['User']['manuals'] = rtrim($field, ', ');
    }


}

add() での $this->request->data のデバッグ:

array(
'User' => array(
    'password' => '*****',
    'username' => 'test@test.com',
    'forename' => 'James',
    'surname' => 'Jacobs',
    'company' => 'Company name',
    'position' => 'Web dev',
    'version_numbers_id' => '1',
    'support_case_reference' => '',
    'support_web_password' => '',
    'webforms_email' => '0',
    'manuals_email' => '0',
    'group_id' => '14',
    'user_status_id' => '1',
    'view_uat' => '1',
    'manuals' => array(
        (int) 36 => '1',
        (int) 31 => '1',
        (int) 32 => '1',
        (int) 33 => '1',
        (int) 34 => '0',
        (int) 35 => '0',
        (int) 37 => '0',
        (int) 38 => '0',
        (int) 39 => '0',
        (int) 40 => '0',
        (int) 41 => '0',
        (int) 30 => '0',
        (int) 29 => '0',
        (int) 24 => '0',
        (int) 25 => '0',
        (int) 26 => '0',
        (int) 27 => '0',
        (int) 28 => '0',
        (int) 47 => '0',
        (int) 48 => '0',
        (int) 49 => '0',
        (int) 118 => '0',
        (int) 117 => '0',
        (int) 94 => '0',
        (int) 88 => '0',
        (int) 51 => '0',
        (int) 50 => '0',
        (int) 46 => '0',
        (int) 45 => '0',
        (int) 9 => '0',
        (int) 6 => '0',
        (int) 5 => '0',
        (int) 10 => '0',
        (int) 4 => '0',
        (int) 44 => '0',
        (int) 7 => '0',
        (int) 43 => '0',
        (int) 42 => '0',
        (int) 125 => '0',
        (int) 124 => '0',
        (int) 127 => '0',
        (int) 129 => '0',
        (int) 130 => '0',
        (int) 126 => '0',
        (int) 131 => '0',
        (int) 132 => '0',
        (int) 133 => '0',
        (int) 134 => '0',
        (int) 135 => '0',
        (int) 136 => '0',
        (int) 137 => '0',
        (int) 168 => '0',
        (int) 123 => '0',
        (int) 128 => '0',
        (int) 97 => '0',
        (int) 91 => '0',
        (int) 101 => '0',
        (int) 100 => '0',
        (int) 98 => '0',
        (int) 92 => '0',
        (int) 95 => '0',
        (int) 93 => '0',
        (int) 74 => '0',
        (int) 120 => '0',
        (int) 73 => '0',
        (int) 75 => '0',
        (int) 76 => '0',
        (int) 72 => '0',
        (int) 122 => '0',
        (int) 119 => '0',
        (int) 175 => '0',
        (int) 174 => '0',
        (int) 173 => '0',
        (int) 172 => '0',
        (int) 171 => '0',
        (int) 170 => '0',
        (int) 169 => '0',
        (int) 176 => '0'
    ),
    'filename' => array(
        'name' => '',
        'type' => '',
        'tmp_name' => '',
        'error' => (int) 4,
        'size' => (int) 0
    )
)

)

4

1 に答える 1

1

これを行う場合、モデルのコールバック関数を使用します。

あなたのUserモデルでは、beforeSave(). 実装は異なる場合がありますが、以下の簡単な例からアイデアを得ることができれば幸いです。

public function beforeSave(){
  if(isset($this->data['User']){
    foreach($this->data['User']['documents'] as $doc){
       $field .= $doc .", ";
    }
    $this->data['User']['allowed_docs'] = rtrim($field, ', ');
  }
}
于 2012-11-20T15:44:47.653 に答える