Как правильно обращаться с данными об ассоциациях в формах с cakephp 2.3

Я новичок в cakephp. У меня есть таблица «пользователи» и таблица «категория».

пользователь принадлежит к категории (поля: users.id, users.name, users.category) категория hasMany users (поля: category.id, category.name, users.category)

Я обращаюсь к ассоциированным данным, подобным этому.

в (пользователи) edit.ctp я положил

// view/Users/edit.ctp

    echo $this->Form->input('name');
    echo $this->Form->input('categories', array( 'value' => $this->Form->value('User.category'), 
'name'=>'data[User][category]') );
</pre>

in users controller I have
<pre>
    public function edit($id = null) {
        $this->User->id = $id;
        if (!$this->User->exists()) {
            throw new NotFoundException(__('Invalid user'));
        }
        if ($this->request->is('post') || $this->request->is('put')) {
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        } else {
            $this->request->data = $this->User->read(null, $id);
        }
        $sexes = $this->User->Sex->find('list');
        $categories = $this->User->Category->find('list');
        $this->set(compact('categories'));

    }

Все работает, но я подозреваю, что есть гораздо более простой способ сделать эту форму. Это действительно необходимо?
, array( 'value' => $this->Form->value('User.category'), 'name'=>'data[User][category]')
Без этих параметров поле выбора не выделяет выбранный параметр, и ничего не сохраняется.

Может быть что-то вроде

echo $this->Form->input('Category.name');

например? Но такой код не показывает окно выбора.
И не сохраняет поле users.category.

Мне не удалось найти учебник или код с примерами по этому поводу. Ссылки приветствуются.


person user1648630    schedule 06.02.2013    source источник


Ответы (1)


Попробуйте использовать соглашения об именах Cake для таблиц и полей базы данных. Если вы будете следовать соглашениям, Cake сделает за вас большую часть тяжелой работы:

таблица пользователей:

users.id, users.name, users.category_id

таблица категорий

categories.id, categories.name

Модель пользователя

class User extends AppModel {

    public $belongsTo = array(
        'Category'
    );

}

Модель категории

class Category extends AppModel {

    public $hasMany = array(
        'User'
    );

}

Контроллер пользователей:

class UsersController extends AppController {

    public function edit($id) {

        if (!empty($this->request->data) {

            // form submitted - try to save
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash('User updated');
            }
            else {
                $this->Session->setFlash('Please correct the errors');
            }
        }
        else {
           // prepopulate the form
           $this->request->data = $this->User->findById($id);
        }

        // populate the categories dropdown
        $this->set('categories', $this->User->Category->find('list');

    }

}

/приложение/представления/Пользователи/edit.ctp

<?php

echo $this->Form->create();
echo $this->Form->inputs();
echo $this->Form->end('Update');
person RichardAtHome    schedule 06.02.2013