打开织梦include/arc.listview.class.php,找到代码:
if(!is_object($ctag)) { $ctag = $this->dtp->GetTag("list"); } 这一段,在其后添加如下代码:
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
总共就添加三段代码,每一段代码基本都参考它紧接着的上面那段原始代码,而无需改变它原来任何一个地方的代码,应该算是比较完美了,接下来在模板文件中的使用方法就跟一开始思路中所提到的那样,分页标签依旧沿用原来的,调用范例:
{dede:listsql sql='select ID,post_title from wp_posts' pagesize='10'}
<li><a href="[field:ID/].html">[field:post_title/]</a></li>
{/dede:listsql}
<!--分页-->
{dede:pagelist listsize='2' listitem='index pre pageno next end '/}
注:以上解决方案适用于dedecms5.6-5.7版本。