2012-03-18 3 views
1

私は、多くの楽器とジャンルを持つユーザーモデルを持っています。以下のコードを使用すると、楽器とジャンルは保存されません。CakePHP:ユーザーデータの保存すべてが自動的に失敗しますか?

$this->User->saveAll($this->data, array(
       'fieldList' => array('User', 'UserInstrument', 'Genre'))) 
     ) 

ただし、ユーザーには表示されません。私のデバッガ(User, UserInstrument, Genre, UserGenre, Instrument)ではすべてのinvalidFields配列が空です。

私は気づい一つ奇妙なことは、しかし、ここにいることである:

public function beforeSave() { 
     // get the password reset 
     if(isset($this->data[$this->alias]['password_reset'])) { 
      $this->data[$this->alias]['password'] = $this->data[$this->alias]['password_reset']; 
      unset($this->data[$this->alias]['password_reset']); 
     } 
     // get rid of the password confirm 
     if(isset($this->data[$this->alias]['password_confirm'])) { 
      unset($this->data[$this->alias]['password_confirm']); 
     } 
     // hash the password 
     if (isset($this->data[$this->alias]['password'])) { 
      $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']); 
     } 
     return true; 
    } 

私はpassword_resetpassword_confirmを設定解除していますが、保存が完了した後、これらのフィールドは魔法おそらく($this->data['User']に戻って表示されます再び$_POSTから取得)。しかし、エラーがあった場合には、saveAllはfalseを返します。私はエラーログにも何も持っていません。

なぜこれが黙って失敗しているのですか?ありがとう!

答えて

0

私はfieldListを取り出しました。最も安全な解決策ではありませんが、これは単なる価値よりも面倒なことでした。

1

あなたの目的は、新しく作成したユーザーのためにハッシングを使用する場合、単純に

public function beforeSave() { 
    if (isset($this->data[$this->alias]['password'])) { 
     $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']); 
    } 
    return true; 
} 

あるthis

特にbeforeSave機能を参照してくださいあなたは、そのフィールドが含まれている場合、CakePHPではそれを理解してください実際にはモデルのデータテーブルにはないので、そのフィールドは無視されます。したがって、実際にpassword_resetとpassword_confirmフィールドの設定を解除する必要はありません。

関連するレコードを保存し、fieldListを使用すると、保存するフィールドを配列のfieldListキーに明示的に記述していないことがわかりました。

さらに、ユーザーが持っている多くの楽器とユーザーはhasManyジャンルであると述べました。

saveAssociatedの方法でご利用ください。

は、コントローラでは、このようなあなたのデータを準備します

$this->data['Instrument'] = array(
    array('instrument_field1'=>'v1', 
      'instrument_field2' => 'v2', 
     ),// first instrument 
    array('instrument_field1' => 'v1', 
      'instrument_field2' => 'v2')// second instrument 
); 

$this->data['Genre'] = array(
    array('field1'=>'v1', 
      'field2' => 'v2', 
     ),// first genre 
    array('field1' => 'v1', 
      'field2' => 'v2')// second genre 
); 

ORフォームであなたはこのような何か:私は質問を誤解している場合私の答えで

$this->Form->input('Instrument.0.field1'); // for the first instrument 
$this->Form->input('Instrument.1.field1'); // for the second instrument 

コメント。

+0

こんにちはKimsia、応答のために感謝します。私の 'beforeSave()'では、パスワードのハッシング**と**パスワードのリセットを受け入れています。これはユーザーが自分のアカウントを編集しているときに利用できます。 楽器とジャンルは、適切に保存されます。 'fieldList'に特定のフィールドを追加して、それが正しく保存されているかどうかを確認してから、ここにコメントします。 助けてくれてありがとう。 – Garrett

+0

こんにちは@Garrett、これは私が通常ユーザー作成とユーザー更新のために行うことです。 新しいユーザーを作成するには、createNewUserDuringSignupという別のメソッドを使用する傾向があります。 このメソッドの内部では、$ this-> create();新しいユーザーのための他の関連するもの。 パスワードを更新するために、別の方法もあります。 beforeSaveに関しては、フィールドが存在することを確認するためにissetを追加する以外は、あなたのようにパスワードをハッシュします。 パスワードをリセットするためのnew_passwordというフィールドもハッシュします。 実際のコードを使用して詳細な説明が必要な場合はお知らせください。私はページ –

+0

をやるつもりですので、もっと詳しい説明が必要ですか? –

関連する問題