织梦用{dede:sql}标签实现分页的方法
时间:2019-11-14 11:56:31 来源:未知 作者:站长技术网 点击:次
打开织梦include/arc.listview.class.php,找到代码: if (! is_object ( $ctag ))
{
$ctag = $this ->dtp->GetTag( "listsql" );
if ( is_object ( $ctag ))
{
$cquery = $ctag ->GetAtt( "sql" );
$cquery = preg_replace( "/SELECT(.*?)FROM/is" , " SELECT count(*) as dd FROM " , $cquery );
$cquery = preg_replace( "/ORDER(.*?)SC/is" , "" , $cquery );
$row = $this ->dsql->GetOne( $cquery );
if ( is_array ( $row ))
{
$this ->TotalResult = $row [ 'dd' ];
}
else
{
$this ->TotalResult = 0;
}
}
}
//end
然后找到代码: if ( $ctag ->GetName()== "list" )
{
$limitstart = ( $this ->PageNo-1) * $this ->PageSize;
$row = $this ->PageSize;
if (trim( $ctag ->GetInnerText())== "" )
{
$InnerText = GetSysTemplets( "list_fulllist.htm" );
}
else
{
$InnerText = trim( $ctag ->GetInnerText());
}
$this ->dtp->Assign( $tagid ,
$this ->GetArcList(
$limitstart ,
$row ,
$ctag ->GetAtt( "col" ),
$ctag ->GetAtt( "titlelen" ),
$ctag ->GetAtt( "infolen" ),
$ctag ->GetAtt( "imgwidth" ),
$ctag ->GetAtt( "imgheight" ),
$ctag ->GetAtt( "listtype" ),
$ctag ->GetAtt( "orderby" ),
$InnerText ,
$ctag ->GetAtt( "tablewidth" ),
$ismake ,
$ctag ->GetAtt( "orderway" )
)
);
}
这一段,在其后添加如下代码: else if ( $ctag ->GetName()== "listsql" )
{
$limitstart = ( $this ->PageNo-1) * $this ->PageSize;
$row = $this ->PageSize;
if (trim( $ctag ->GetInnerText())== "" )
{
$InnerText = GetSysTemplets( "list_fulllist.htm" );
}
else
{
$InnerText = trim( $ctag ->GetInnerText());
}
$this ->dtp->Assign( $tagid ,
$this ->GetSqlList(
$limitstart ,
$row ,
$ctag ->GetAtt( "sql" ),
$InnerText
)
);
}
//end
最后找到function GetArcList这个函数,在其后添加一个可以通过传入sql参数获取指定数据源的方法,代码如下: /**
* 通过listsql标签中sql属性传入的参数来获得一个单列的文档列表
* */
function GetSqlList( $limitstart = 0, $row = 10, $sql = '' , $innertext ){
global $cfg_list_son ;
$innertext = trim( $innertext );
if ( $innertext == '' ) {
$innertext = GetSysTemplets( 'list_fulllist.htm' );
}
//处理SQL语句
$limitStr = " LIMIT {$limitstart},{$row}" ;
$this ->dsql->SetQuery( $sql . $limitStr );
$this ->dsql->Execute( 'al' );
$t2 = ExecTime();
//echo $t2-$t1;
$sqllist = '' ;
$this ->dtp2->LoadSource( $innertext );
$GLOBALS [ 'autoindex' ] = 0;
//获取字段
while ( $row = $this ->dsql->GetArray( "al" )) {
$GLOBALS [ 'autoindex' ]++;
if ( is_array ( $this ->dtp2->CTags))
{
foreach ( $this ->dtp2->CTags as $k => $ctag )
{
if ( $ctag ->GetName()== 'array' )
{
//传递整个数组,在runphp模式中有特殊作用
$this ->dtp2->Assign( $k , $row );
}
else
{
if (isset( $row [ $ctag ->GetName()]))
{
$this ->dtp2->Assign( $k , $row [ $ctag ->GetName()]);
}
else
{
$this ->dtp2->Assign( $k , '' );
}
}
}
}
$sqllist .= $this ->dtp2->GetResult();
} //while
$t3 = ExecTime();
//echo ($t3-$t2);
$this ->dsql->FreeResult( 'al' );
return $sqllist ;
}
//end
总共就添加三段代码,每一段代码基本都参考它紧接着的上面那段原始代码,而无需改变它原来任何一个地方的代码,应该算是比较完美了,接下来在模板文件中的使用方法就跟一开始思路中所提到的那样,分页标签依旧沿用原来的,调用范例: |