PDA

View Full Version : راهنمایی در مورد اعتبارسنجی(validation) فرم در yii2



mojtaba.sln
شنبه 21 شهریور 1394, 21:06 عصر
سلام و خسته نباشید خدمت همه دوستان...
من تازه دارم yii2 رو یاد می گیرم که در اعتبار سنجی به مشکل برخوردم.
داکیومنت خود سایت یی اصلاً خوب توضیح نداده امکانات یی رو این شد که درخواستمو اینجا مطرح می کنم.


من یه فرم عضویت طراحی کردم که می خوام اعتبارسنجی سمت سرورش رو انجام بدم.
بعد از زدن کلید submit داده ها به یه متدی فرستاده می شه که اونجا باید اعتبار سنجی بشه.
اما با کلاس yii\validator نشد...همش ارور می ده!
می خواستم اگه می شه دوستان لطف کنند با یه مثال نحوه اعتبارسنجی رو توضیح بدن.

پیشاپیش ممنون بابت کمک هاتون:قلب:

parsboy
یک شنبه 22 شهریور 1394, 14:49 عصر
سلام و خسته نباشید خدمت همه دوستان...
من تازه دارم yii2 رو یاد می گیرم که در اعتبار سنجی به مشکل برخوردم.
داکیومنت خود سایت یی اصلاً خوب توضیح نداده امکانات یی رو این شد که درخواستمو اینجا مطرح می کنم.


من یه فرم عضویت طراحی کردم که می خوام اعتبارسنجی سمت سرورش رو انجام بدم.
بعد از زدن کلید submit داده ها به یه متدی فرستاده می شه که اونجا باید اعتبار سنجی بشه.
اما با کلاس yii\validator نشد...همش ارور می ده!
می خواستم اگه می شه دوستان لطف کنند با یه مثال نحوه اعتبارسنجی رو توضیح بدن.

پیشاپیش ممنون بابت کمک هاتون:قلب:

سلام آموزش های اقا مهرداد عالیه حتما مطالعه کنید

j_naroogha@yahoo.com
یک شنبه 22 شهریور 1394, 17:13 عصر
سلام
امیدوارم سوالتونو درست متوجه شده باشم...
ببینید برای اعتبار سنجی شما rule ها رو در مدلها باید معرفی کنین و نیازی به هندل کردن بصورت مثال ندارین.
مثلا برای مدل User این rule ها رو اعمال کردم...


public function rules()
{
return [
[['username', 'email', 'password_hash', 'auth_key', 'created_at', 'updated_at'], 'required'],
[['confirmed_at', 'blocked_at', 'created_at', 'updated_at', 'flags'], 'integer'],
[['username'], 'string', 'max' => 25],
[['email', 'unconfirmed_email'], 'string', 'max' => 255],
[['password_hash'], 'string', 'max' => 60],
[['auth_key'], 'string', 'max' => 32],
[['registration_ip'], 'string', 'max' => 45],
[['username'], 'unique'],
[['email'], 'unique'],
];
}

توی خط زیر


[['username', 'email', 'password_hash', 'auth_key', 'created_at', 'updated_at'], 'required']

گفتم username ,... ازنوع required هستند.... و در فرم خودش میکنه ... هم سمت سرور و هم سمت کاربر.

mojtaba.sln
یک شنبه 22 شهریور 1394, 18:54 عصر
سلام
امیدوارم سوالتونو درست متوجه شده باشم...
ببینید برای اعتبار سنجی شما rule ها رو در مدلها باید معرفی کنین و نیازی به هندل کردن بصورت مثال ندارین.
مثلا برای مدل User این rule ها رو اعمال کردم...


public function rules()
{
return [
[['username', 'email', 'password_hash', 'auth_key', 'created_at', 'updated_at'], 'required'],
[['confirmed_at', 'blocked_at', 'created_at', 'updated_at', 'flags'], 'integer'],
[['username'], 'string', 'max' => 25],
[['email', 'unconfirmed_email'], 'string', 'max' => 255],
[['password_hash'], 'string', 'max' => 60],
[['auth_key'], 'string', 'max' => 32],
[['registration_ip'], 'string', 'max' => 45],
[['username'], 'unique'],
[['email'], 'unique'],
];
}

توی خط زیر


[['username', 'email', 'password_hash', 'auth_key', 'created_at', 'updated_at'], 'required']

گفتم username ,... ازنوع required هستند.... و در فرم خودش میکنه ... هم سمت سرور و هم سمت کاربر.


سلام...
ممنون بابت پاسختون...
متاسفانه من منظورمو درست منتقل نکردم...
من برای ولیدیشن داده هایی راهنمایی می خواستم که اصلا با فرم یا دیتابیس در ارتباط نیستند...
یعنی ولیدیشن رو می خواستم به مدل وابسته نباشه...

که با سوالایی که از آقای مهرداد سیف زاده کردم فهمیدم باید از "ad-hoc validation" استفاده کنم.

