我有一个与用户(用户)表相关的个人资料(个人资料)表,
现在,在前端我想更新用户信息,我也在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()}}
答案 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'
],
.....
]);
});
我还没有对此进行过测试,但我认为这样可行。如果有任何疑问,请发表评论。