2015-12-01 6 views
1

Я хотел бы иметь возможность добавлять запись о членстве одновременно с добавлением пользователя. Кажется, я не могу заставить его работать. Я хочу иметь возможность выбирать уровень членства и отправлять эти данные контроллеру, где я могу добавить данные, если только не существует способа просто выбрать уровень членства, и он автоматически создаст запись членства для пользователя, который получает добавлено.Как добавить связанные данные при одновременном добавлении пользователя CakePHP 3.x?

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

Форма добавления, на которую я верю, в чем проблема, но на всякий случай вот важные фрагменты кода. Я старался держать его как можно проще.

Пользователи Таблица Initialize Функция:

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' 
    ]); 
} 

Членство Таблица Initialize Функция:

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> 

Я немного изменил код благодаря комментариям и ответам. Уровни членства теперь отображаются в форме, и я выбираю уровень членства при сохранении пользователя, но членство также не сохраняется, просто пользователь. Какие-нибудь дополнительные предложения?

+0

Попробуйте сделать это $ user = $ this-> Пользователи-> patchEntity ($ user, $ this-> request-> data, ['associated' => 'MembershipLevels']); Просьба также отлаживать ($ user); и обновлять данные отладки. – justrohu

+0

@justrohu. Часть вопроса состоит в том, что MembershipLevels ассоциируется с Членством, а членство связано с Пользователями. Мне нужно иметь возможность выбрать идентификатор MembershipLevel в форме и затем сохранить эти данные в записи членства, которая связана с добавленным пользователем. Поэтому MembershipLevels напрямую не связаны с пользователем. – Battousai

+0

@justrohu Я обновил свой код, чтобы отразить ваш комментарий. – Battousai

ответ

3

Как насчет того, чтобы начать читать migration guide, или сделать учебник для блога для CakePHP ? Ваш пробный и ошибочный подход требует много времени и разочарований. Я не могу рекомендовать это достаточно: Всегда читать документацию до стрельба в темноте. В CakePHP3 многое изменилось. Это включает в себя способ использования точечной нотации. Чтение saving associations также может помочь.

Вы уже не используете префикс модели на первом уровне.

Model.field 

теперь просто

field 

Для вложенных ассоциаций это теперь

associated_data.field 
associated_data.second_level_data.field 

Обратите внимание, что это изменяемую и единственного или множественного числа в зависимости от вида ассоциации.

0

Я обновил свой код, чтобы получить самое близкое к тому, чтобы все автоматы работали.

Ключевые моменты: 1.) В контроллере я получил переменную уровня членства, чтобы перейти к представлению, добавив эту строку. (обратите внимание на вызов таблицы пользователей, а затем членство, а затем уровень членства).

$membershipLevels = $this->Users->Memberships->MembershipLevels->find('list', ['limit' => 200]); 

2.) По мнению я добавил:

<?= $this->Form->input('memberships.membership_levels._id', ['options' => $membershipLevels, 'required' => false]); ?> 

Это не полный ответ, однако, потому что я до сих пор, чтобы захватить уровень членства в контроллере с запросом, а затем вручную сохранить данные с этого уровня к столу членства.

Я могу как минимум заполнить ввод уровня членства в форме динамически и отправить его.

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

 Смежные вопросы

  • Нет связанных вопросов^_^