OctoberCMS Как создать пользовательскую регистрационную форму пользователя с полями из расширения плагина

Я пытаюсь изучить OctoberCMS, и я смущен насчет полного процесса расширения плагинов. Я расширил пользовательский плагин в соответствии со скринкастом (https://vimeo.com/108040919). В конечном счете, я ищу, чтобы создать новое поле под названием "категория", которое wold хранит категорию пользователей. На новой странице у меня есть следующая форма, которую я пытаюсь использовать для регистрации нового пользователя, основанного исключительно на их адресе электронной почты. "Категория" заполняется на странице, на которой они зарегистрированы, и пароль должен быть автоматически сгенерирован, чтобы пользователь установил его после подтверждения своей учетной записи по ссылке активации электронной почты. Мой плагин называется "Профиль".

Мой файл plugin.php выглядит так:

<?php namespace Sser\Profile;

use System\Classes\PluginBase;
use RainLab\User\Models\User as UserModel;
use RainLab\User\Controllers\Users as UsersController;
use Sser\Profile\Models\Profile as ProfileModel;
/**
 * Profile Plugin Information File
 */
class Plugin extends PluginBase
{

    /**
     * Returns information about this plugin.
     *
     * @return array
     */
    public function pluginDetails()
    {
        return [
            'name'        => 'Profile',
            'description' => 'Handles user demographic information',
            'author'      => '',
            'icon'        => 'icon-leaf'
        ];
    }

    public function boot()
    {
        UserModel::extend(function($model){
            $model->hasOne['profile'] = ['Sser\Profile\Models\Profile'];
        });
        // $user->profile->zip

        UserModel::deleting(function($user) {
            $user->profile->delete();
        });

        UsersController::extendFormFields(function($form,$model,$context){
            if(!$model instanceof UserModel)
            {
                return;
            }
            if(!$model->exists)
            {
                return;
            }
            //Ensures that a profile model always exists...
            ProfileModel::getFromUser($model);

            $form->addTabFields([
                'profile[age]'=>[
                    'label'=>'Age',
                    'tab'=>'Profile',
                    'type'=>'number'
                ],
                'profile[gender]'=>[
                    'label'=>'Gender',
                    'tab'=>'Profile',
                    'type'=> 'dropdown',
                    'options'=>array('male'=>'Male',
                                     'female'=>'Female')

                ],
                'profile[category]'=>[
                    'label'=>'Category',
                    'tab'=>'Profile',
                    'type'=> 'dropdown',
                    'options'=>array('sink'=>'SINK',
                                     'dink'=>'DINK')
                ],
                'profile[vag]'=>[
                    'label'=>'VAG',
                    'tab'=>'Profile',
                    'type'=> 'dropdown',
                    'options'=>array('v'=>'V',
                                     'a'=>'A',
                                     'g'=>'G')
                ]
            ]);
        });
    }

}

Файл profile.php выглядит так:

<?php namespace Sser\Profile\Models;

use Model;
use \October\Rain\Database\Traits\Validation;

/**
 * Profile Model
 */
class Profile extends Model
{
    public $rules = [
        'category' => ['required', 'min:0']
    ];

    /**
     * @var string The database table used by the model.
     */
    public $table = 'sser_profile_profiles';

    /**
     * @var array Guarded fields
     */
    protected $guarded = ['*'];

    /**
     * @var array Fillable fields
     */
    protected $fillable = [];

    /**
     * @var array Relations
     */
    public $hasOne = [];
    public $hasMany = [];
    public $belongsTo = [
        'user'=> ['RainLab\User\Models\User']
    ];
    public $belongsToMany = [];
    public $morphTo = [];
    public $morphOne = [];
    public $morphMany = [];
    public $attachOne = [];
    public $attachMany = [];

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

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

        $user->profile = $profile;

        return $profile;
    }

}

Я пытаюсь создать форму регистрации пользователя, которая выглядит следующим образом:

<form class="flexiContactForm col s12" role="form" data-request="{{ __SELF__ }}::onSignup" data-request-update="'{{ __SELF__ }}::confirm': '.confirm-container'">;
    <button id="signup_button" class="waves-effect waves-light btn" style="float:right;" type="submit">Sign Up</button>
    <div style="overflow: hidden; padding-right:0em;">
    <input id="signup_email" type="email" class="validate" name="email">            
    <label id="signup_email_label" for="signup_email" data-error="" data-success="">Email Address</label>
    <input type="hidden" name="category" value="{{ data.category }}"/>
    </div>
