Views và Layout trong Yii2

0
819

Views là 1 thành phần quan trọng trong mô hình MVC.View trong Yii2 có chức năng và tác dụng đó chính là trả về dữ liệu mà người dùng cuối cùng .

1 Tạo views

Views đơn giản là 1 file php kết hợp sự trộn lẫn giữa php và html .Php tạo ra các nội dung động và html có nhiệm vụ sắp xếp các nội dung đó đúng vị trí của nó

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $form yii\widgets\ActiveForm */
/* @var $model app\models\LoginForm */

$this->title = 'Login Demo';
?>
<h1><?= Html::encode($this->title) ?></h1>

<p>Please fill out the following fields to login:</p>

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'name') ?>
     <?= $form->field($model, 'email') ?>
    <?= $form->field($model, 'password')->passwordInput() ?>
    <?= Html::submitButton('Login') ?>
<?php ActiveForm::end(); ?>

2 Bảo mật

Để tránh trường hợp bị tấn công XSS ,Yii2 thường dùng bảo mật với 2 phương thức là html:encode và HtmlPurifier ở phần view nhằm tránh hiện tượng bị chèn js để tấn công website.

Dưới đây là cách dùng Html:encode và HtmlPurifier

<?php
use yii\helpers\Html;
?>

<div class="name">
    <?= Html::encode($user->name) ?>
</div>
<?php
use yii\helpers\Html;

use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $form yii\widgets\ActiveForm */
/* @var $model app\models\LoginForm */

$this->title = 'Login Demo';
?>
<h1><?= Html::encode($this->title) ?></h1>
<?= HTMLPurifier($doan_ma_html)?>
<p>Please fill out the following fields to login:</p>

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'name') ?>
     <?= $form->field($model, 'email') ?>
    <?= $form->field($model, 'password')->passwordInput() ?>
    <?= Html::submitButton('Login') ?>
<?php ActiveForm::end(); ?>

Đó cách dùng đơn giản bạn chỉ cần nhớ nếu muốn show ra plain text thì dùng Html:encode, Còn muốn xâu ra đoạn mã Html khi dùng ckeditor thì dùng HTMLPurifier

2 Rendering Views

Bạn có thể render video trong controller,view,widget hoặc bất kì chỗ nào bạn cần đến views 🙂

2.1 render trong controller

Đây là phương thức render cơ bản mà mà có các kiểu render như sau :

  • render(): render tên view và áp dụng trực tiếp với layout hiện tại
  • renderPartial(): renders với view hiện tại nhưng áp dụng với các layout bất kì
  • renderAjax(): renders với bất kì layout nào nhưng đã bị hủy bỏ đi tất cả các js với css
  • renderFile(): render ra views đặc biệt với 1 đường link nào đó
  • renderContent():render ra 1 chuỗi tính gắn vào 1 layout nào đó

Chúng ta thường dùng 3 loại render đầu .Dưới đây là đoạn render của mình

<?php
namespace frontend\controllers;
use Yii;
use yii\web\Controller;
use frontend\models\Demo;
use yii\base\Model;

class DemoController extends Controller
{
	
	public function actionIndex()
	{
		
		$model = new Demo();
		$data="Hello word";
		return $this->render('index',['data'=>$data,'model'=>$model]);
	}
	public function actionView()
	{
		
		return $this->render('view');
	}
}

2.2 Render view trong Widgets

Đây là phần mình hay dùng nhất .Giống như widget khi sử dụng trong wordpress chúng ta có thể tách từng phần ra 1 .Ví dụ tin hot trong ngày,top 10 phim xem nhiều nhất trong ngày .Để đơn giản chúng ta chỉ cần làm 1 bộ widget .

Ở đây mình sẽ tạo 1 demowidget trong muc common/widgets có code như sau

<?php
namespace common\widgets;
use yii\base\Widget;

class Demowidget extends Widget
{
	public function run()
	{
		return $this->render('demowidget');
	}
}

tạo folder view trong folder widgets rồi tạo 1 file php có tên là demowidget.php

<a>Đây là demo widget dùng trong yii</a>

Cách dùng : Bạn chỉ cần gọi hàm <?= Demowidget::widget();?> .Lưu ý trước đó bạn phải import bằng lệnh

use common\widgets\Demowidget;

Ok vậy đã xong

2.3 Render view trong view

Hiểu đơn giản là lồng view này vào view kia .Ở đây có 3 kiểu lồng view vào nhau là

  • lồng view kiểu render
  • lồng view kiểu ajax dùng khi xử lý dữ liệu ,check dữ liệu bằng ajax
  • lồng view kiểu renderFile()

Kiểu này chỉ lồng view trong cùng 1 folder view thôi còn bạn muốn lồng trong folder khác thì cần làm như sau

// displays the view file "@app/views/site/license.php"
echo \Yii::$app->view->renderFile('@app/views/site/license.php');

Đơn giản là vậy thôi

Layouts trong Yii2

Layouts là 1 kiểu views đặc biệt bao gồm nhiều views trong nó .Ví dụ nó bao gồm những thứ như head hay footer .Dưới đây là 1 layout hoàn chỉnh

<?php
use yii\helpers\Html;

/* @var $this yii\web\View */
/* @var $content string */
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <?= Html::csrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
    <header>My Company</header>
    <?= $content ?>
    <footer>&copy; 2014 by My Company</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

Cấu trúc chung ở đây bao gồm

<?php $this->beginPage() ?>

<?php $this->head() ?>

<?php $this->beginBody() ?>

<?php $this->endBody() ?>

<?php $this->endPage() ?>

Các thành phần khác trong layout

<title><?= Html::encode($this->title) ?></title>
<?php
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php']);
?>
$this->registerLinkTag([
    'title' => 'Live News for Yii',
    'rel' => 'alternate',
    'type' => 'application/rss+xml',
    'href' => 'http://www.yiiframework.com/rss.xml/',
]);

Trên đây là tất cả những kiến thức về views trong yii2 .Đây là phần rất quan trong các bạn cần chú ý

 

 

SHARE
Previous articleModels trong YII2
Next articleFilters trong yii2