کار با فرمها
در این بخش یاد میگیریم که چگونه صفحه جدیدی ایجاد کنیم تا اطلاعات کاربران را طریق فرمها دریافت کنیم. دو المان ورودی نام و ایمیل بر روی صفحه قرار میدهیم و پس از دریافت اطلاعات از کاربر آنها را نمایش می دهیم.
حال ما نیاز به یک مدل در کنار action و view خود خواهیم داشت.
ایجاد مدل
اسم مدل ما EntryForm میباشد و در مسیر models/EnteryForm.php ذخیره شده است.
<?php
namespace app\models;
use yii\base\Model;
class EntryForm extends Model {
public $name;
public $email;
public function rules() {
return [ [['name', 'email'], 'required'], ['email', 'email'], ];
} }
دو عضو سراسری کلاس، name و email هستند. این کلاس یک تابع rules هم دارد که دادههای ما را اعتبار سنجی می کند.
اعتبارسنجی های ما در کلاس بالا عنوان شده است به قرار زیر است:
۱- هر دوی name و email وارد کردنشان اجباری است.
۲- email باید از نوع email باشد.
زمانی که دادهها را از کاربر دریافت میکنید تابع validate را فراخوانی کنید تا این قوانین بررسی شوند و مقادیر فرمها اعتبار سنجی شوند. در این مرحله بطور مثال اگر کاربر بجای ایمیل، آدرس وبسایت وارد کرد خطا نشان دهد.
<?php
$model = new EntryForm();
$model->name = 'Beestak';
$model->email = 'beestak@gmail.com';
if ($model->validate()) {
// Good!
} else {
// Failure! // Use $model->getErrors()
}
نحوه ایجاد action قبلتر توضیح داده شد. حال برای ایجاد action بصورت زیر عمل میکنیم:
<?php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\EntryForm;
class SiteController extends Controller {
// ...existing code...
public function actionEntry() {
$model = new EntryForm;
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
// valid data received in $model // do something meaningful here about $model ...
return $this->render('entry-confirm', ['model' => $model]);
} else {
// either the page is initially displayed or there is some validation error
return $this->render('entry', ['model' => $model]);
} } }
در شرط اول بررسی میشود که اگر دادهها توسط کاربر post شده است و دادهها معتبر هستند آنگاه صفحه confirm مربوطه را نشان بده در غیر اینصورت فرم قبل را دوباره به همراه خطاها به کاربر نشان بده.
نکته: دقت کنید که متد post زیر مجموعه شی request می باشد.
ایجاد View ها
حال دو فایل view با نامهای entry-confirm و entry درست کنید. فایل confirm در مسیر views/site/entry-confirm.php ذخیره میشود.
<?php
use yii\helpers\Html;
?> <p>You have entered the following information:</p>
<ul> <li><label>Name</label>: <?= Html::encode($model->name) ?></li>
<li><label>Email</label>: <?= Html::encode($model->email) ?></li> </ul>
و فایل entry در مسیر views/site/entry.php بصورت زیر است:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm; ?>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div> <?php ActiveForm::end(); ?>
ما در اینجا از ویجت قدرتمند activeForm استفاده کرده ایم. متدهای begin و end موجب ایجاد تگهای باز و بسته می شوند. آلمان های ورودی هم با متد field ایجاد می شوند.
برای قرار دادن دکمه ثبت اطلاعات از Helper پیشفرض فریمورک به نام Html استفاده کرده ایم.
تست خروجی کار
از آنجا که اسم متد خود را entry گذاشتیم و آن را در کنترلر site قرار دادیم برای فراخوانی میتوانیم بشکل زیر عمل کنیم:
نکته: کسانی که پستهای قبلی را نخواندهاند برایشان متذکر میشویم که ما قبلاً rewrite rule را فعال کردهایم و نمایش index.php را خاموش کرده ایم. در صورتی که اینکار ها را انجام نداده باشید خطا دریافت میکنید.
start-form-validation.png
پس از دریافت داده ها فرم به صورت زیر نشان داده می شود:
start-entry-confirmation.png
ویجت yii یکی از قدرتهای دیگرش این است که داده های اعتبارسنجی شما را به کدهای سمت کلاینت بصورت جاوا اسکریپت تبدیل میکند و خطا را قبل از اینکه به سمت سرور ارسال شود به کاربر نشان میدهد.
برای سفارشی سازی برچسب ها بصورت زیر میتوانید از label استفاده کنید. متدها در yii اصطلاحا chainable هستند و زنجیروار میتوانند نشان داده شوند. با این تسهیلات فراهم شده توسط yii فرم های بسیار پیچیده را می توان به راحتی در این فریمورک قدرتمند ایجاد کرد.
** توجه ** یکی از دوستان لطفا رحمت بکشه و فایل pdf رو تولید کنه. مرسی :)))))