Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
在解決問題之道上不斷前行
剛好寫了一個模組有用到這個功能,所以筆記一下。在開發模組時,有些需求是讓某些route透過新分頁、新視窗獨立進行一些作用,這種狀況下會希望view裡面的html內容是脫離原先系統設計。
但回頭先簡述一下OmekaS的viewModel,我通常會用於開發模組上,例如api、某些功能頁面等等,透過Controller來呼叫view。
//比如說某個index
public function indexAction()
{
$view = new ViewModel; //呼叫ViewModel
$view->setVariable('item', $item); //塞入你想在這個view中使用的object
return $view;
}
通常會這樣來宣告,然後你從對應的route位置取得的phtml中看到成果。(例如item會傳到對應的phtml,直接透過$item來用)
而這樣的做法,頁面內容會包在原先的layout下。回到開頭所說,如果我們希望讓頁面具有獨立性的話要怎麼做呢?
對,就是本次教學的內容,使用Terminal模式,就先稱呼為終端模式吧。使用方式很簡單,如下。
public function indexAction()
{
$view = new ViewModel;
$view->setVariable('item', $item);
return $view->setTerminal(true); //最後要這樣宣告
}
使用上述做法,就能讓這個view脫離原先layout的控制,變成完全獨立的頁面囉。但要注意,因為脫離原本的layout,所以有些基本資訊要自己重新宣告,像是引用script啦、meta啦之類的,都要自己重新加上去喔。
//範例如下,不然你只會呼叫到完全空白的頁面
<?php
$translate = $this->plugin('translate');
$this->headMeta()->setCharset('utf-8');
$this->headMeta()->appendName('viewport', 'width=device-width, initial-scale=1');
$this->headLink()->prependStylesheet('//fonts.googleapis.com/css?family=Source+Code+Pro|Lato:400,400italic,700,700italic');
$this->headTitle($this->setting('installation_title', 'Omeka S'))->setSeparator(' · ');
$this->headLink()->appendStylesheet($this->assetUrl('css/iconfonts.css', 'Omeka'));
$this->headScript()->prependFile($this->assetUrl('vendor/jquery/jquery.min.js', 'Omeka'));
?>
<?php echo $this->doctype(); ?>
<?php echo $this->htmlElement('html')->setAttribute('lang', $this->lang()); ?>
<head>
<?php echo $this->headMeta(); ?>
<?php echo $this->headTitle(); ?>
<?php echo $this->headLink(); ?>
<?php echo $this->headStyle(); ?>
<?php echo $this->headScript(); ?>
</head>
<?php echo $this->htmlElement('body')->appendAttribute('class', 'minimal'); ?>
<?php echo $userBar; ?>
</body>
</html>
我第一次寫的時候不知道要重新宣告引用的資源,花了好多時間研究為什麼自行引用prependFile的資源出不來XD
因此稍微筆記一下,希望有幫助。