Отсутствие "обязательных" полей в форме говорит о том, что я неправильно связываю модели
У меня проблемы с проверкой формы ввода и сохранением данных из этой формы. Я подозреваю, что, возможно, они оба вызваны проблемой ассоциации, хотя я не уверен.
Я использую 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();