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 как заполняемый или блокироваться по соображениям безопасности).
Я сам возился с этим материалом, а пользователи плюс с плагином местоположения помогли много.
Извините, я не могу быть более подробным.