Advertisement
  1. Code
  2. Yii

Paano I-programa ang Yii2: Pagtatrabaho sa Database at Aktibong Talaan

Scroll to top
Read Time: 10 min
This post is part of a series called How to Program With Yii2.
How to Program With Yii2: Exploring MVC, Forms and Layouts
How to Program With Yii2: Working With the Database and Active Record

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Kung ika’y nagtatanong, “Ano ang Yii?” Tignan ang nauna kong pagtuturo: Panimula sa Yii Framework, kung saan ay sinisiyasat ang benepisyo ng Yii at kabilang dito ang pangkalahatang-ideya kung ano ang bago sa Yii 2.0, nilabas noong Oktubre 12, 2014.

Sa Pag-programa ng Yii2: Pagsisimula, kami ay nag-set up ng Yii2 na lokal lamang, bumuo ng Hello World application, nag-set up ng remote server at gumamit ng GitHub upang palawakin ang ating code. Sa ikalawang parte, natutunan natin ang tungkol sa pagpapatupad ng Model View Controller architecture ng Yii’s at kung paano gumawa ng mga pahina ng web at forms na mangongolekta at magpapatunay ng datos. Sa pagtuturong ito, gagamitin natin ang database at kakayahan ng aktibong talaan para awtomatikong maggawa ang code generation para sa basic web application.

Para sa mga halimbawang ito, ipagpapatuloy natin isipin na tayo ay gagawa ng balangkas para sa pag-paskil ng simpleng status updates, hal. ang ating mini-twitter.

1. Paglikha ng Iyong Database

Una, kailangan natin lumikha ng database sa ating development environment. Ginagawa ko ito sa pamamagitan ng MAMP’s PHPMyAdmin web user interface. Mag-navigate sa PHPMyAdmin, hal. http://localhost:8888/MAMP/index.php?page=phpmyadminpiliin ang Databases tab at lumikha ng database na tatawaging hello:

MAMP PHPMyAdmin Create DatabaseMAMP PHPMyAdmin Create DatabaseMAMP PHPMyAdmin Create Database

Maari ka rin gumamit ng MySQL command line interface.

Ngayon, kami ay magbibigay ng database credentials sa Yii’s database configuration file. Buksan /hello/config/db.php at ibigay ang iyong MySQL database credentials. Ganito ang itsura nang sa akin:

1
<?php
2
3
return [
4
    'class' => 'yii\db\Connection',
5
    'dsn' => 'mysql:host=localhost;dbname=hello',
6
    'username' => 'root',
7
    'password' => 'password',
8
    'charset' => 'utf8',
9
];

Ngayon, maglilikha tayo ng ating unang database migration. Ang migration ay nagbibigay ng programmatic na paraan upang makalikha at mag-update ng database schemas. Ito ay sadyang makakatulong kung ika’y nagpapatakbo ng maramihang servers o sa development environments. Tinatanggal nito ang kahirapan sa pag-angkat ng SQL scripts.

Para sa ating halimbawa ng mga coding, maaari mong gamitin ang Git repository mula sa huling pagtuturo upang sumunod na lang,o maari kang mag-downlod ng na-kumpletong repository dito.

Lumikha ng Migration

Ang ating unang migration ay lilikha ng Status table. Buksan ang Terminal at ipasok ang mga sumusunod:

1
cd ~/Sites/hello
2
./yii migrate/create create_status_table

Ganito dapat ang itsura, kapag natapos mo na:

Yii Migration CreateYii Migration CreateYii Migration Create

Kapag iyong binukasan \hello\migrations, makikita mo ang file na may pangalan na katulad sa m141201_013120_create_status_table.php. Ganito dapat ang itsura nyan kapag binuksan.

1
<?php
2
3
use yii\db\Schema;
4
use yii\db\Migration;
5
6
class m141201_013120_create_status_table extends Migration
7
{
8
    public function up()
9
    {
10
11
    }
12
13
    public function down()
14
    {
15
        echo "m141201_013120_create_status_table cannot be reverted.\n";
16
17
        return false;
18
    }
19
}

Ito ang default migration code na bigay ng Yii. Sunod, i-update natin ito upang ibigay ang mga patlang na kailangan natin.

Pagbuo ng Status Table

Ang ating Status table ay pag-iimbakan ng mga texto na mensahe at tutukuyin kung ang isang paskil ay pribado o publiko. Bawat hanay ay magkakaroon ng id, lumikha at mag-update ng patlang ng oras.

