1

CakePHP2.0ベータ版でbeforeSaveロジックを書き込もうとしています。基本的に、ユーザーがタグのような機能のためにテキストを送信できるようにしたいと思います。beforeSave関数は、関連するテーブルを検索します。タグが存在する場合は、プライマリレコードにリンクし、存在しない場合は、新しいタグを作成してからリンクします。

これが私の関数です(beforeSaveにあります):

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

これは基本的に私が望むように機能し、必要に応じてレコードを作成し、既存のレコードを見つけて、次のような配列を作成します。

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

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

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

                )

        )

)

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

誰かがこれの何が悪いのかわかりますか?

4

1 に答える 1

0

ビューには$form->input('terms');、ユーザーがすべてのタグを入力できるように、1つの入力テキストが必要です。したがって、beforeSaveには、タグ(または用語)の文字列があり、それを配列にスライスし、用語のfind('list')を実行し、いくつかの配列が交差するなどの場合があります。ただし、最終的に、saveAllを使用するには、次のようなデータが必要です。

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

)。

于 2011-08-12T23:18:06.430 に答える