对于finecms的模板中不能愉快地写sql语句,好麻烦,对于手册上写的语法,表示脑容量不够没看懂,索性直接改造一下,模板的引擎吧
protected function _listdata($param)
{
if(strpos($param,"|"))
{
$rule = '#\|.+?\|#i';
preg_match($rule,$param,$result);
if(!$result) return array();
$sql=substr($result[0],1,-1);
$dbcache=100;
$db = Controller::model('content');
$data = $db->execute($sql, true, $dbcache);
// var_dump(array( 'result' => $data, 'sql' => $sql, 'total' => isset($total) ? $total : count($data)));
return array( 'result' => $data, 'sql' => $sql, 'total' => isset($total) ? $total : count($data));
}
//以下是原来的代码
$_param = explode(' ', $param);
$param = array();
这样的话,就可以愉快地写sql语句了
下面写了个demo,大家可以试下
{list sql=|select * from fn_position_data RIGHT JOIN fn_content_1 ON `fn_content_1`.`id`=`fn_position_data`.`contentid` where posid=6 order by fn_position_data.listorder asc| }
<a href="{$t['url']}" title="{$t['title']}"><span>{date('y-m-d',$t['inputtime'])}</span>
{/list}
但是有一个问题,如果看你的模板就可以直接看到sql语句了,另外了没有对sql语句进行过滤,所以要进一步处理一下,因为这个是临时应付一下,所以暂时先这样
对于模板容易被别人看到的问题,可行的解决办法是这样的,把模板文件的扩展名改为.php ,并在解析模板的时候,去掉php标记就可以了
所以做了以下几点改动
第一,把模板文件的扩展名改为php,并在文件的头部加入了这样一句话<?php exit();?>
第二,修改模板的解析文件,主要的改动
/**
* 获取视图文件的路径
*/
protected function get_view_file($file_name) {
//return $this->view_dir . $file_name . ((substr($file_name, strrpos($file_name, '.')) == '.html') ? '' : '.html');
return $this->view_dir . $file_name . ((substr($file_name, strrpos($file_name, '.')) == '.php') ? '' : '.php');
}
/**
* 加载视图文件
*/
protected function load_view_file($view_file) {
if (!is_file($view_file)) {
App::display_error(lang('app-8') . ': ' . $view_file);
}
$view_content = file_get_contents($view_file);
$view_content= substr($view_content, 15);
return $this->handle_view_file($view_content);
}
这样就完成了模板的改造问题,这样,别有用心的人浏览模板文件时就会出现空白页面,起到了保护模板的作用
在做这个改动的时候,查看源文件,发现是在dayrui/core/common.php中引入的文件解析类,
如果要兼容其他的模板可以做一个新的解析类来兼容其它模板文件(个人认为原view类写的太复杂,脑容量小的根本就看不懂啊)