I-update ang iyong migration code sang-ayon sa amin:

1
public function up()
2
    {
3
          $tableOptions = null;
4
          if ($this->db->driverName === 'mysql') {
5
              $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
6
          }
7
8
          $this->createTable('{{%status}}', [
9
              'id' => Schema::TYPE_PK,
10
              'message' => Schema::TYPE_TEXT.' NOT NULL DEFAULT ""',
11
              'permissions' => Schema::TYPE_SMALLINT . ' NOT NULL DEFAULT 0',
12
              'created_at' => Schema::TYPE_INTEGER . ' NOT NULL',
13
              'updated_at' => Schema::TYPE_INTEGER . ' NOT NULL',
14
          ], $tableOptions);
15
      }
16
17
18
    public function down()
19
    {
20
      $this->dropTable('{{%status}}');
21
    }

Punahin kung paano namin idinagdag ang mga depinisyon para sa mga patlang na ating kailangan gaya ng mensahe, permiso, created_at, at updated_at.

I-run ang Migration

Para sabihin sa Yii na lumikha ng table, kailangan natin i-run ang migration. Madali lan. Mula sa Terminal gain, we run ./yii migrate/up:

1
$ ./yii migrate/up
2
Yii Migration Tool (based on Yii v2.0.0)
3
4
Total 1 new migration to be applied:
5
    m141201_013120_create_status_table
6
7
Apply the above migration? (yes|no) [no]:yes
8
*** applying m141201_013120_create_status_table
9
    > create table {{%status}} ... done (time: 0.032s)
10
*** applied m141201_013120_create_status_table (time: 0.038s)
11
12
13
Migrated up successfully.

Kung nag-browse sa table gamit ang PHPMyAdmin, may makikita ka dapat na parang ganito:

PHPMyAdmin View the Status TablePHPMyAdmin View the Status TablePHPMyAdmin View the Status Table

Ngayon na nakalikha na tayo ng database table, maari na natin simulan gamitin ang Gii, Yii’s powerful scaffolding generator, para ma-automate ang lahat ng model view controller code.

2. Gamit ang Gii: Ang Yii Code Generator

Gii ay ang Yii’s scaffolding code generator. Ginagamit nito ang kaalaman ng iyong database schema para makalikha ng mahusay na sulat, default model view controller code para sa iyong aplikasyon. Maaring magawa ng Gii na masalin ang database schema sa isang karaniwan na gumaganang web application sa ilan minuto lamang. Ito ay hindi kapani-paniwalang malakas. Hayaan mong ipakita ko sa iyo kung paano ito gumagana.

Pagbuo ng Modelo

Sa Gii, atin simulan sa pamamagitan ng pagbuo ng modelo ayon sa bawat database table na ating nilikha. Para sa aming halimbawa, gagamitin natin ang Status table.

Upang simulan gamitin ang Gii, i-navigate ang iyong web application at /gii, hal. http://localhost:8888/hello/web/gii. May makikita ka na katulad nito:

Yiis Gii Scaffolding GeneratorYiis Gii Scaffolding GeneratorYiis Gii Scaffolding Generator

I-klik ang Model Generator, at ipasok ang status sa patlang ng Table Name:

Gii Model GeneratorGii Model GeneratorGii Model Generator

Kapag nag-klik ka sa Preview, ipapakita sa iyo kung anong files ang bubuuin. Dahil sa mayroon na tayong Status.php model file mula sa huling pagtuturo, i-klik ang Overwrite. Pagkatapos, i-klik ang Generate.

Gii Model Generator PreviewGii Model Generator PreviewGii Model Generator Preview

Ang mga resulta ay magiging ganito:

Gii Model Code GeneratedGii Model Code GeneratedGii Model Code Generated

Buksan ang /hello/models/Status.php file at makikita mo ang pangunahing patunay na panuntunan at form attributes kung saan ay binuo ng Yii para sa atin:

1
<?php
2
3
namespace app\models;
4
5
use Yii;
6
7
/**

8
 * This is the model class for table "status".

9
 *

10
 * @property integer $id

11
 * @property string $message

12
 * @property integer $permissions

13
 * @property integer $created_at

14
 * @property integer $updated_at

15
 */