مهرداد سیف زاده
یک شنبه 22 شهریور 1394, 19:16 عصر
من وقت نمیکنم که رو inline validation و ad-hoc validation رو توضیح بدم
طبق توضیحاتی که براتون گفتم و لینکی که ارسال کردم یه نمونه کد بزارید تا دیگر دوستان هم استفاده کنن

سلام...
ممنون بابت پاسختون...
متاسفانه من منظورمو درست منتقل نکردم...
من برای ولیدیشن داده هایی راهنمایی می خواستم که اصلا با فرم یا دیتابیس در ارتباط نیستند...
یعنی ولیدیشن رو می خواستم به مدل وابسته نباشه...

که با سوالایی که از آقای مهرداد سیف زاده کردم فهمیدم باید از "ad-hoc validation" استفاده کنم.

mojtaba.sln
یک شنبه 22 شهریور 1394, 22:49 عصر
گاهی اوقات شما نیاز دارید مقادیری را اعتبار سنجی کنید که به هیچ مدلی وابسته نیستند.
اگر شما نیاز داشتید که فقط یک نوع اعتبار سنجی اعمال کنید (مثلا برای آدرس ایمیل)می توانید از تابع validate() استفاده کنید.
به شکل زیر :




namespace backend\controllers;

use yii\base\DynamicModel;
use yii\validators\EmailValidator;

class TestController extends \yii\web\Controller
{
public function actionIndex()
{
$email = 'test@example.com';
$validator = new EmailValidator();

if ($validator->validate($email, $error)) {
echo 'Email is valid.';
} else {
echo $error;
}
}
}




البته این نوع اعتبارسنجی همه ولیدیتور ها رو پشتیبانی نمی کنهوبه عنوان مثال ولیدیتور unique طراحی شده فقط برای کار با یک مدل.

اگر نیاز داشتید چندین ولیدیشن بر روی تعدادی مقادیر اعمال کنید می توانید از کلاس yii\base\DynamicModel (http://www.yiiframework.com/doc-2.0/yii-base-dynamicmodel.html) استفاده کنید که پشتیبانی می کند از هردوی "فیلد"(فیلد های دیتابیس) و رول ها.استفاده از آن به شکل زیر است:



public function actionSearch($name, $email)
{ $model = DynamicModel::validateData(compact('name', 'email'), [
[['name', 'email'], 'string', 'max' => 128],
['email', 'email'],
]); if ($model->hasErrors()) {
// validation fails
} else {
// validation succeeds
}
}




البته برای مورد بالا باید قبل از شروع کلاسِ کنترلر ، کلاس yii\base\DynamicModel; را use کنید.

یا این که شما می توانید از دستور زبان کلاسیک تر این اعتبارسنجی رو اجرا کنید :


public function actionSearch($name, $email)
{ $model = new DynamicModel(compact('name', 'email'));
$model->addRule(['name', 'email'], 'string', ['max' => 128])
->addRule('email', 'email')
->validate();
if ($model->hasErrors()) {
// validation fails
} else {
// validation succeeds
}
}



بعد از اعتبار سنجی شما می توانید بررسی کنید که اعبارسنجی موفقیت آمیز بوده یا نه با فراخوانی تابع hasErrors() (http://www.yiiframework.com/doc-2.0/yii-base-model.html#hasErrors%28%29-detail) و سپس با متغیر errors (http://www.yiiframework.com/doc-2.0/yii-base-model.html#$errors-detail) خطاهارا بگیرید.




البته مطالب بالا صرفاً ترجمه ای بود از سایت یی فریمورک(با اندکی تغییر در کد ها).اگر دوستان جایی مشکل داشتند اطلاع بدند تا کامل توضیحشو بدم.

----------------------------------------------------------------------------------------------------------------------------------------------------
ضمناً در فیلم های آقای سیف زاده در بخش پنجم (فرم ها) فیلم سوم ، ad-hoc validation آموزش داده شده که دوستان می تونند به بون فیلم مراجعه کنند
---------------------------------------------------------------------------------------------------------------------------------------------------

engmmrj
دوشنبه 23 شهریور 1394, 18:58 عصر
من وقت نمیکنم که رو inline validation و ad-hoc validation رو توضیح بدم
طبق توضیحاتی که براتون گفتم و لینکی که ارسال کردم یه نمونه کد بزارید تا دیگر دوستان هم استفاده کنن
توضیح دادید تو فیلم :لبخند:ار بس پشت کامیپوتر بودید فراموشی گرفتید

مهرداد سیف زاده
دوشنبه 23 شهریور 1394, 21:08 عصر
توضیح دادید تو فیلم :لبخند:ار بس پشت کامیپوتر بودید فراموشی گرفتید

یه توضیح کوتاه دربارش دادم ولی کامل با مثال مناسب توضیح ندادم.
البته اون قسمت پشت کامپیوتر رو باهاتون موافقم:گیج:
چون در شبانه روز فقط ۶ ساعت از من جدا هست.