Отсутствие "обязательных" полей в форме говорит о том, что я неправильно связываю модели

У меня проблемы с проверкой формы ввода и сохранением данных из этой формы. Я подозреваю, что, возможно, они оба вызваны проблемой ассоциации, хотя я не уверен.

Я использую CakePHP 2.2.0 RC2.

У меня есть три модели: пользователь, участник и адрес. У каждого пользователя может быть несколько участников в своей учетной записи, и у каждого пользователя может быть много адресов (он также запоминает прошлые адреса).

Мои модельные ассоциации:

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

class User extends AppModel {

public $name = 'User';

public $hasMany = array(
    'Member' => array(
        'className' => 'Member',
        'foreignKey' => 'user_id',
        'order' => 'Member.member ASC',
        'dependent' => true
    ),
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'user_id',
        'order' => 'Address.address ASC',
        'dependent' => true
    )
);
...

Модель участника:

class Member extends AppModel {

public $name = 'Member';

public $displayField = 'member';

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id'
    )
);
...

Модель адреса:

class Address extends AppModel {

public $name = 'Address';

public $displayField = 'address';

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id'
    )
);
...

Для моего заявления на создание формы у меня есть:

$this->Form->create( 'Member', array( 'url' => array( 'action' => 'add' ) ) );

Я использую модель Member и контроллер для обработки формы, так как она отправляет либо только поля Member, либо поля Member и Address, в зависимости от того, есть ли у пользователя запись адреса или нет (если у пользователя ее нет, добавляется ввод адреса). поля в форме, в противном случае это не так).

Я не отправляю поля пользователя в форме.

Теперь, я ожидаю, что если мои ассоциации были настроены правильно, то у любых "обязательных" полей в любой из моделей будет звездочка рядом с ними. Есть некоторые поля, установленные как обязательные в моделях Member и Address, и хотя поля Member отображаются в форме как обязательные (со звездочкой), поля Address - нет.

Пример обязательного кода поля адреса из модели адреса:

public $validate = array(
    'street1' => array(
        'required' => array(
            'rule' => array( 'notEmpty' ),
            'required' => true, 'allowEmpty' => false,
            'message' => 'Please enter a street address'
        ),
....

А вот некоторые из моих кодов вида / формы:

echo $this->Form->input( 'Member.firstname', array( 'label' => 'First name', 'type' => 'text' ) );
echo $this->Form->input( 'Member.middlename', array( 'label' => 'Middle name', 'type' => 'text' ) );
echo $this->Form->input( 'Member.lastname', array( 'label' => 'Last name', 'type' => 'text' ) );
echo '<p class="bold">Please enter current address details:</p>';
echo $this->Form->input( 'Address.street1', array( 'label' => 'Street address (line 1)', 'type' => 'text' ) );
echo $this->Form->input( 'Address.street2', array( 'label' => 'Street address (line 2)', 'type' => 'text' ) );
echo $this->Form->input( 'Address.suburb', array( 'label' => 'Suburb', 'type' => 'text' ) );
...

Когда я вывожу $validationErrors на странице формы (перед отправкой формы), я получаю это:

Array
(
    [Member] => Array
        (
        )

    [User] => Array
        (
        )
)

Я предполагаю, что там также должен быть раздел [Адрес].

Я не вижу ничего очевидного, но я новичок в CakePHP (хотя у меня есть опыт работы с PHP), поэтому любые идеи будут оценены.

Спасибо! Питер.

1 ответ

Сначала вы сказали, что используете релиз-кандидат (RC2) Cake 2.2. Сейчас стабильный выпуск, и я настоятельно рекомендую вам перейти на него.

Вы создаете форму с Member модель, но она не имеет прямого отношения (ассоциации) к адресу. Адрес связан с пользователем. Если вы создаете форму с помощью модели User, она должна работать нормально.

Если этот сценарий - создание формы с моделью пользователя - не работает для вас и вашей логики приложения, тогда ваша модель базы данных и ваши ассоциации моделей неверны и не соответствуют вашим бизнес-потребностям. Если это так, вы должны рассмотреть вопрос об изменении архитектуры приложения.

И записка о $uses: вам не нужно включать Address модель в $ вашего контроллера использует для того, чтобы иметь возможность проверить входные данные. Контроллер::$ использует для использования моделей (кроме собственной модели контроллера) непосредственно в самом контроллере. Например:

public $uses = array('Article', 'News');

в любом контроллере все методы модели статей и новостей будут доступны в этом контроллере с помощью:

$this->Article->methodName();

или же

$this->News->methodName();
Другие вопросы по тегам