Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

[OmekaS]viewModel的終端(Terminal)模式

內容目錄

viewModel的終端(Terminal)模式

剛好寫了一個模組有用到這個功能,所以筆記一下。在開發模組時,有些需求是讓某些route透過新分頁、新視窗獨立進行一些作用,這種狀況下會希望view裡面的html內容是脫離原先系統設計。

關於OmekaS的viewModel

但回頭先簡述一下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)模式

對,就是本次教學的內容,使用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
因此稍微筆記一下,希望有幫助。