2011-08-12 10 views
1

私はいくつかのbeforeSaveロジックをCakePHP 2.0ベータ版に書こうとしています。基本的に私は、ユーザーがタグのような機能のためにテキストを提出できるようにしたい。 beforeSave関数は、関連するテーブルを検索します。タグが存在する場合はそれをプライマリレコードにリンクし、存在しない場合は新しいタグ&を作成してリンクします。CakePHP beforeSave&HABTM

Array 
(
    [Project] => Array 
     (
      [id] => 2 
      [title] => Project Title 
      ... 
     ) 

    [Term] => Array 
     (
      [Term] => Array 
       (
        [0] => Array 
         (
          [id] => 10 
         ) 

        [1] => Array 
         (
          [id] => 2 
         ) 

       ) 

     ) 

) 
:これは基本的にこのような配列を作成し、記録を作成し、必要な場合や既存のレコードを見つけ、私が望むように動作します

function beforeSave() { 
    if(!empty($this->data['Term']) && isset($this->Term)){ 
     $terms = $this->Term->find('list'); 
     $terms = array_flip($terms); 

     foreach($this->data['Term'] as $key => $term){ 
      if(!empty($terms[$term['name']])){ 
       $this->data['Term']['Term'][$key]['id'] = $terms[$term['name']]; 
       unset($this->data['Term'][$key]); 
      }else{ 
       $this->Term->create(); 
       $this->Term->save(array('Term' => array('name' => $term['name']))); 
       $this->data['Term']['Term'][$key]['id'] = $this->Term->id; 
       unset($this->data['Term'][$key]); 
      } 
     } 
    } 

    return true; 
} 

:だからここ

は(beforeSaveで)私の機能です

また、プライマリモデル(プロジェクト)にデータを正常に保存します。しかし、[Term] [Term]の関連は無視されます。私はこれがHABTMの関連付けを保存するのに正しい配列構造であると確信しています。

誰でもこれが間違っていますか?

答えて

0

ビューでは、1つの入力テキスト$form->input('terms');が必要です。ユーザーはすべてのタグを入力できます。したがってbeforeSaveには、タグ(または用語)の文字列があります。配列にスライスして、用語を見つけ(「リスト」)、いくつかの配列が交差するようにしたいかもしれません。しかし、最終的に、あなたはSAVEALLを使用するには、このような何かを見るためにデータを必要とする:

Array 
(
[Project] => Array 
    (
     [id] => 2 
     [title] => Project Title 
     ... 
    ) 
[Term] => Array 
    (
     [Term] => Array 
      (
       [0] => 10 // id of the tag 
       [1] => 2 
      ) 
    ) 

+0

私は実際にフォームヘルパーを使用していないんだけど、フィールドは次のようになります。 'これは私がフォームヘルパーを使用しない理由です:http:// groups ' – bjudson

+0

.google.com/group/cake-php/browse_thread/thread/cdf1aaf3fe350695 – bjudson

+0

ループする必要はありません(ケーキ本の例ではループがありません)。たぶんあなたがそれをしたので、データは保存されませんでした。 –