2017-03-18 60 views
1

我開始使用Phalcon框架並使用Volt作爲模板引擎。我有Symfony/Twig的一些經驗。 我閱讀文檔,並試圖尋找所有在互聯網上,但不能找到一種令人滿意的方式來完成我想要的(我覺得醜這裏描述的解決方案:How do I create common template with header and footer for phalcon projects with Volt Engine;它不使用伏本身的導航。)Phalcon/Volt動態構建/渲染通用模板區域(部分)

所以這個故事很簡單:我的基本模板由4部分組成:導航,標題,內容和頁腳。我使用partials將公共區域包含在基本模板中,如導航,頁眉和頁腳,可以很好地處理「靜態數據」。

現在的問題是:如何從數據庫中動態生成導航菜單項?該模板的公共區域也必須來自數據庫,包括頁眉,頁腳和側邊欄。在所有控制器動作中獲取它聽起來像是矯枉過正,並不是非常幹(可能是在init部分做的,但必須在每個控制器中完成,也許在抽象控制器中,我不知道)

什麼是在Phalcon/Volt中完成這個最好的方法是什麼?在Symfony/Twig中,你可以從視圖中調用一個控制器動作,所以你可以像一個LayoutController一樣在頁面中呈現局部變量。

謝謝!

回答

2

這裏有一些變種:

1)你的控制器可以擴展BaseController和它的initialize()方法,你可以分配這些變量到視圖。

class BaseController extends \Phalcon\Mvc\Controller 
{ 
    public function initialize() 
    { 
     // Common Variables 
     $this->view->assetsSuffix = $this->config->debug ? '' : '.min'; 
    } 

2)創建它加載數據的自定義伏功能。

// In your Volt service: 
$compiler->addFunction('getMenu', function($resolvedArgs, $exprArgs){ 
    return 'Helpers\CommonFunctions::getMenu(' . $resolvedArgs . ')'; 
}) 

// Helper file and function 
public static function getMenu() 
{ 
    return \Models\Menu::find(); 
} 

// Volt usage 
{% set menuItems = getMenu() %} 
{% for item in menuItems %} 

{% endfor %} 

3)使用模型直接從模板查詢數據庫。然而這還不支持Volt(不知道它是否在最新版本中添加,必須確認)。

<?php $menuItems = \Models\Menu::find(); ?> 
{% for item in menuItems %} 

{% endfor %} 

4)的Ajax/JavaScript的,但是這是真的取決於你的應用程序。像Angular的方法,但我不會詳細介紹這個變種。

+1

Nicolay,謝謝你的建議。 4號不是這種情況。數字3聽起來有點奇怪,因爲你必須直接從視圖中調用模型。 2號有點類似於3,但你只需通過伏特函數代理。我在想1號是要走的路。我可能會堅持通過控制器的方法。無論如何,我還是傾向於這樣做,只是想確保自從我是Phalcon/Volt noob以來我不會錯過任何明顯的東西。 :) – CtrlAltDel