昨天有客户找来写织梦DedeCMS的数据调用,需求是:在文章内页调用栏目最新的文章作为相关文章,为了避免重复,怎么样才能做到排除自身文章?咋一看这个需求,会觉得很简单,但实际调试时发现并非易事,CMSYOU不禁感叹Dede中使用if判断怎么这么难呢,相对于Phpcms来说,真是直接打脸。
我们先来聊聊DedeCMS模板中如何写if判断:
Dede在模板中写php语句是用runphp='yes'开启,比如DedeCMS判断当前栏目下是否有子栏目:
{dede:field name=typeid runphp="yes"}
global $dsql;
$sql = "SELECT id From `dede_arctype` WHERE reid='@me' And ishidden<>1 order by sortrank asc limit 0, 10 ";
$row = $dsql->GetOne($sql);
if(@me=is_array($row))
@me="有子栏目";
else @me = "没子栏目";
{/dede:field}
如果在DedeCMS内容页模板,可以用类似写法:
{dede:field.original runphp='yes'}
if(@me<>'')@me="本文原创";
else
@me="原创属性未知";
{/dede:field.original}
从上面两个示范可以看出,DedeCMS模板中写php存在比较大的局限,如果要写多重调用则比较困难。相对来说Phpcms里边写php则可以直接用{php}标记来写,也可以用{if}{else}{/if}直接来if判断,比如Phpcms内容页模板里边调用栏目最新的文章列表排除自身:
{pc:content action="lists" catid="$catid" num="10" order="listorder DESC"}
{loop $data $r}
{if $r[id]!=$id}
<li><a href="{$r[url]}">{$r[title]}</a></li>
{/if}
{/loop}
{/pc}
可以看出只需要{if $r[id]!=$id}直接判断不等于自身id,就轻松实现。
而Dede在文章内页调用栏目最新的文章怎么排除自身文章?则相对困难,最终费了一番功夫,得出调用如下:
{dede:php}
$typeid = $refObj->Fields['typeid'];
$id = $refObj->Fields['id'];
{/dede:php}
{dede:sql sql='Select * from #@__archives where typeid = ~typeid~ AND id!=~id~ LIMIT 0,10'}
<li class="duo-ct"><a href="[field:id function=GetOneArchiveURL(@me)/]">[field:title/]</a></li>
{/dede:sql}
其中GetOneArchiveURL函数是根据\include\helpers\archive.helper.php文件的GetOneArchive函数衍生的,修改这个文件,新增GetOneArchiveURL函数。相当于没能直接在模板中调用出来,借助了修改PHP文件增加函数方法来实现。
如果你对DedeCMS也比较熟悉,对于这个调用方法,在文章内页调用栏目最新文章列表排除自身文章有更好的方法吗?
点击加载更多