走進Zend Framework架構編程(六):視圖(1)

來源:互聯網
上載者:User

本部分內容包括:視圖,模板,視圖協助類等。

6.0視圖介紹
在Zendframework的MVC編程模型中,視圖(View)是在控制器的控制和指揮下,用來對程式邏輯進行呈現(Render)的。呈現的結果,就是我們在瀏覽器裡看到的文字、圖片、表單等各種網頁元素及其字型、顏色、樣式等各種效果。
Zend_View Class就是負責視圖工作的類,它有效地完成了視圖與程式邏輯的分離。它提供了視圖協助、輸出過濾和變數轉義等功能。
Zend_View還是一個模板系統,我們可以用PHP作為我們的範本語言。當然ZF還可以在View指令碼裡使用其他第三方的模板系統,比如PHPLib和Smarty等。
使用Zend_View時主要分兩步,首先聲明一個Zend_View執行個體,把變數等賦給它,然後使用控制指令碼,根據視圖指令碼呈現出結果。

例如:

控制指令碼(在控制器檔案的action裡,例如IndexController.php中的函數dispdataAction()):
……
Function dispdataAction()
{
……
$data = 'to view'; //資料變數
Zend_Loader::loadClass('Zend_View');
$view = new Zend_View(); //執行個體化
$view->books = $data;  //賦值
echo $view->render('view.php');
}

