ajax很简单。自然,它也可以很复杂得不近人情。
我做的网站首页有个模块是从别的网站捞天气。缓存之本地。每天第一次请求时获取。
常常在这里会让整个页面停顿,给人以这个网站很慢的感觉。所以我想到了用ajax异步获取。

mambo 4.5.2装载模块的部分是在/includes目录下的frontend.php里。

我修改了下,新增了几个函数,用来装载ajax模块,并将模块盒子的输出改为模板控制。

这下感觉好多了。


/* 客户端模块内容的外壳,id明确=模块名。由于模块名独立,所以不会产生冲突 */
function ajaxClient($name,$loading,$styleObj=''){
    
$style = "style=\"$styleObj\"";
    
$client = "<div id='$name' $style>$loading</div>\n";
    
$client .= ajaxClientJs($name);
    
return $client;
}

/* 生成客户端请求的脚本其中oXML对象在ajax.js中就已经定义了 */
function ajaxClientJs($name,$clientFunc=''){
global $mosConfig_live_site;
$clientFunc = $clientFunc?$clientFunc:"Fill_".$name;
//$site = "http://corp.cnnavi.com";
$url = $mosConfig_live_site."/modules/".$name.".php";
$js=<<<EOD

<script language="javascript" type="text/javascript">
<!--
url 
= '$url';
oXML
.LoadUrl( url,$clientFunc ,'');
function $clientFunc(htmlstr){
    
var obj = document.getElementById('$name');
    obj
.innerHTML = htmlstr;
}
//-->
</script>

EOD;
return $js;
//send( urlToCall , params , func ,funcParam )
}//end func

/* 异步装载模块数据调用 */
function ajaxModuleCall($modName,$style='',$params="",$loading="loading..",$styleObj='')
{    
    
global $mosConfig_gzip, $mosConfig_absolute_path, $database, $my, $Itemid, $mosConfig_caching;
    
$client = ajaxClient($modName,$loading,$styleObj);
    
$contents = &$client;
    
$module = $mosConfig_absolute_path .'/modules/'. $modName .'.php' ;
    
if (!file_exists ($module)) {
        
$msg = "module  file {$module} not exists, please check";
        
return $msg;
    }
    
//取模块参数
    $q = "select title,showtitle,params from #__modules where module='$modName'  ";
    
$database->setQuery($q);    
    
$database->loadObject($rowMod);//prt($rowMod);
    $moduleParams = $params?$params:$rowMod->params;
    
$params = new mosParameters( $moduleParams );
    
$moduleclass_sfx = $params->get('moduleclass_sfx');
    
$returnString = "";
    
$tplfile = $mosConfig_absolute_path."/templates/modulebox/box".$style.".html";
    
if (!is_file($tplfile)) {
        
$tplfile = $mosConfig_absolute_path."/templates/modulebox/box.html";
    }
    
$boxTemplate = file_get_contents ( $tplfile );
    
/* 是否输出头 */
    
if ($rowMod->showtitle==1
        
$rowModTitle = $rowMod->title;
    
else 
        
$boxTemplate = preg_replace("#.*{$rowModTitle}.*#","",$boxTemplate);
    
    
/* 替换模版 */
    
$htmldata  = preg_replace("#{([^}]*)}#e","\\1",$boxTemplate);
    
return $htmldata ;
// end func



/**
* @param string The modName
* @param int The style.  0=normal, 1=horiz, -1=no wrapper
* 本模块调用返回字符串,所以,在执行模块里不可有任何输出缓冲。
*/
function mosLoadModule2( $modName='', $style=0 , $params='' ) {
    
global $mosConfig_gzip, $mosConfig_absolute_path, $database, $my, $Itemid, $mosConfig_caching;
    
$module = $mosConfig_absolute_path .'/modules/'. $modName .'.php' ;
    
if (!file_exists ($module)) {
        
$msg = "module  file {$module} not exists, please check";
        
return $msg;
    }

    
//取模块参数
    $q = "select title,showtitle,params from #__modules where module='$modName'  ";
    
$database->setQuery($q);    
    
$database->loadObject($rowMod);//prt($rowMod);
    $moduleParams = $params?$params:$rowMod->params;
    
$params = new mosParameters( $moduleParams );
    
$moduleclass_sfx = $params->get('moduleclass_sfx');
    
//执行模块
    ob_start();
    
include$module );
    
$contents = ob_get_contents();
    
ob_end_clean();

    
$tplfile = $mosConfig_absolute_path."/templates/modulebox/box".$style.".html";
    
if (!is_file($tplfile)) {
        
$tplfile = $mosConfig_absolute_path."/templates/modulebox/box.html";
    }
    
$boxTemplate = file_get_contents ( $tplfile );
    
/* 是否输出头 */
    
if ($rowMod->showtitle==1) {
        
$rowModTitle = $rowMod->title;
    }
    
else {//如果不是,则将头部包含的一行html去掉。        
        $boxTemplate = preg_replace("#.*{$rowModTitle}.*#","",$boxTemplate);
    }
    
$htmldata  = preg_replace("#{([^}]*)}#e","\\1",$boxTemplate);
    
return $htmldata ;
}


我将模板放在templates/modulebox目录下。这下盒子的输出怎么变都简单了。新建文件的问题。而且保留原有的类别后缀。ok.


前台调用。

//右边
//function ajaxModuleCall($modName,$style=-1,$params="",$loading="loading..",$styleObj='')

//外汇

$waihui = ajaxModuleCall ( 'mod_getwaihui','',"","loading waihui." ); 

//天气

$styleObj = "height:250px;";
$weather = ajaxModuleCall ( 'mod_weather','',"","loading weather.", $styleObj); 
//echot($weather);

ok。你可以发现我将所有的输出都放在字符串里。这样做是为了模板的替换。

模板在这里得到简单的运用。而且有效。为什么不用smarty?phplib?

因为这样简单。而且我反正是要做html缓存。用不着smarty............

Posted on 2005-12-24 17:41  古代  阅读(427)  评论(0编辑  收藏  举报