以前的文章中,,我們曾經(jīng)說過 $mainframework->dispatch 是如何最終調(diào)用組件的,通過這個dispatch,,最終 include 相應(yīng)組件目錄下的 組件名稱.php 文件,現(xiàn)在我們來看看,,這個文件是怎么按部就班的聯(lián)系了MVC模式相關(guān)的各個文件,。
require_once (JPATH_COMPONENT.DS.'controller.php');
// Require specific controller if requested
if($controller = JRequest::getVar('controller')) {
require_once (JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php');
}
// Create the controller
$classname = 'HelloController'.$controller;
$controller = new $classname( );
// Perform the Request task
$controller->execute( JRequest::getVar('task'));
// Redirect if set by the controller
$controller->redirect();
其實就是根據(jù)request提交的controller參數(shù),創(chuàng)建相應(yīng)的JController對象,,然后由controoler對象執(zhí)行相應(yīng)的任務(wù),。
這樣我們就完全理解了,一個組件是如何被調(diào)用,MVC組件是如何執(zhí)行,,并最后返回html代碼的,。
模塊是如何被調(diào)用執(zhí)行并渲染?
文章分類:PHP編程
以前的文章中,,關(guān)于/index.php我們已經(jīng)分析完了 $mainframe->dispatch()是引入了組件,,并被執(zhí)行。我們知道對于Joomla,,一個頁面只能有一個或者0個組件,,而上,下左右的碎片都是module,,module是頁面豐富的有效補充,。比如我們知道菜單是 mod_mainmenu,而footer是mod_footer等等,那么這些module是怎么被引入的,,并最后執(zhí)行的,?
秘密都在$mainframe->render()這個函數(shù)上,我們看看這個函數(shù)都做了什么工作,。
以下是JSite 的render 函數(shù)的內(nèi)容
$document =& JFactory::getDocument();
$user =& JFactory::getUser();
// get the format to render
$format = $document->getType();
switch($format)
{
case 'feed' :
{
$params = array();
} break;
case 'html' :
default :
{
$template = $this->getTemplate();
$file = JRequest::getCmd('tmpl', 'index');
if ($this->getCfg('offline') && $user->get('gid') < '23' ) {
$file = 'offline';
}
if (!is_dir( JPATH_THEMES.DS.$template ) && !$this->getCfg('offline')) {
$file = 'component';
}
$params = array(
'template' => $template,
'file' => $file.'.php',
'directory' => JPATH_THEMES
);
} break;
}
$data = $document->render( $this->getCfg('caching'), $params);
JResponse::setBody($data);
其實重要的部分是引入了相應(yīng)的模板文件(template/***/index.php),,并調(diào)用了 JDocumentHtml的 render 函數(shù)。
看到這里,,我們終于明白了,,模板的index.php原來是這個時候被引入的。
我們再看看 JDocumentHtml 的render函數(shù),。
這個函數(shù)中最重要的兩句程序是
$data = $this->_loadTemplate($directory.DS.$template, $file); 載入模板文件
$data = $this->_parseTemplate($data); 解析模板
再繼續(xù)看看解析模板是什么過程:
$replace = array();
$matches = array();
if(preg_match_all('##iU', $data, $matches))
{
$matches[0] = array_reverse($matches[0]);
$matches[1] = array_reverse($matches[1]);
$matches[2] = array_reverse($matches[2]);
$count = count($matches[1]);
for($i = 0; $i < $count; $i++)
{
$attribs = JUtility::parseAttributes( $matches[2][$i] );
$type = $matches[1][$i];
$name = isset($attribs['name']) ? $attribs['name'] : null;
$replace[$i] = $this->getBuffer($type, $name, $attribs);
}
$data = str_replace($matches[0], $replace, $data);
}
return $data;
}
對了,,就是這部分,對模板中 JDOC標簽進行了解析,,獲得了相應(yīng)的module名稱和參數(shù),,并調(diào)用getBuffer函數(shù)執(zhí)行。
至此 調(diào)用 $renderer->render($name, $attribs, $result);