15

私は OctoberCMS を学習しようとしていますが、プラグインを拡張する完全なプロセスについて混乱しています。スクリーンキャスト ( https://vimeo.com/108040919 )に従ってユーザー プラグインを拡張しました。最終的には、ユーザー カテゴリを格納する「カテゴリ」という新しいフィールドを作成したいと考えています。新しいページには、電子メール アドレスのみに基づいて新しいユーザーを登録するために使用しようとしている次のフォームがあります。「カテゴリ」は、登録元のページに基づいて入力され、パスワードは自動的に生成されるため、ユーザーは電子メールのアクティベーション リンクからアカウントを確認したときにパスワードを設定できます。私のプラグインは「プロファイル」と呼ばれます。

私の 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>

私が混乱しているのは、基本的にユーザープラグインの「onRegister」コンポーネントの機能を拡張し、パスワードを自動的に生成して「カテゴリ」フィールドを保存する「onSignup」コンポーネントを作成する方法です。誰でも例を提供したり、この例を示すページへのリンクを提供できますか? ありがとう。

4

2 に答える 2

2

それは間違いなく混乱しています。ガイドとして User Plus プラグインを参照し、国/州のドロップダウンを追加するには場所プラグイン (必須) を参照してください。

  1. ユーザーの「category_id」などを追加するには、新しいテーブルを追加するか、「updates/migrations」を使用してユーザーのテーブルにフィールドを追加する必要があります。それはあなたのためにそれを保存します。

  2. ユーザーの作成によりフォームデータがモデルに入力されるため、これが入力可能に設定されていることを確認してください。そうしないと保存されません。これは起動時です。ユーザーの plus プラグインにはこれがあるので、チェックしてください。

  3. カテゴリ用に新しいテーブルを作成し、リストを取得できるコンポーネント パーツを作成します。これについては、場所のプラグインを参照してください...データ/シードを取得する部分は、リストがコンポーネントにあります。

  4. 新しいコンポーネントをパーシャルにするか、cms パーシャルで新しいフィールドを指定して使用する必要があります。

パスワードをランダムにする限り、100% 最良の方法ではありませんが、コンポーネントに onInit を使用して、フォーム ポスト データにパスワードをシードすることができます。ユーザーのプラグインが投稿フィールドをモデルに渡すため、パスワード フィールドを投稿データに追加する必要があります (これが、category_id を入力可能に設定する必要があるか、セキュリティ上の理由でブロックされる理由です)。

私は自分でこのようなことをいじっています.ユーザーとロケーションプラグインは大いに役立ちました.

申し訳ありませんが、詳しく説明できませんでした。

于 2016-01-21T19:39:28.810 に答える