16
class Status extends \yii\db\ActiveRecord
17
{
18
    /**

19
     * @inheritdoc

20
     */
21
    public static function tableName()
22
    {
23
        return 'status';
24
    }
25
26
    /**

27
     * @inheritdoc

28
     */
29
    public function rules()
30
    {
31
        return [
32
            [['message', 'created_at', 'updated_at'], 'required'],
33
            [['message'], 'string'],
34
            [['permissions', 'created_at', 'updated_at'], 'integer']
35
        ];
36
    }
37
38
    /**

39
     * @inheritdoc

40
     */
41
    public function attributeLabels()
42
    {
43
        return [
44
            'id' => 'ID',
45
            'message' => 'Message',
46
            'permissions' => 'Permissions',
47
            'created_at' => 'Created At',
48
            'updated_at' => 'Updated At',
49
        ];
50
    }
51
}

Pagbuo ng Web Interface

Ngayon, oras na para gamitin ang Gii para buuin ang controller at views para sa Status table. Bumalik sa Gii home page at i-klik ang CRUD Generator, http://localhost:8888/hello/web/gii/crud:

Para sa Model Class, itala ang app\models\Status (Ang mga tala na ito ay case sensitive). Para sa Search Model Class, magpasok app\models\StatusSearch. Para sa Controller Class, magpasok app\controllers\StatusController. Dapat itong magmukhang ganito:

Yiis Gii CRUD GeneratorYiis Gii CRUD GeneratorYiis Gii CRUD Generator

I-klik ang Preview. Makikita mo ang mga sumusunod-siguraduhin na click Overwrite ulit dahil sa mayroon tayong lumang files mula sa huli nating pagtuturo na kailangan i-update:

Yiis Gii CRUD Generator PreviewYiis Gii CRUD Generator PreviewYiis Gii CRUD Generator Preview

Kapag na-klik mo ang Generate, makikita mo ang lahat ng controller at view files generated:

Yiis Gii CRUD Generated CodeYiis Gii CRUD Generated CodeYiis Gii CRUD Generated Code

Ang mga pahina ng Default CRUD

I-navigate ang iyong browser sa http://localhost:8888/hello/web/status, at makikita mo ang generated CRUD index page. Gayon wala pa namang anuman mga hanay sa database, ito’y lumalabas na walang laman.

Yiis Gii CRUD Generated Index GridYiis Gii CRUD Generated Index GridYiis Gii CRUD Generated Index Grid

Ngayon, mag-klik sa Create Status at makikita mo ang default Create Status Form na nilikha ng Gii:

Yii Default Form for Status TableYii Default Form for Status TableYii Default Form for Status Table

Lubhang kahanga-hanga kung gaano kabilis nilikha ng Gii ang code para sa atin. Sunod, ating i-customize ang scaffolding code para magawa nitong gumana para sa atin.

3. Pag-customize ng Ating Code

Pag-customize ng Form View

Ating linisin ang form. Sa /hello/views/Status/_form.php, tanggalin ang nalikha at na-update na fields:

1
    <?= $form->field($model, 'created_at')->textInput() ?>
2
    <?= $form->field($model, 'updated_at')->textInput() ?>

Palitan ang permissions field ng may drop-down list code na nilikha natin sa ikalawang parte ng seryeng ito:

1
<?=
2
    $form->field($model, 'permissions')->dropDownList($model->getPermissions(), 
3
             ['prompt'=>'- Choose Your Permissions -']) ?>

Kailangan natin ilagay ang getPermissions function din muli sa model. I-edit /hello/models/Status.php. Ibalik ang constant definitions at permissions function:

1
      const PERMISSIONS_PRIVATE = 10;
2
      const PERMISSIONS_PUBLIC = 20;  
3
...
4
5
public function getPermissions() {
6
      return array (self::PERMISSIONS_PRIVATE=>'Private',self::PERMISSIONS_PUBLIC=>'Public');
7
    }
8
    
9
    public function getPermissionsLabel($permissions) {
10
      if ($permissions==self::PERMISSIONS_PUBLIC) {
11
        return 'Public';
12
      } else {
13
        return 'Private';        
14
      }
15
    }

Ang iyong bagong Status form ay dapat magmukhang ganito:

Revised Status Create FormRevised Status Create FormRevised Status Create Form

Kailangan natin isaayos ang controller ng konti para gawin na ang form ay ma-save nang tama.

Pag-customize sa Controller

