您的位置:首页 > 编程语言 > PHP开发

【phpcms-v9】对{pc}标签进行二次开发,让其可以获取limit指定的文章条数

2012-09-22 11:47 513 查看
1.{pc}标签中limit参数只有在有分页的情况下才会起作用,在无分页的情况下是不起作用的,那么如果我们想获取指定数据段的记录,该如何操作呢?

以下写法都不能满足需求:

   {pc:content              action="lists"            catid="$catid"              order="id desc"       limit="0,7" } {/pc} //默认获取的第0篇到第7篇文章

    {pc:content              action="lists"            catid="$catid"              order="id desc"       limit="7,7" } {/pc} //默认获取的还是第0篇到第7篇文章,而不是第7篇到14篇文章   

    {pc:content              action="lists"            catid="$catid"              order="id desc"       num="7" } {/pc} //默认获取的还是第0篇到第7篇文章   

    {pc:content              action="lists"            catid="$catid"              order="id desc"       limit="7,7" num=“7” } {/pc} //默认获取的还是第0篇到第7篇文章,而不是第7篇到14篇文章

 {pc:content              action="lists"            catid="$catid"              order="id desc"       num="7"   start=“7” } {/pc} //这样应该能够获取到第7篇到第14篇文章,从第7篇文章开始,获取后面的7篇文章

2.如果想实现如图功能,该如何操作呢?



第①步:在pc标签中添加limitt参数,注意是limitt,而不是limit,或者任意名称的参数

<!-- 第0-7篇文章 -->
{php $i=0;}
{pc:content action="lists"  catid="$catid"  limitt="0,7" order="id DESC"}
<ul class="erji_center_content">
{loop $data $r}
<li><a href="{$r[url]}">{$r[title]}</a></li>
{/loop}
</ul>
<span class="border-cx"></span>
{/pc}

<!-- 第7-14篇文章 -->
{php $i=0;}
{pc:content action="lists"  catid="$catid"  limitt="7,7" order="id DESC"}
<ul class="erji_center_content">
{loop $data $r}
<li><a href="{$r[url]}">{$r[title]}</a></li>
{/loop}
</ul>
<span class="border-cx"></span>
{/pc}

<!-- 第14-21篇文章 -->
{php $i=0;}
{pc:content action="lists"  catid="$catid"  limitt="14,7" order="id DESC"}
<ul class="erji_center_content">
{loop $data $r}
<li><a href="{$r[url]}">{$r[title]}</a></li>
{/loop}
</ul>
<span class="border-cx"></span>
{/pc}


第②步:修改content_tag.class.php文件中的lists方法

/**
* 列表页标签:主要返回的是主表中数据与附表中数据
* @param $data
*/
public function lists($data) {
$catid = intval($data['catid']);									//pc标签中catid属性

//加上这行代码即可
$data['limit'] = (isset($data['limitt'])&& (!empty($data['limitt'])))?$data['limitt']:$data['limit'];

//pc标签中limit属性,此行代码由weiyanhui添加
if(!$this->set_modelid($catid)) return false;						//会根据栏目id->对应的模型id->对应的模型表
if(isset($data['where'])) {											//如果pc标签中设置了where属性,一般情况下不存在
$sql = $data['where'];
} else {															//如果pc标签中没有设置where属性
$thumb = intval($data['thumb']) ? " AND thumb != ''" : '';		//如果有thumb属性
if($this->category[$catid]['child']) {							//当前栏目下是否存在子栏目
$catids_str = $this->category[$catid]['arrchildid'];		//所有子栏目id,包括当前栏目自身id
$pos = strpos($catids_str,',')+1;
$catids_str = substr($catids_str, $pos);					//所有子栏目id,不包括当前栏目自身id
$sql = "status=99 AND catid IN ($catids_str)".$thumb;		//拼接成一个sql语句
} else {
$sql = "status=99 AND catid='$catid'".$thumb;				//如果当前栏目下不存在子栏目
}
}
$order = $data['order'];											//pc标签中order属性
//$sql作为一个条件出现,调用的是model.calss.php文件中的select方法,返回结果集数组,并按照键名'id'排序
$return = $this->db->select($sql, '*', $data['limit'], $order, '', 'id');//从数据库中获取主表数据,使用的也是sql语句查询
//注意:修改了$data['limit']为$data['limitt']了,修改于2012年09月21日 19:15
//如果需要在前台显示类别名称,可添加如下代码

$TYPES = getcache('type_content','commons');//获取类别缓存文件,此文件缓存了所有与类别信息相关的信息
foreach ($return as $key=>$v) {
$return[$key][typename]=$TYPES[$v['typeid']][name];//给$return中的每篇文章追加一个类别字段
}
//echo "<pre>";
//print_r($return);

//调用副表的数据
if (isset($data['moreinfo']) && intval($data['moreinfo']) == 1) {	//如果pc标签中设置了moreinfo属性:是否调用附表数据
$ids = array();
//$return为返回的主表数据
foreach ($return as $v) {										//循环主表中的记录信息:$v-主表中的每条记录
if (isset($v['id']) && !empty($v['id'])) {
$ids[] = $v['id'];										//ids[]是主表中排序完成的文章id数组
} else {
continue;
}
}
if (!empty($ids)) {
$this->db->table_name = $this->db->table_name.'_data';		//副表名
$ids = implode('\',\'', $ids);								//以逗号拼接成一个字符串
$r = $this->db->select("`id` IN ('$ids')", '*', '', '', '', 'id');//查询与主表中数据有关的副表中的数据
if (!empty($r)) {
foreach ($r as $k=>$v) {								//副表中的数据
//$return:返回的主表中的数据,主表中的id字段值与附表中的id字段值是对应的,也就是说一篇文章在主表中存储的id跟在附表中存储的id的值是相等的
if (isset($return[$k])) $return[$k] = array_merge($v, $return[$k]);//主表中数据与副表中数据合并
}
}
}
}
return $return;
}


发现在pc标签中,并不是所有的条件参数都可以是变量的,如下所示:

{pc content="lists" catid="$catid" limit="$start,9"}{/pc}

catid:可以是变量

limit:中的第一个条件是不可以为变量的 ,再如:where="" 也是不允许出现变量的

当pc标签的参数为单个条件时可以为变量,多个条件时不可以为变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  action class sql types php