保存用户档案详细信息,10月CMS

时间:2018-05-06 20:18:46

标签: octobercms octobercms-plugins octobercms-backend octobercms-widgets octobercms-user-plugin

我有一个与用户(用户)表相关的个人资料(个人资料)表,

现在,在前端我想更新用户信息,我也在octobercms更新用户个人资料信息

怎么办?

提前谢谢

Profile.php(个人资料模型)

**//Relation with User**
public $belongsTo = [
    'user' => ['RainLab\User\Models\User'],
];

public static function getFromUser($user){
        if ($user->profile)
            return $user->profile;

        $profile = new static;
        $profile->user = $user;
        $profile->save();

        return $profile;
}

Plugin.php(个人资料)

public function boot()
    {
        UserModel::extend(function ($model) {
            $model->hasOne['profile'] = ['GeniusIdea\Profile\Models\Profile'];

            $model->bindEvent('model.afterSave', function() use ($model) {
                 **//it works well when registering the user at the front end**
                \Event::listen('rainlab.user.register', function($user) {
                    ProfileModel::getFromUser($user);
                });

                 **//It does not work,**
                \Event::listen('rainlab.user.afterUpdate', function($user) {
                    ProfileModel::getFromUser($user);
                });
            });
        });
**//it works well when updating user information in the backend**
    UserController::extendFormFields(function ($form, $model, $context) {

        if (!$model instanceof UserModel)
            return;


        if (!$model->exists)
            return;


        ProfileModel::getFromUser($model);

        $form->addTabFields([
            'profile[skills]' => [
                'label' => 'Skills',
                'tab' => 'Professional',
                'type' => 'text'
            ],
            'profile[experience]' => [
                'label' => 'Years of experience',
                'tab' => 'Professional',
                'type' => 'number'
            ],
            'profile[address]' => [
                'label' => 'Professional address',
                'tab' => 'Professional',
                'type' => 'text'
            ],
             .....
        ]);

    });
}

表格

我使用默认帐户组件(Rainlab用户),并添加一些字段(配置文件字段)

{{ form_ajax('onUpdate', { model: user }) }}
    <div class="row">
       <div class="four columns">
            <label for="accountName">Nom</label>
          <input name="name" type="text" class="form-control"id="accountName" value="{{ form_value('name') }}">
       </div>
    <div class="four columns">
      <label for="accountName">Prenom</label>
       <input name="surname" type="text" class="form-control" id="accountSurname" value="{{ form_value('surname') }}">
    </div>

                  ............

     <button type="submit" class="btn btn-default">Save</button>

{{form_close()}}

1 个答案:

答案 0 :(得分:1)

这不起作用,因为rainlab用户插件中没有rainlab.user.afterUpdate之类的事件。以下是所有rainlab用户plugin events的列表。

现在如果没有活动你会怎么做?

因此,如果您仅在更新时触发此类事件。您可以在表单中添加一个隐藏字段,就像您在更新表单中添加了额外字段的问题中所提到的那样。

所以只需添加此字段

<input type="hidden" name="triggerOnUpdate" value="1">

完成此步骤后,您必须更改 Plugin.php 文件,并尝试访问该事件rainlab.user.afterUpdate

只需添加条件

if(!empty(post('triggerOnUpdate'))){
    ProfileModel::getFromUser($user);
}

因此,只有在您尝试更新时才会触发ProfileModel::getFromUser($user);

只需替换此代码

$model->bindEvent('model.afterSave', function() use ($model) {
             **//it works well when registering the user at the front end**
            \Event::listen('rainlab.user.register', function($user) {
                ProfileModel::getFromUser($user);
            });

             if(!empty(post('triggerOnUpdate'))){
                 ProfileModel::getFromUser($user);
             }
        });

  UserController::extendFormFields(function ($form, $model, $context) {

    if (!$model instanceof UserModel)
        return;


    if (!$model->exists)
        return;


    ProfileModel::getFromUser($model);

    $form->addTabFields([
        'profile[skills]' => [
            'label' => 'Skills',
            'tab' => 'Professional',
            'type' => 'text'
        ],
        'profile[experience]' => [
            'label' => 'Years of experience',
            'tab' => 'Professional',
            'type' => 'number'
        ],
        'profile[address]' => [
            'label' => 'Professional address',
            'tab' => 'Professional',
            'type' => 'text'
        ],
         .....
    ]);
});

我还没有对此进行过测试,但我认为这样可行。如果有任何疑问,请发表评论。