CakePHP до сохранения и HABTM

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

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


person bjudson    schedule 12.08.2011    source источник


Ответы (1)


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

)

person Anh Pham    schedule 12.08.2011
comment
На самом деле я не использую помощник по форме, но поля выглядят так: <input type="text" id="Term0Name" name="data[Term][0][name]" value=""> - person bjudson; 13.08.2011
comment
PS Вот почему я не использую помощник по форме: groups.google. com / group / cake-php / browse_thread / thread / - person bjudson; 13.08.2011
comment
вам не нужно зацикливаться (пример в книге тортов не имеет цикла). Может быть, из-за того, что вы это сделали, данные не были сохранены. - person Anh Pham; 13.08.2011
comment
Думаю, я не объяснил, что я делаю очень хорошо, но цикл состоит в том, чтобы преобразовать текст во вводе (имя тега) в идентификатор перед сохранением, так что теоретически он будет работать с сохранением по умолчанию для Cake () функция, которая ожидает идентификаторы - person bjudson; 14.08.2011
comment
Я говорил о цикле в ссылке на группы Google, а не о том, что было в beforeSave (). Но я упустил вашу точку зрения на новый термин (или это тег?). В любом случае я отредактирую свой ответ. - person Anh Pham; 14.08.2011
comment
Спасибо! Дело в том, что я помещал идентификатор в массив, тогда как он должен был быть просто int. Что касается цикла, то я пытаюсь создать отдельные текстовые поля автозаполнения, которые можно использовать для отношения HABTM, а не для выбора элементов. Для моего варианта использования, я думаю, это лучше для удобства использования. - person bjudson; 15.08.2011
comment
это мой любимый способ сделать поле автозаполнения (хорошо интегрировать с множественным выбором): emposha.com /javascript/fcbkcomplete.html - person Anh Pham; 15.08.2011