برای عمل ثبت نام خود فریم ورک Yii کلاس ها و توابع بسیار خوبی داره که میتونین ازش استفاده کنین.
در قسمت front کنترلر site اکشن Signup به صورت پیش فرض وجود داره
با کد زیر :
public function actionSignup() { $model = new SignupForm(); if ($model->load(Yii::$app->request->post())) { if ($user = $model->signup()) { if (Yii::$app->getUser()->login($user)) { return $this->goHome(); } } } return $this->render('signup', [ 'model' => $model, ]); }
همونطور که میبینید مدلی به نام SignupForm وجود داره که کار اصلی رو انجام میده
توجه داشته باشین که ویوی ما که همون فورم ثبت نام هست در مسیر views/site/signup قرار دارد که اطلاعات را از کاربر میگیرد .
به صورت پیش فرض چد ستون (فیلد) مشخص در دیتابیس وجود دارد . در صورتی که ستون های دیگه ای لازم دارین میتونین به دیتابیس اضافه کنین و در فورم قرار بدین
فورم ثبت نام من شامل کد زیر می باشد :
<?php $form = ActiveForm::begin(['id' => 'form-signup']); ?> <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?> <?= $form->field($model, 'email') ?> <?= $form->field($model, 'password')->passwordInput() ?> <?= $form->field($model, 'first_name') ?> <?= $form->field($model, 'last_name') ?> <?= $form->field($model, 'gender')->dropDownList( array( '۰'=>'زن', '۱'=>'مرد', ) ); ?> <?= $form->field($model, 'mobile') ?> <?= $form->field($model, 'phone') ?> <?= $form->field($model, 'address') ?> <?= $form->field($model, 'biography') ?> <?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?> <?php ActiveForm::end(); ?>
در actionSignup ما یه مدل نیو کردیم . سپس اگر اطلاعاتی از فورم پست POST شده بود اومدیم یه کاری انجام دادیم
قبل از توضیح این بخش مدلSignupForm بررسی میکنیم
در مدل که در مسیر frontend/models/signup Form قرار داره من متغییر هایی که لازم داشتم رو تعریف کردم :
<?php namespace frontend\models; use common\models\User; use yii\base\Model; use Yii; /** * Signup form */ class SignupForm extends Model { public $username; public $email; public $password; public $first_name; public $last_name; public $gender; public $activation_code; public $mobile; public $phone; public $address; public $biography; /** * @inheritdoc */ public function rules() { return [ [['email', 'username', 'first_name', 'last_name', 'phone', 'mobile'], 'filter', 'filter' => 'trim'], [['password', 'email', 'username', 'first_name', 'last_name', 'phone', 'mobile'], 'required'], ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'], ['username', 'string', 'min' => 2, 'max' => 255], ['email', 'email'], ['email', 'string', 'max' => 255], ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'], ['password', 'string', 'min' => 6], ]; } public function attributeLabels() { return [ 'id' => Yii::t('app', 'کد کاربری'), 'username' => Yii::t('app', 'نام کاربری'), 'first_name' => Yii::t('app', 'نام'), 'last_name' => Yii::t('app', 'نام خانوادگی'), 'email' => Yii::t('app', 'ایمیل'), 'password' => Yii::t('app', 'رمز عبور'), 'status' => Yii::t('app', 'وضعیت ثبت نام'), 'is_active' => Yii::t('app', 'وضعیت کاربر'), 'activation_code' => Yii::t('app', 'کد فعال سازی'), 'last_password_change' => Yii::t('app', 'تاریخ آخرین تغییر رمز عبور'), 'gender' => Yii::t('app', 'جنسیت'), 'confrimed_date' => Yii::t('app', 'تاریخ تایید کاربر'), 'last_login' => Yii::t('app', 'تاریخ آخرین ورود'), 'failed_login_count' => Yii::t('app', 'تعداد تلاش ناموفق در ورود به سایت'), 'last_lockout' => Yii::t('app', 'تاریخ آخرین قفل'), 'is_locked' => Yii::t('app', 'وضعیت قفل بودن کاربر'), 'mobile' => Yii::t('app', 'موبایل'), 'phone' => Yii::t('app', 'تلفن ثابت'), 'address' => Yii::t('app', 'آدرس'), 'last_ip' => Yii::t('app', 'آخرین آی پی'), 'biography' => Yii::t('app', 'بیوگرافی'), 'is_blacklist' => Yii::t('app', 'لیست سیاه'), ]; } /** * Signs user up. * * @return User|null the saved model or null if saving fails */ public function signup() { if (!$this->validate()) { return null; } $user = new User(); $user->username = $this->username; $user->first_name = $this->first_name; $user->last_name = $this->last_name; $user->mobile = $this->mobile; $user->phone = $this->phone; $user->gender = $this->gender; $user->email = $this->email; $user->address = $this->address; $user->biography = $this->biography; $user->generateActivationCode(); $user->setPassword($this->password); $user->generateAuthKey(); return $user->save() ? $user : null; } }
برگردیم به اکشنمون
همونطور که میبینید بعد از پست شدن دیتا متد signup اجرا شده
این متد همونیه که در مدل تعریف کردیم :
public function signup() { if (!$this->validate()) { return null; } $user = new User(); $user->username = $this->username; $user->first_name = $this->first_name; $user->last_name = $this->last_name; $user->mobile = $this->mobile; $user->phone = $this->phone; $user->gender = $this->gender; $user->email = $this->email; $user->address = $this->address; $user->biography = $this->biography; $user->generateActivationCode(); $user->setPassword($this->password); $user->generateAuthKey(); return $user->save() ? $user : null; }
کار پیچیده ای انجام ندادیم
فقط ابتدا اعتبار سنجی رو انجام دادیم با متد validate ,بعدش اومدیم مدلuser رو ایجاد کردیم و اطلاعات رو ذخیره کردیم .
به همین سادگی.
نکته فقط این که فریم ورک یه سری توابع داره که ازش استفاده کردیم : مثل :
setPassword و generateAuthKey که رمز عبور و آتنتیکیشن کی را تولید میکند
اما generateActivationCode من خودم ایجاد کردم
چیز پیچیده ای هم نیست
این توابع در مسیر common\models و در فایل User.php قرار داده.