کار با بانکهای اطلاعاتی
در این بخش توضیح میدهیم که چگونه صفحه جدیدی برای نمایش دادههای کشورهای استخراج شده از جدول بانک اطلاعاتی به نام country درست کنیم.
برای رسیدن به این مهم، ابتدا باید اتصال بانک اطلاعاتی خود را ایجاد کنیم، یک کلاس Active Record درست کنیم، یک action تعریف کنیم و یک view ایجاد کنیم.
خب برای شروع کار جدول country رو درست میکنیم. جستار SQL آن بصورت زیر است:
CREATE
TABLE `country` ( `code`
CHAR(2) NOT NULL PRIMARY KEY, `name`
CHAR(52) NOT NULL, `population`
INT(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT
CHARSET=utf8;
INSERT INTO `country`
VALUES ('AU','Australia',18886000); INSERT INTO `country`
VALUES ('BR','Brazil',170115000); INSERT INTO `country`
VALUES ('CA','Canada',1147000); INSERT INTO `country`
VALUES ('CN','China',1277558000); INSERT INTO `country`
VALUES ('DE','Germany',82164700); INSERT INTO `country`
VALUES ('FR','France',59225700); INSERT INTO `country`
VALUES ('GB','United Kingdom',59623400); INSERT INTO `country`
VALUES ('IN','India',1013662000); INSERT INTO `country`
VALUES ('RU','Russia',146934000); INSERT
INTO `country` VALUES ('US','United States',278357000);
نکته: اسم بانک اطلاعاتی خود را yii2basic بگذارید و داخل آن جدول country بالا را ایجاد کنید.
پیکربندی اتصال بانک اطلاعاتی
قبل از اینکه به ادامه بحث بروید مطمئن شوید که pdo extension برای PHP را نصب کردهاید (برای mysql بایستی pdo_mysql رو نصب کنید.)
بر خلاف فریمورک قبلی yii در این نسخه اطلاعات بانک اطلاعاتی در فایل جدیدی در مسیر config/db.php قرار دارد. این فایل را باز کنید و اطلاعات آن را به مانند زیر قرار دهید:
<?php return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8', ];
برای دسترسی به این اتصال در yii2 ما از دستور Yii::$app->db استفاده میکنیم. این پیکربندی در فایل پیکربندی اصلی در مسیر config/web.php وارد می شود.
ایجاد Active Record
برای نمایش و استخراج دادههای جدول country یک کلاس Active Record با نام Country درست کنید و آن را در مسیر models/Country.php ذخیره کنید.
<?php namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord { }
برای نمونه کد میتوانید به کدهای زیر نگاهی بیندازید، در اینجا ما از کلاس Country برای تغییر اطلاعات و خواندن اطلاعات استفاده میکنیم:
use app\models\Country;
// get all rows from the country table and order them by "name"
$countries = Country::find()->orderBy('name')->all();
// get the row whose primary key is "US"
$country = Country::findOne('US');
// displays "United States" echo $country->name;
// modifies the country name to be "U.S.A." and save it to database
$country->name = 'U.S.A.';
$country->save();
تمامی این متدها (مانند save) در کلاس والد ActiveRecord قرار دارد.
ایجاد Action
حال بجای استفاده از کنترلر site مانند مثالهای قبلی از کنترلر جدید استفاده میکنیم. کنترلر جدید خود را با نام CountryController ذخیره کنید و یک action با نام index در آن تعریف کنید.
<?php namespace app\controllers;
use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;
class CountryController extends Controller {
public function actionIndex() {
$query = Country::find();
$pagination = new Pagination([
'defaultPageSize' => 5,
'totalCount' => $query->count(),
]); $countries = $query->orderBy('name')
->offset($pagination->offset)
->limit($pagination->limit)
->all();
return $this->render('index', [
'countries' => $countries,
'pagination' => $pagination,
]);
} }
نکته: فایل کنترلر رو در مسیر controllers/CountryController.php ذخیره کنید.
ایجاد view
فایل view را در مسیر views/country/index.php ذخیره کنید. دقت کنید که نام پوشه همنام controller است (country).
<?php use yii\helpers\Html;
use yii\widgets\LinkPager; ?>
<h1>Countries</h1>
<ul> <?php foreach ($countries as $country): ?>
<li> <?= Html::encode("{$country->name} ({$country->code})") ?>:
<?= $country->population ?>
</li>
<?php endforeach; ?>
</ul>
<?= LinkPager::widget(['pagination' => $pagination]) ?>
نکته: در انتهای صفحه یک ویجت استفاده کردیم برای صفحه بندی (LinkPager).
خروجی که بایستی مشاهده کنید به قرار زیر است:
yii2.png