Сохранить данные профиля пользователя, октябрь CMS - PullRequest
0 голосов
/ 06 мая 2018

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

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

как это сделать?

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

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 Ответ

0 голосов
/ 07 мая 2018

Это не работает, потому что в пользовательском плагине rainlab нет такого события, как rainlab.user.afterUpdate. Вот список всех событий плагина пользователя 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'
        ],
         .....
    ]);
});

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

...