排除法解决[织梦dedecms生成栏目没反应]问题 揪出罪魁祸首GetTopTypename()!

好久没用织梦dedecms了,最近有帮客户制作一网站,客户原先程序就是dedecms,想调整网站结构以适应seo,且同时更改网站风格,需求既如此,那就在现有的dedecms网站基础上进行改版就好。

是否长久不用织梦的原因,在制作过程中,总会突然冒出一两个小问题,好在简单,一搜索,网上都有答案,不料,在更新栏目页时,却出现了一个较大的问题,就是生成栏目页时没有反应,像一条死狗一样,你怎么戳它,它都不会吭声。

dedecms生成栏目页时没有反应

这个问题很严重,如果不能解决的话,前边的工作就会全功尽弃!

是客户网站dedecms程序版本低的原因导致?

dedecms程序版本低

但几年前哥用的版本也差不多哎!

按网上的教程,见百度经验:dedecms织梦更新生成栏目没反应问题总汇,操作了一遍,发现还是没有解决。看来并不是版本低的原因。

重新把备份的客户网站dede后台目录再传至ftp进行全部覆盖,结果还是无反应。

那应该不是程序本身的问题了,试着去模板中找找原因吧。

到底是程序问题还是模板的问题,也没有那么清楚,先做一个测试来判定。

在织梦dedecms后台把某栏目(使用频道模型)对应的频道模板换成default默认的路径(注:新制作的网站模板命名不叫default,默认的还在),发现可以生成。

频道模板设置

(注:上图,请将{style}换成default,进行测试后再换回来)

发现栏目能生成,只是因为使用了default默认模板,打开是一片杂乱。此外,哪怕是没有对应的模板文件,生成栏目时也会出现错误告知。

织梦栏目生成错误信息

那说明程序本身没有问题,这个锅不要让程序来背,判断是由于模板未知原因导致

--------------------------

知道导致问题的关键所在后,就易寻找到答案,无非在模板中的代码。在百度知道这篇:dede后台更新栏目 点击开始生成html没反应为什么?说到把一个带有“GetTopTypename(@me)”的代码删除就好!那就去find GetTopTypename,发现,还真有。

于是将其注释掉,上传模板再去更新栏目,还是纹丝不动,没有一点反应。dedecms注释掉的代码

来回几次折腾,发现一个问题:

就是dedecms的标签代码虽然把它注释了,可是它还会继续工作(你可以查看生成的网页文件源代码来观察),不像html那样,注释就不解析了。

于是直接删除带有GetTopTypename的标签代码,换成:

{dede:field name='typename' /}

重新更新栏目,发现好了,可以生成,恢复正常。

织梦dedecms更新栏目正常

---------------------------------

但又发现一个问题。如图:

织梦栏目逻辑不对

严格一点的话,这个显示有点儿不太符合逻辑啊!

后台的栏目结构是这样的。

织梦dedecms栏目结构

看来{dede:field name='typename' /}只能显示它自己的名字,不能显示上属层级的名称。

这就要重新审核GetTopTypename()的作用了。

GetTopTypename()作用就是获得子栏目的上层栏目的名称。给它一个栏目id,就能逆流而上,回溯去找这个id的上一级领导或上级领导的领导,直到找到一个为止如下:

1.复制如下代码至include/common.func.php的最下方。

//获取顶级栏目名
function GetTopTypename($id)
{
global $dsql;
$row = $dsql->GetOne("SELECT typename,topid FROM `#@__arctype` WHERE id= $id");
if ($row['topid'] == '0')
{
return $row['typename'];
}
else
{
$row1 = $dsql->GetOne("SELECT typename FROM `#@__arctype` WHERE id= $row[topid]");
return $row1['typename'];
}
}

2.上传至网站空间。

3.测试是否功能正常,且不影响其他功能使用。

要如何才能让GetTopTypename()生效而又不会造成栏目更新时无反应的问题,方法就是上述三步。

经过这一操作,客户网站的栏目层次逻辑结构显示得清楚明白。

网站的栏目层次逻辑结构

GetTopTypename()并不是dedecms自带的方法,如果没有预先定义这个GetTopTypename()功能函数,想发挥作用是不成的,反而会造成织梦dedecms生成栏目没反应的莫名问题——因为生成html页面的后台程序不能识别模板中的GetTopTypename(),不过,在你有需求的时候,GetTopTypename()能弥补dedecms自带功能的不足,发挥其"寻祖归宗"的作用。

是为记,以备用。

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注