首先,你必須決定你的數據庫結構。我更喜歡一個表,其中對於每個控制器/操作(取決於設計的版本),您有一個佈局視圖的文件,另一個用於操作視圖。我認爲這是一種靈活的方式,因爲您可以擁有所有控制器的相同佈局,但對於每個操作的內容都有不同的視圖,或者對於特定的控制器可以有不同的佈局。
它可能是這樣的。
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);
}
感謝卡洛斯,這是很多的信息,我相信它會有用。不過,我很抱歉沒有讓我的問題更清楚,我實際上想要保存佈局並在數據庫中查看CONTENT,而不僅僅是名稱。模板內容可以像HTML一樣簡單,不需要PHP代碼。 – AlanZ