首頁  >  文章  >  後端開發  >  PHP的Yii框架中建立視圖和渲染視圖的方法詳解

PHP的Yii框架中建立視圖和渲染視圖的方法詳解

高洛峰
高洛峰原創
2017-02-06 17:25:431311瀏覽

視圖是 MVC 模式中的一部分。 它是展示資料到終端使用者的程式碼,在網頁應用程式中,根據視圖範本來建立視圖,視圖範本為PHP腳本文件,主要包含HTML程式碼和展示類別PHP程式碼,透過yiiwebView應用元件來管理, 此元件主要提供通用方法幫助視圖建構和渲染,簡單起見,我們稱視圖模板或視圖模板檔案為視圖。

建立視圖

如前所述,視圖為包含HTML和PHP程式碼的PHP腳本,如下程式碼為一個登入表單的視圖, 可看到PHP程式碼用來產生動態內容如頁面標題和表單,HTML程式碼把它組織成一個漂亮的HTML頁面。

<?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 = &#39;Login&#39;;
?>
<h1><?= Html::encode($this->title) ?></h1>
 
<p>Please fill out the following fields to login:</p>
 
<?php $form = ActiveForm::begin(); ?>
  <?= $form->field($model, &#39;username&#39;) ?>
  <?= $form->field($model, &#39;password&#39;)->passwordInput() ?>
  <?= Html::submitButton(&#39;Login&#39;) ?>
<?php ActiveForm::end(); ?>

在視圖中,可存取 $this 指向 yiiwebView 來管理和渲染這個視圖檔案。

除了 $this之外,上述範例中的視圖有其他預定義變數如 $model, 這些變數代表從控制器或其他觸發視圖渲染的物件 傳入 到視圖的資料。

技巧: 將預先定義變數列到視圖檔案頭部註解處,這樣可被IDE編輯器識別,也是產生視圖文件的好方法。
安全

當創建生成HTML頁面的視圖時,在顯示之前將用戶輸入資料進行轉碼和過濾非常重要, 否則,你的應用程式可能會被跨站腳本 攻擊。

要顯示純文本,先調用yiihelpersHtml::encode() 進行轉碼,例如如下代碼將用戶名在顯示前先轉碼:

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

要顯示HTML內容,先調用yiihelpersHtmlPurifier 過濾內容,例如如下代碼將如下代碼提交內容在顯示前先過濾:

<?php
use yii\helpers\HtmlPurifier;
?>
 
<div class="post">
  <?= HtmlPurifier::process($post->text) ?>
</div>

技巧:HTMLPurifier在保證輸出資料安全上做的不錯,但效能不佳,如果你的應用需要高效能可考慮快取過濾後的結果。

組織視圖

與控制器和模型類似,在組織視圖上有一些約定:

控制器渲染的視圖檔案預設放在@app/views/ControllerID 目錄下, 其中ControllerID 對應控制器ID, 例如控制器類別為PostController,視圖檔案目錄應為@app/views/post, 控制器類別PostCommentController對應的目錄為@app/views/post-comment, 若是模組中的控制器,目錄應為yiibaseModule::basePath 模組目錄下的views/ControllerID 目錄;
對於小部件渲染的視圖文件預設放在WidgetPath/views 目錄, 其中WidgetPath 代表小部件類文件所在的目錄;
對於其他對象渲染的視圖文件,建議遵循和小部件相似的規則。
可覆寫控制器或小工具的 yiibaseViewContextInterface::getViewPath() 方法來自訂視圖檔案預設目錄。

渲染視圖

可在控制器, 小部件, 或其他地方調用渲染視圖方法來渲染視圖, 此方法類似以下格式:

/**
 * @param string $view 视图名或文件路径,由实际的渲染方法决定
 * @param array $params 传递给视图的数据
 * @return string 渲染结果
 */
methodName($view, $params = [])

控制器中渲染

在控制器中,可調用以下控制器方法來渲染視圖:

yiibaseController::render(): 渲染一個視圖名稱並使用一個佈局返回渲染結果。

yiibaseController::renderPartial(): 渲染一個 視圖名稱 並且不使用佈局。

yiiwebController::renderAjax(): 渲染一個 視圖名稱 並且不使用佈局, 並註入所有註冊的JS/CSS腳本和文件,通常使用在響應AJAX網頁請求的情況下。

yiibaseController::renderFile(): 渲染一個視圖檔案目錄或別名下的視圖檔案。

例如:

namespace app\controllers;
 
use Yii;
use app\models\Post;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
 
class PostController extends Controller
{
  public function actionView($id)
  {
    $model = Post::findOne($id);
    if ($model === null) {
      throw new NotFoundHttpException;
    }
 
    // 渲染一个名称为"view"的视图并使用布局
    return $this->render(&#39;view&#39;, [
      &#39;model&#39; => $model,
    ]);
  }
}

小物件
小物件是CWidget 或其子類別的實例.它是一個主要用於表現資料的元件.小物件通常內嵌於一個視圖來產生一些複雜而獨立的使用者介面.例如,一個日曆小物件可用於渲染一個複雜的日曆介面.小物件使用戶介面更加可復用.

我們可以按如下視圖腳本來使用一個小物件:

<?php $this->beginWidget(&#39;path.to.WidgetClass&#39;); ?>
...可能会由小物件获取的内容主体...
<?php $this->endWidget(); ?>

<?php $this->widget(&#39;path.to.WidgetClass&#39;); ?>

後者用於不需要任何body 內容的元件.

小物件可透過配置來自訂它的表現。這是透過呼叫CBaseController::beginWidget 或CBaseController::widget 設定其初始化屬性值來完成的.例如,當使用CMaskedTextField 小物件時,我們想指定被使用的mask (可理解為一種輸出格式,譯者註).我們透過傳遞一個攜帶這些屬性初始化值的數組來實現.這裡的數組的鍵是屬性的名稱,而數組的值則是小物件屬性所對應的值.如以下所示:

<?php
$this->widget(&#39;CMaskedTextField&#39;,array(
  &#39;mask&#39;=>&#39;99/99/9999&#39;
));
?>

繼承CWidget 並覆寫其init() 和run() 方法,可以定義一個新的小物件:

class MyWidget extends CWidget
{
  public function init()
  {
    // 此方法会被 CController::beginWidget() 调用
  }
  
  public function run()
  {
    // 此方法会被 CController::endWidget() 调用
  }
}

小物件可以像一個控制器一樣擁有它自己的視圖.預設情況下,小物件的視圖檔案位於包含了小物件類別檔案目錄的views 子目錄之下.這些視圖可以透過呼叫CWidget::render() 渲染,這一點和控制器很相似.唯一不同的是,小對象的視圖沒有佈局文件支援。另外,小物件視圖中的$this指向小物件實例而不是控制器實例。

視圖中渲染

可以在視圖中渲染另一個視圖,可以呼叫yiibaseView視圖元件提供的以下方法:

yiibaseView::render(): 渲染一個 視圖名稱.

yii\web\View::renderAjax(): 渲染一个 视图名 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。

yii\base\View::renderFile(): 渲染一个视图文件目录或别名下的视图文件。

例如,视图中的如下代码会渲染该视图所在目录下的 _overview.php 视图文件, 记住视图中 $this 对应 yii\base\View 组件:

<?= $this->render(&#39;_overview&#39;) ?>

其他地方渲染

在任何地方都可以通过表达式 Yii::$app->view 访问 yii\base\View 应用组件, 调用它的如前所述的方法渲染视图,例如:

// 显示视图文件 "@app/views/site/license.php"
echo \Yii::$app->view->renderFile(&#39;@app/views/site/license.php&#39;);

更多PHP的Yii框架中创建视图和渲染视图的方法详解相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn