Как добавить связанные данные при добавлении пользователя одновременно CakePHP 3.x?
Я хотел бы иметь возможность добавлять запись о членстве одновременно с добавлением пользователя. Я не могу заставить его работать. Я хочу иметь возможность выбирать уровень членства и отправлять эти данные на контроллер, где я могу добавить данные, если только нет способа просто выбрать уровень членства, и он автоматически создаст запись членства для пользователя, который получает добавлено.
Уровень членства содержит информацию для этого уровня членства, а запись членства содержит некоторую информацию с уровня членства и связана с пользователем.
Я полагаю, что в форме добавления лежит проблема, но на всякий случай здесь приведены важные фрагменты кода. Я старался сделать это как можно проще.
Функция инициализации таблицы пользователей:
public function initialize(array $config)
{
parent::initialize($config);
$this->table('users');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->hasOne('Memberships', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
}
Функция инициализации таблицы членства:
public function initialize(array $config)
{
$this->table('memberships');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
$this->hasOne('MembershipLevels', [
'foreignKey' => 'membership_level_id',
'joinType' => 'INNER'
]);
}
Метод добавления контроллера пользователя:
public function add()
{
$user = $this->Users->newEntity($this->request->data(), [
'associated' => [
'Memberships' => ['associated' => ['MembershipLevels']]
]
]);
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data(), [
'associated' => [
'Memberships' => ['associated' => ['MembershipLevels']]
]
]);
if ($$this->Users->save($user)) {
$this->Flash->success(__('You have been added.'));
} else {
$this->Flash->error(__('You could not be added. Please, try again.'));
}
}
$membershipLevels = $this->Users->Memberships->MembershipLevels->find('list', ['limit' => 200]);
$this->set(compact('user', 'membershipLevels'));
$this->set('_serialize', ['user', 'membershipLevels']);
}
Добавить форму пользователя:
<div class="form">
<h1>Join Now</h1>
<?= $this->Form->create($user); ?>
<fieldset>
<legend><?= __('User Info') ?></legend>
<?= $this->Form->input('full_name', ['required' => false]); ?>
<?= $this->Form->input('username', ['required' => false]); ?>
<?= $this->Form->input('email', ['required' => false]); ?>
<?= $this->Form->input('password', ['required' => false]); ?>
<?= $this->Form->input('password_confirmation', ['type' => 'password', 'required' => false]); ?>
<?php
if ($current_user['role'] === 1 && isset($logged_in)) {
echo $this->Form->input('role', ['type' => 'select', 'options' => ['1' => 'Admin', '2' => 'Editor', '3' => 'Author', '4' => 'Reader'], 'default' => '4']);
}
?>
</fieldset>
<fieldset>
<legend><?= __('Membership Info') ?></legend>
<?= $this->Form->label('Membership Level'); ?>
<?= $this->Form->input('memberships.membership_levels._id', ['options' => $membershipLevels, 'required' => false]); ?>
</fieldset>
<?= $this->Form->button(__('Sign Up'));?>
<?= $this->Form->end();?>
</div>
Я немного изменил код благодаря комментариям и ответам. Уровни членства теперь отображаются в форме, и я выбираю уровень членства при сохранении пользователя, но членство также не сохраняется, только пользователь. Есть еще предложения?
2 ответа
Как насчет того, чтобы начать читать руководство по миграции или заняться обучением по блогам для CakePHP 3? Ваш метод проб и ошибок требует много времени и разочаровывает. Я не могу рекомендовать это достаточно: всегда читайте документацию перед съемкой в темноте. В CakePHP3 многое изменилось. Это включает в себя способ использования точечной нотации. Чтение ассоциаций сохранения может также помочь.
Вы больше не используете префикс модели на первом уровне.
Model.field
сейчас просто
field
Для вложенных ассоциаций теперь
associated_data.field
associated_data.second_level_data.field
Обратите внимание, что это склоняется и единственного или множественного числа в зависимости от вида ассоциации.
Я обновил свой код, чтобы максимально приблизить все автоматику к работе.
Ключевые моменты: 1.) В контроллере я получил переменную членства уровней, чтобы перейти к представлению, добавив эту строку. (обратите внимание на вызов таблицы пользователей, затем членство, а затем уровень членства).
$membershipLevels = $this->Users->Memberships->MembershipLevels->find('list', ['limit' => 200]);
2.) В представлении я добавил:
<?= $this->Form->input('memberships.membership_levels._id', ['options' => $membershipLevels, 'required' => false]); ?>
Однако это не полный ответ, потому что мне все еще нужно захватить уровень членства в контроллере с помощью запроса, а затем вручную сохранить данные с этого уровня в таблицу членства.
Я могу по крайней мере заполнить входной уровень членства в форме динамически и отправить его.
Я просмотрел учебник по закладкам, который я делал ранее, поскольку он использует ассоциации, но с этим учебником они могут автоматически добавлять запись bookmarks_tags при добавлении закладки, и я не уверен, что это связано с функциями в таблице файлы или нет.