Sa /hello/controllers/StatusController.php, palitan ang actionCreate method ng code na ito:

1
public function actionCreate()
2
    {
3
        $model = new Status();
4
5
        if ($model->load(Yii::$app->request->post())) {
6
          $model->created_at = time();
7
          $model->updated_at = time();
8
           if ($model->save()) {             
9
             return $this->redirect(['view', 'id' => $model->id]);             
10
           } 
11
        } 
12
        return $this->render('create', [
13
            'model' => $model,
14
        ]);
15
    }

Kapag ang form ay naipaskil na, mano-mano nating i-set ang created at updated_at fields, pagkatapos ay i-save natin ang datos sa database.

Kapag na-save mo na ang iyong unang status update, makikita mo ang mga sumusunod na view page:

Default Status ViewDefault Status ViewDefault Status View

Pagsasaayos ng Layout

Ating isaayos muli ang navbar upang hindi ito mag-drop down para sa Status pero lilipat diretso sa Status index page. I-edit /hello/views/layouts/main.php at palitan ng ang Nav::widget code nang ganito:

1
echo Nav::widget([
2
                'options' => ['class' => 'navbar-nav navbar-right'],
3
                'items' => [
4
                    ['label' => 'Home', 'url' => ['/site/index']],
5
                    ['label' => 'Status', 'url' => ['/status/index']],
6
                    ['label' => 'About', 'url' => ['/site/about']],
7
                    ['label' => 'Contact', 'url' => ['/site/contact']],
8
                    Yii::$app->user->isGuest ?
9
                        ['label' => 'Login', 'url' => ['/site/login']] :
10
                        ['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
11
                            'url' => ['/site/logout'],
12
                            'linkOptions' => ['data-method' => 'post']],
13
                ],
14
            ]);

Ang Grid View

Kapag ikaw ay babalik sa Status index view, makikita mo ang Yii2 Grid na puno ng datos:

Default Grid View with DataDefault Grid View with DataDefault Grid View with Data

Ang code na nag-generate ng pahinang ito ay sa /hello/views/status/index.php:

1
<?php
2
3
use yii\helpers\Html;
4
use yii\grid\GridView;
5
6
/* @var $this yii\web\View */
7
/* @var $searchModel app\models\StatusSearch */
8
/* @var $dataProvider yii\data\ActiveDataProvider */
9
10
$this->title = 'Statuses';
11
$this->params['breadcrumbs'][] = $this->title;
12
?>
13
<div class="status-index">
14
15
    <h1><?= Html::encode($this->title) ?></h1>
16
    <?php // echo $this->render('_search', ['model' => $searchModel]); ?>

17
18
    <p>
19
        <?= Html::a('Create Status', ['create'], ['class' => 'btn btn-success']) ?>
20
    </p>
21
22
    <?= GridView::widget([
23
        'dataProvider' => $dataProvider,
24
        'filterModel' => $searchModel,
25
        'columns' => [
26
            ['class' => 'yii\grid\SerialColumn'],
27
28
            'id',
29
            'message:ntext',
30
            'permissions',
31
            'created_at',
32
            'updated_at',
33
34
            ['class' => 'yii\grid\ActionColumn'],
35
        ],
36
    ]); ?>
37
38
</div>

Kung sinubukan mo ang column sorting at view, i-update at burahin ang icons, makikita mo na ang Gii ay bumuo din ng mga tampok para sa lahat ng pag-andar nito.

Kung kaya’t sa ilan minuto lamang, nalikha natin ang schema para sa ating database, at nag-generate ng model at lahat ng web application code na kinakailangan para sa basic application. Sana ay nakita mo ang kahanga-hangang kakayahan ng Yii’s code generation kagaya ko.

Ano ang Susunod?

Sunod, Ipapakita ko sa iyo kung paano magbuo ng pag-rehistro ng gumagamit at kakayahang mag-login sa ating application para ma-set up natin ang pinagsamang kaugnayan sa pagitan ng status posts at specific users.

Kung nais mong malaman kung kailan ang susunod na dating ng pagtuturo sa Yii2, sundan ako @reifman sa Twitter o tignan ang aking Tuts+ pahina ng tagapagturo. Ang aking pahina ng tagapagturo ay kasama ang lahat ng mga artikulo mula sa seryeng ito sa sandaling ito ay malatha.

Kaugnay na Links

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.