我希望能够在添加用户的同时添加成员记录。我好像不能让它工作。我希望能够选择成员资格级别,并将数据发送到控制器,在那里我可以添加数据,除非有一种方法只选择成员资格级别,并且它会自动为添加的用户创建成员资格记录。
成员资格级别包含该成员资格级别的信息,成员资格记录包含来自成员资格级别的一些信息,并与用户相关联。
我认为add表单就是问题所在,但为了以防万一,这里有一些重要的代码片段。我试着让它尽可能简单。
Users Table 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'
]);
}成员资格表初始化函数:
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>多亏了评论和答案,我对代码做了一些修改。成员资格级别现在显示在表单中,我在保存用户时选择了成员资格级别,但成员资格不会同时保存,只有用户会保存。有什么进一步的建议吗?
发布于 2015-12-01 16:14:41
开始阅读migration guide,或者为CakePHP3做博客教程怎么样?您的试验和错误方法既耗时又令人沮丧。我再怎么推荐也不为过:在黑暗中拍摄之前,一定要先阅读文档。在CakePHP3中有很多变化。这包括使用点符号的方式。阅读saving associations可能也会有所帮助。
您不再使用第一级上的model前缀。
Model.field 现在就是
field对于嵌套关联,现在是
associated_data.field
associated_data.second_level_data.field请注意,这是词形变化的,根据关联的类型,是单数还是复数。
发布于 2015-12-03 11:49:27
我已经更新了我的代码,以使我可以让所有的自动化工作。
要点: 1.)在控制器中,我通过添加以下行获得了要传递给视图的成员资格级别变量。(注意users表的调用,然后是成员资格,最后是成员资格级别)。
$membershipLevels = $this->Users->Memberships->MembershipLevels->find('list', ['limit' => 200]);2.)在视图中,我添加了:
<?= $this->Form->input('memberships.membership_levels._id', ['options' => $membershipLevels, 'required' => false]); ?>然而,这还不是一个完整的答案,因为我仍然需要通过查询获取控制器中的成员级别,然后手动将该级别的数据保存到membership表中。
我至少可以动态填充表单中的成员级别输入并提交它。
我已经看过我之前做过的书签教程,因为它使用了关联,但是有了那个教程,当你添加书签时,他们能够自动添加bookmarks_tags记录,我不确定这是不是由于表文件中的函数所致。
https://stackoverflow.com/questions/34010738
复制相似问题