CakePHP beforeSave & HABTM - PullRequest
       12

CakePHP beforeSave & HABTM

1 голос
/ 13 августа 2011

Я пытаюсь написать некоторую логику beforeSave в CakePHP 2.0 beta. По сути, я хочу, чтобы пользователь мог отправлять текст для тегоподобных функций. Функция 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
                        )

                )

        )

)

Также успешно сохраняет данные в первичной модели (Project). Но ассоциации под [Term] [Term] игнорируются. Я уверен, что это правильная структура массива для сохранения ассоциаций HABTM.

Кто-нибудь видит, что с этим не так?

1 Ответ

0 голосов
/ 13 августа 2011

в представлении вы должны иметь 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
            )
    )

)

...