OctoberCMS如何使用插件扩展中的字段创建自定义用户注册表单

时间:2016-01-08 16:31:20

标签: php laravel user-registration octobercms

我试图学习OctoberCMS,我对扩展插件的完整过程感到困惑。我已根据截屏视频(https://vimeo.com/108040919)扩展了用户插件。最终,我希望创建一个名为" category" wold存储用户类别。在新页面上,我有以下表单,我试图用它来仅根据他们的电子邮件地址注册新用户。 "类别"根据他们注册的页面填充,并且应自动生成密码,以便用户在通过电子邮件激活链接确认其帐户时进行设置。我的插件名为" Profile"。

我的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>

我感到困惑的是如何制作一个&#34; onSignup&#34;基本上扩展用户插件功能的组件&#34; onRegister&#34;组件然后自动生成密码并保存&#34;类别&#34;领域。任何人都可以提供示例或链接到显示此示例的页面吗?感谢。

2 个答案:

答案 0 :(得分:5)

好吧,我必须为自己的网站做这样的事情。因此,我将尝试解释您拥有的两个选项 1:使用主题和页面php覆盖内容。

  1. 覆盖表单。为此,请复制register.htm     插件/ rainlabs /用户/组件/帐户/ register.htm      至     主题/网站主题/谐音/帐号/ register.htm。您现在可以更新表单以包含您想要的任何字段。

  2. 在您的帐户登录/注册页面上,将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);
        }
    } 
    ==
    
  3. 2:创建一个组件来完成所有操作。这就是我最终的方式

    1. php artisan create:component Foo.Bar AccountExtend来创建你的组件
    2. 现在进入组件并更改一些内容。首先,您需要将所有文件从plugins / rainlabs / user / components / account /复制到plugins / Foo / Bar / components / accountextend /
    3. 现在您需要更新组件AccountExtend.php。首先,进行一些更改以使其正常工作(我还没有包含所有代码,只需要更改的内容):

      use RainLab\User\Components\Account as UserAccount;
      
      class AccountExtend extends UserAccount
      
    4. 然后更新插件的Plugin.php文件,以激活组件:

          public function registerComponents()
          {
              return [
                 'Foo\Bar\Components\AccountExtend' => 'account',
              ];
          }
      
    5. 现在您可以将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;
        }
      

答案 1 :(得分:2)

这绝对令人困惑。查看User Plus插件作为指南,以及添加国家/州下拉列表的位置插件(必填)。

  1. 您必须使用“更新/迁移”添加新表或向用户表添加字段,以便为用户添加类似“category_id”的内容。它会为你保存。

  2. 确保将其设置为可填写,因为用户创建将使用表单数据填充模型,否则将无法保存。这是在启动时,用户的加插件有这个,所以检查出来。

  3. 为您的类别创建一个新表,并创建一个可以获取列表的组件部分。看到这个位置插件...获取列表中的数据/种子的部分在组件中。

  4. 您需要将新组件设为部分或在指定新字段的cms部分中使用它。

  5. 除了使密码随机,而不是100%是最佳方式,但您可以使用onInit为您的组件只在表单发布数据中播种一个。由于用户的插件将post字段传递给模型,因此必须将密码字段添加到发布数据中(这就是为什么必须将category_id设置为可填充或出于安全原因而被阻止的原因)。

    我自己搞这些东西,用户加上位置插件帮了很多忙。

    抱歉,我无法更详细。