1

我希望能够在添加用户的同时添加会员记录。我似乎无法让它工作。我希望能够选择会员级别并将该数据发送到我可以添加数据的控制器,除非有一种方法可以选择会员级别并且它会自动为获得的用户创建会员记录添加。

会员级别包含该会员级别的信息,会员记录包含会员级别的一些信息并与用户相关联。

我认为添加表单是问题所在,但以防万一这里是重要的代码片段。我试图让它尽可能简单。

用户表初始化函数:

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>

感谢评论和答案,我稍微更改了代码。会员级别现在显示在表单中,我在保存用户时选择了会员级别,但会员资格也没有保存,只有用户。有什么进一步的建议吗?

4

2 回答 2

3

开始阅读迁移指南,或者为 CakePHP 3做博客教程怎么样?您的反复试验方法既耗时又令人沮丧。我对此再怎么推荐都不为过:在黑暗中拍摄之前,请务必阅读文档。CakePHP3 发生了很大的变化。这包括使用点符号的方式。阅读储蓄协会也可能有所帮助。

您不再使用第一级的模型前缀。

Model.field 

现在只是

field

对于嵌套关联,现在是

associated_data.field
associated_data.second_level_data.field

请注意,根据关联的类型,这是屈折变化和单数或复数。

于 2015-12-01T08:14:41.083 回答
0

我已经更新了我的代码,以尽可能地让所有自动魔法正常工作。

要点: 1.)在控制器中,我通过添加此行获得了要传递给视图的成员级别变量。(注意用户表的调用,然后是成员资格,然后是成员资格级别)。

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

2.)在我添加的视图中:

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

然而,这不是一个完整的答案,因为我仍然必须通过查询来获取控制器中的成员级别,然后手动将来自该级别的数据保存到成员表中。

我至少可以动态填充表单中的会员级别输入并提交。

我已经查看了我之前完成的书签教程,因为它使用了关联,但是通过该教程,他们能够在您添加书签时自动添加书签标签记录,我不确定这是否是由于表中的函数文件与否。

于 2015-12-03T03:49:26.667 回答