2014-01-19 54 views
0

我想在數據庫中保存佈局和查看模板CONTENT。每個視圖模板將關聯到layout_id。當一個控制器動作加載時,它將從數據庫中獲取適當的佈局和視圖。Zend Framework 2在數據庫中保存佈局和模板內容

我已經做了相當數量的研究,看起來像這個以前沒有討論過,至少沒有ZF2。我不僅需要網站的不同主題,還希望對設計進行版本控制,用戶可以在一個版本的模板上工作,保存並在完成發佈網站時完成。我一直在尋找自定義視圖策略和渲染器,並無法找到如何將所有東西拼湊在一起。

請教如何解決這個問題。如果有任何教程,請讓我知道。

回答

0

首先,你必須決定你的數據庫結構。我更喜歡一個表,其中對於每個控制器/操作(取決於設計的版本),您有一個佈局視圖的文件,另一個用於操作視圖。我認爲這是一種靈活的方式,因爲您可以擁有所有控制器的相同佈局,但對於每個操作的內容都有不同的視圖,或者對於特定的控制器可以有不同的佈局。

它可能是這樣的。

CREATE TABLE `templates` (
    `version` INT(5) NOT NULL, 
    `controller` VARCHAR(30) NOT NULL, 
    `action` VARCHAR(30) NOT NULL, 
    `layout_view` VARCHAR(30) DEFAULT NULL, 
    `action_view` VARCHAR(30) DEFAULT NULL, 
    PRIMARY KEY (`version`,`module`,`controller`,`action`) 
) 

記住模板的名稱必須是「模塊/控制器/行動」即是功能視圖模型:: setTemplate期待的格式。所以,如果你的模塊富,你必須在文件夾視圖,就像在你的數據庫這個美孚/圖/富/ controllerName/actionName.phtml一個層次結構,可以儲存:富/ controllerName/actionName

然後您必須在配置文件的某處設置必須使用的當前設計版本。此版本可能與本地計算機和生產服務器中的版本不同。爲此,您可以利用/config/autoload/local.php,它允許您在不同的環境中擁有不同的配置,只需告訴您的git,subversion或ftp忽略此文件,以便您可以在每個環境中使用不同的配置。 Check this docs。這將是不夠的,如果你把這樣的事情:

/config/autoload/local.php

return array(
    'designVersion' => 1, 

); 

然後,當應用程序加載時,你必須檢查設計的當前版本,並設置正確使用的模板。我會在派發事件後執行它,所以方法是在應用程序bootstrarp中添加一個偵聽器。爲此,在主模塊(即「應用程序」或「應用程序」模塊)中,您可以在Module.php中覆蓋onBootstrap函數,加載事件管理器並向MvcEvent :: EVENT_DISPATCH事件添加回調。

在那裏,你可以有機會獲得serviceManager,這樣你就可以檢索你的數據庫適配器,也可以知道當前請求的控制器和動作,目前視圖模型對象,並從它的行動viewmodel。所以你已經擁有了你需要的一切。所以你可以這樣做:

public function onBootstrap(MvcEvent $e) { 

    //get the service manager 
    $sm = $e->getApplication()->getServiceManager(); 

    //get your db adapter 
    $db=$sm->get("whatever is the service name of your database adapter, entity manager, or whatever you are using"); 

    //get the config 
    $config = $sm->get ('config'); 
    $version = $config ['designVersion']; 


    //get the event manager, and attach a callback to the MvcEvent::EVENT_DISPATCH 
    $em = $e->getApplication()->getEventManager(); 

    $em->attach (MvcEvent::EVENT_DISPATCH, function ($e) use($sm) { 


     //you get the routeMath, so you can know the controller and action 
     $routeMatch = $e->getRouteMatch(); 

     $action=$routeMatch->getParam ('action'); 
     $controller=$routeMatch->getParam ('controller'); 

     //now, with $action, $controller, and $version 
     //you query your db to get the layout and view templates: 
     $views=$db->whetever.. 
     $layout_template= $views->layout_view; 
     $action_template= $views->action_view; 


        //you get the current viewModel, it hasnt been rendered yet, so we can set the templates 
     $viewModel = $e->getViewModel(); 

     if (is_null ($viewModel)) 
       return; 

     $viewModel->setTemplate ($layout_template); 

        //and now, we get the action view model, that we know that is set as a children of the layout viewmodel. So we can retrieve it like this: 

        $children = $viewModel->getCurrent()->getChildren(); 
        $child = $children[0]; 

        //if we are afraid the view could have more children, and you want to make sure that you rerieve the correct one, then you could iterate over $children and look for the child that has the correct captureTo name set. For the action’s view model, this defaults to content: 
        /* 
        $children = $viewModel->getCurrent()->getChildren(); 
        $child=null; 
        foreach($children as $c) { 
          if ($c->captureTo() == 'content') { 
           $child=$c; 
           break; 
          } 
         } 
        */ 

       //and now, you set the template to the view: 
       $child->setTemplate ($action_template); 

     }, - 100); 

    } 
+0

感謝卡洛斯,這是很多的信息,我相信它會有用。不過,我很抱歉沒有讓我的問題更清楚,我實際上想要保存佈局並在數據庫中查看CONTENT,而不僅僅是名稱。模板內容可以像HTML一樣簡單,不需要PHP代碼。 – AlanZ

相關問題