視圖指令碼轉義輸出語句(在視圖指令檔裡,本例是view.php):
<?
php echo $this->escape($this->data
?>

6.1引導檔案中setParam('noViewRenderer', <bool>)語句的再解釋
Index檔案中$fc->setParam('noViewRenderer', <bool>);語句和視圖的某性特性有很大關係,比如視圖存放的路徑等一些預設屬性都受該開關屬性的影響。
false 是noViewRenderer的預設值。也就是說,如果沒有該語句,則認為noViewRenderer參數被設定為false。
noViewRenderer參數被設定為false:意味著控制器使用ZF預設的視圖特性,比如視圖檔案預設必須存放於views/script/<action>/檔案夾下,視圖檔案必須存在,而且其名字必須為<action>.phtml。.phtml是ZF使用的PHP指令檔,和普通PHP檔案沒有本質區別。同時,視圖對象預設被執行個體化為$view變數,在控制指令碼中使用$view的形式為:$this->view->…。
noViewRenderer參數被設定為true:意味著控制器不使用ZF預設的視圖特性,而是通過顯式的執行個體化Zend_view對象,通過我們自己的代碼來設定視圖對象的屬性和方法。本部分“視圖介紹”中就是顯式聲明和使用視圖對象的例子。為了程式的靈活性和可控行,我們自然建議把noViewRenderer 設定為 true,這也是比較通常的做法。

6.2視圖對象的Options
視圖對象的Options選項進一步規定了視圖指令碼呈現過程中的一些細節。這些選項可以通過在聲明視圖對象時指定,在建構函式裡設定,也可以通過set……()方法來指定。
—basePath基本路徑
設定方法:setBasePath(), addBasePath()
例如目錄結構:
base/path/
      helpers/
      filters/
      scripts/
     用$view->setBasePath(”base/ path/”);語句設定基本路徑後,在沒有$view->setScriptPath('……');語句直接指定指令碼路徑時,就會自動在base/path/scripts/下搜尋視圖指令檔,如果使用了視圖助手和過濾器,就會分別自動在helpers/和 filters/檔案夾下搜尋。

—encoding字元編碼
用來在使用htmlentities()、htmlspecialchars()或其他動作時,指定字元編碼。
設定方法:setEncoding()
預設編碼是ISO-8859-1 (latin1)。

—escape回呼函數
用於在視圖呈現時調用該函數。後邊有樣本。
設定方法:setEscape()

—filter過濾器
用於在視圖呈現後調用過濾方法。
設定方法:setFilter(), addFilter(),

—strictVars
當視圖視圖發送一個未初始化的變數時,用該選項指定ZF收購給出一個提示或警告資訊:
Notice: Key "xxx" does not exist ……
設定方法:strictVars(true)

6.3視圖對象的一些屬性存取方法
—getVars() 得到所有賦予的變數
—clearVars()清除所有賦予的變數
—getScriptPath($script) 得到給定指令碼的路徑
—getScriptPaths()得到所有指令碼的路徑
—getHelperPath($helper)得到某個指定助手類的路徑
—getHelperPaths()得到所有助手的路徑
—getFilterPath($filter) 得到某個指定過濾器類的路徑
—getFilterPaths()得到所有過濾器的路徑

6.4視圖的路徑:
6.4.1視圖指令碼的搜尋路徑
如果引導檔案中$fc->setParam('noViewRenderer', false);
則預設指定視圖檔案views/scripts/[controller_name]/[action].phtml
在實際的程式碼中,為了獲得可定製的靈活性,都在控制器中實際指定了視圖檔案的路徑:
指定路徑例句:$view->setScriptPath('…/views');或
$view->addScriptPath('…/views');
這個時候,引導檔案必須有$fc->setParam('noViewRenderer', true);語句,即設定noViewRenderer為true。
6.4.2視圖指令碼的搜尋的優先順序
$view = new Zend_View();
$view->addtScriptPath('…/views1');
$view->addScriptPath('…/views2');
$view->addScriptPath('…/views3');
Zend的手冊是這樣說的:“如果沒有指定任何搜素路徑,則在控制器檔案下搜尋視圖檔案。”但是通過實際環境測試,發現這時會報告錯誤:
“no view script directory set; unable to determine location for view script”
看起來最少需要指定一個搜尋路徑。
如果指定了多條搜素路徑,則最後的搜尋路徑優先。也就是說,如果所有的搜尋路徑下有相同的視圖檔案,則最後路徑下的起作用,它覆蓋了前邊路徑下的視圖檔案。

6.5視圖控制指令碼及其變數傳遞
ZF的控制器是執行個體化和設定Zend_View的地方。在這裡,我們給視圖賦值並告訴它用指定的視圖指令碼去呈現它們。
6.5.1給視圖對象賦值
樣本:
$view->Variable=”……”;的形式
    function assign1Action()
    {
      $view = new Zend_View();
      $view->setScriptPath('views');
      $view->strictVars(true);
      $view->a = "Hay";
      $view->b = "Bee";
      $view->c = "Sea";
      $view->d;
      echo $view->render('tp_abc.php');
   }
樣本:
$view-> assign(' Variable ', "……");的形式
    function assign2Action()
    {
      $view = new Zend_View();
      $view->setScriptPath('views');
      $view->assign('a', "Hay");
      $view->assign('b', "Bee");
      $view->assign('c', "Sea");
      echo $view->render('tp_abc.php');
   }
樣本:數組
   function assign3Action()
    {
      $view = new Zend_View();
      $view->setScriptPath('views');
      $array = array(
        'a' => "Hay",
        'b' => "Bee",
        'c' => "Sea",
      );
      $view->assign($array);
      echo $view->render('tp_abc.php');
   }
樣本:對象
    function assign4Action()
    {
      $view = new Zend_View();
      $view->setScriptPath('views');
      $obj = new StdClass;
      $obj->a = "Hay";
      $obj->b = "Bee";
      $obj->c = "Sea";
      $view->assign((array) $obj);
      echo $view->render('tp_abc.php');
   }
樣本:
    使用回呼函數。
    function myhtmlentityAction()
    {
      $view = new Zend_View();
      $view->setScriptPath('views');
//自訂類,在/models檔案夾下的myclass.php檔案中定義
      $mycls = new myClass();
//調用$mycls類的myHtmlEntity方法
      $view->setEscape(array($mycls, 'myHtmlEntity'));

      $obj = new StdClass;
      $obj->a = "the words hay bee sea ";
      $obj->b = "this is bee";
      $obj->c = " this is sea";
      $view->assign((array) $obj);
      echo $view->render('tp_abc.php');
   }
tp_abc.php視圖指令碼模板檔案內容:
<?php
  echo 'a = ' . $this->escape($this->a).'<br>';
  echo 'b = ' . $this->escape($this->b).'<br>';
  echo 'c = ' . $this->escape($this->c).'<br>';   
?>
myclass.php檔案內容:
<?php
  class myClass
  {
    public function __construct($options = null)
    {
    }
    function myHtmlEntity($val)
    {//把所有單詞首字母變為大寫
      return ucwords($val);
    }
  }
?>
輸出結果:
a = The Words Hay Bee Sea
b = This Is Bee
c = This Is Sea

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.