</form>

В чем я запутался, так это как создать компонент onSignup, который в основном расширит функциональность пользовательского плагина "onRegister", а затем автоматически сгенерирует пароль, а также сохранит поле "категория". Может ли кто-нибудь представить пример или ссылку на страницу, на которой показан пример этого? Спасибо.

Ответы

Ответ 1

Хорошо, мне просто нужно было сделать что-то подобное для моего собственного сайта. Поэтому я попытаюсь объяснить два варианта, которые у вас есть.
1: переопределить материал, используя тему и страницу php.

  • Отменить форму. Для этого скопируйте register.htm из   плагины/rainlabs/пользователь/компоненты/счет/register.htm    в   темы/сайт-тема/обертоны/счет/register.htm. Теперь вы можете обновить форму, чтобы иметь любые поля, которые вы хотите.

  • На странице входа/регистрации вашей учетной записи введите php в разделе php, чтобы переопределить функцию onRegister() по умолчанию:

    title = "Account"
    url = "/account/:code?"
    layout = "default"
    description = "The account page"
    is_hidden = 0
    
    [account]
    redirect = "home"
    paramCode = "code"
    
    [session]
    security = "all"
    ==
    function onRegister()
    {
        try {
            //Do Your Stuff (generate password, category)
            //Inject the variables
            return $this->account->onSignin();
        }
        catch (Exception $ex) {
            Log::error($ex);
        }
    } 
    ==
    

2: Создайте компонент, чтобы сделать все это. Это то, как я закончил.

  • php artisan create: компонент Foo.Bar AccountExtend для создания вашего компонента
  • Теперь перейдите в компонент и измените что-нибудь. Сначала вам нужно скопировать все файлы из плагинов/rainlabs/user/components/account/в плагины /Foo/Bar/components/accountextend/
  • Теперь вам нужно обновить компонент AccountExtend.php. Во-первых, некоторые изменения, чтобы заставить его работать правильно (я не включил весь код, просто материал, который нуждается в изменениях):

    use RainLab\User\Components\Account as UserAccount;
    
    class AccountExtend extends UserAccount
    
  • И затем обновите файл Plugin.php для вашего плагина, чтобы активировать компонент:

        public function registerComponents()
        {
            return [
               'Foo\Bar\Components\AccountExtend' => 'account',
            ];
        }
    
  • Теперь вы можете добавить функцию onRegister() в свой аккаунт AccountExtend.php:

        public function onRegister() {
            //Do anything you need to do
    
            $redirect = parent::onRegister();
    
            $user = $this->user(); // This is the user that was just created, here for example, dont need to assign it really
            // Now you can do stuff with any of the variables that were generated (such as user above)
    
           // Return the redirect so we redirect like normal
           return $redirect;
      }
    

Ответ 2

Это определенно сбивает с толку. Взгляните на плагин User Plus в качестве руководства и плагин местоположения (обязательно), чтобы добавить раскрывающееся меню страны/штата.

  • Вам нужно будет добавить новую таблицу или добавить поле в пользовательскую таблицу, используя "updates/migration", чтобы добавить что-то вроде "category_id" для пользователя. он сохранит его для вас.

  • Убедитесь, что это значение заполнено, поскольку создание пользователя заполнит модель данными формы, иначе она не будет сохранена. это на загрузке, у пользователя плюс плагин есть это, поэтому проверьте его.

  • Создайте новую таблицу для своих категорий и создайте компонентную часть, которая может получить список. см. плагин местоположений для этого... часть, которая извлекает данные/семена, список находится в компоненте.

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

Достаточно сделать пароль случайным, а не на 100% лучшим способом, но вы можете использовать onInit для своего компонента, чтобы просто семять его в данных формы. поле пароля должно быть добавлено к данным post, так как пользовательский плагин передает поля сообщения в модель (поэтому вы должны установить category_id как заполняемый или блокироваться по соображениям безопасности).

Я сам возился с этим материалом, а пользователи плюс с плагином местоположения помогли много.

Извините, я не могу быть более подробным.