Сохранить данные профиля пользователя, октябрь CMS

У меня есть таблица профиля (профиля) по отношению к таблице пользователя (пользователя),

Теперь, на внешнем интерфейсе, я хотел бы обновить информацию о пользователе, также я обновляю информацию о профиле пользователя, на октябрь cms.

как сделать?

заранее спасибо

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 User) и добавляю некоторые поля (поля профиля)

{{ 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 ответ

Это не работает, потому что нет такого события, как rainlab.user.afterUpdate в плагине пользователя rainlab. Вот список всех событий плагина пользователя rainlab.

Теперь, как вы будете это делать, если нет событий?

Так что если вы запускаете такое событие только при его обновлении. Вы можете добавить еще одно скрытое поле внутри формы, как вы упомянули в вопросе о том, что вы добавили дополнительные поля в форму обновления.

Так что просто добавьте это поле

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

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