最近项目用了ajax 弹出 网页层,先是把弹出 网页层的模版放在了主要页面的模版文件夹下,不过混在一起不太好。就想把模版放到新的文件夹。
看了下引用smarty的inc文件,$tmpl = new Smarty;$tmpl->left_delimiter='<{';$tmpl->config_dir=。。。。。
不想再写一个smarty的inc文件,因为有一个主要的inc文件引用别的inc,你再建另一个主要的inc文件就不好了。想用工厂模式,但php4不支持static方法,也无如此必要,就直接写了个函数。
function FTmpFactory($type='')
{
$smarty = new Smarty;
if($type == '')
{
//default
}
if($type=='pop_up')
....
}
$tmpl = FTmpFactory();
弹出 网页层的php文件只用写句 $pop_up = FTmpFactory('pop_up');
想看详细的,大约这样写。
function FTmpFactory($type='')
{
$smarty = new Smarty;
{// 共用的默认值
$smarty->compile_check = true;
$smarty->debugging = false;
$smarty->caching = false;
//$smarty->left_delimiter = '<{';
//$smarty->right_delimiter = '}>';
// 以下常量除了php魔术常量,都是自定义的常量,如果不定义会出错。
$smarty->template_dir = TEMPLATE_PATH.'/';
$smarty->compile_dir = TEMPLATE_PATH.'_c/';
}
switch ($type)
{//实际上这些中括号并不需要
case '':
{ //根据php的目录路径来确定模版的路径 前提 controllers/$目录 和 view/$目录 的$目录值要一样。
// __DIR__等价于 dirname(__FILE__)。需PHP 5.3。另外如果有改路由规则,不像$_SERVER['PHP_SELF']等,__DIR__还是能得到实际路径
$smarty->config_dir = HTDOCS_PATH.'/'.basename(__DIR__).'/';
break;
}
case 'default':
{
$smarty->config_dir = HTDOCS_PATH.'/';
break;
}
case 'pop_up':
{
$smarty->left_delimiter = '<{';
$smarty->right_delimiter = '}>';
$smarty->config_dir = HTDOCS_PATH.'/pop_up/';
break;
}
case 'mail':
{
$smarty->config_dir = MAIL_TEMP_PATH;
break;
}
default:
{
// $smarty->config_dir = HTDOCS_PATH."/{$type}/"; //已经够用暂不需要
break;
}
}
return $smarty;
}
$tmpl = FTmpFactory();
首先,先在主引用文件定义$smarty;
然后$tmpl = FTmpFactory( $smarty);
function FTmpFactory($tmpl, $type='', $clone_ = true)
{
$smarty = Clone($tmpl); // 克隆需要php5(php4默认是克隆),不过这是浅克隆,不同克隆对象中的对象的指针还是一样的。
//...........
return $smarty;
}
再说一下主要的inc文件引用别的inc的好处,我们项目有一个被它引用的数据库类.inc.php,是pg的。如果要换在mysql数据库,只用改一下被引用的数据库类.inc的名字就可以了。当然,程序中的sql语句还是要小改的。达到了工厂模式一样的效果,也算一种书上没有的(至少我看过的没有)设计模式吧。