织梦dedecms如何做到真正的随机调取文章

本文献给与我一样的建站新手 ,算是本人的一点经验之谈。作为一名新手站长,建站的好多知识都一知半解,就算看过某些的教程,当时自信满满,但在实际操作中,很多新问题又会接踵而至,真心让人发狂,如果没有懂这些技术的老师或朋友的帮助,我们只好选择在网上搜罗相应的答案,但是得到的很多结果多为相互之间的照搬照抄,更严重的是这个结果本身是错误的,而这样错误的答案又得以广泛的传播,无疑给我们这些新手站长带来了不少的曲折,犹如雪上加霜。以下就是本人在这个学习与成长的过程中遇到的问题之一(织梦dedecms如何做到真正的随机调取文章)

如果你在度娘上搜索这个问题时,会看到很多网站提供的答案是调用下面的这段代码:

“ {dede:arclist row=’1000′ pagesize=’10’ titlelen=’35’ orderby=’rand’}

[field:title/]

{/dede:arclist}

row=’1000’代表取出1000个文章, orderby=’rand’代表对这些文章随机排序, pagesize=’10’代表只显示随机排序后的前十个文章。”

用上面的这段代码,我在dede5.7中测试了一下,结果并非如我所愿。这段代码显示的结果,容我举例说明。

比方说,我的一个栏目A下有100篇文章,它们每篇文章的Id是从1到100的编号,而我想要实现效果是,每篇内容页都随机抓取10篇其他文章的标题,作为在每篇内容页的“相关推荐”版块中的内容,如第一篇文章的“相关推荐”抓取了ID2到ID10的标题,第二篇抓取了ID6到ID16标题,第三篇抓取了ID50到ID60标题,以此类推,栏目A下每一篇文章的标题都会出现在其他内容页面的”相关推荐“版块中。

而上面那段代码得到的结果是:随机抓取10篇文章标题,如:ID1到ID10的标题,然后在A栏目下100篇文章的每一篇文章的相关推荐中,只出现ID1到ID10的标题,仅有的改变只是上下排列次序的变化。

那问题出在哪里?如何做到真正的随机文章调取呢?

答案是去掉”row“,正确的调用代码如下:

{dede:arclist pagesize=’10’ titlelen=’35’ orderby=’rand’}

[field:title/](注释:这里是调用文章的标题调用代码)

{/dede:arclist}

注释

pagesize=’10’ 这个代表生成10个标题

titlelen=’35’ 表示限制标题长度为35个字节(2个字节等于一个汉字)

orderby=’rand’ ”rand“表示抓取方式为 随机抓取

如果想抓取指定栏目下的内容要加入typeid=’这里填写栏目的ID’

{dede:arclist pagesize=’10’ titlelen=’35’ typeid=’5′ orderby=’rand’}

最后,感谢您的阅读,希望与您一起学习进步。

margin:auto实现绝对定位元素的水平垂直居中

主要分为2步来分析…

 

一、绝对定位元素的居中实现

如果要问如何CSS实现绝对定位元素的居中效果,很多人心里已经有答案了。

兼容性不错的主流用法是:

.element {
    width: 600px; height: 400px;
    position: absolute; left: 50%; top: 50%;
    margin-top: -200px;    /* 高度的一半 */
    margin-left: -300px;    /* 宽度的一半 */
}

但,这种方法有一个很明显的不足,就是需要提前知道元素的尺寸。否则margin负值的调整无法精确。此时,往往要借助JS获得。

CSS3的兴起,使得有了更好的解决方法,就是使用transform代替margin. transformtranslate偏移的百分比值是相对于自身大小的,于是,我们可以:

.element {
    width: 600px; height: 400px;
    position: absolute; left: 50%; top: 50%;
    transform: translate(-50%, -50%);    /* 50%为自身尺寸的一半 */
}

于是乎,无论绝对定位元素的尺寸是多少,其都是水平垂直居中显示的。

然,问题很明显,兼容性不好。IE10+以及其他现代浏览器才支持。中国盛行的IE8浏览器被忽略是有些不适宜的(手机web开发可忽略)。

实际上,绝对定位元素的居中实现还有另外一种方法,可以说是权衡了上面的尺寸自适应以及兼容性的一个方案,其实现的核心是margin:auto.

 

二、margin:auto实现绝对定位元素的居中

首先,我们来看下CSS代码:

.element {
    width: 600px; height: 400px;
    position: absolute; left: 0; top: 0; right: 0; bottom: 0;
    margin: auto;    /* 有了这个就自动居中了 */
}

代码两个关键点:

  1. 上下左右均0位置定位;
  2. margin: auto

于是,就居中了。上面代码的width: 600px height: 400px仅是示意,你修改为其他尺寸,或者不设置尺寸(需要是图片这种自身包含尺寸的元素),都是居中显示的。很有意思的~~

DEDE自定义表单中加入用户提交时间

一、在自定义表单中添加字段
添加时间字段 timesj

二、在调用表单的页面中加入

<input name=”timesj” value=”” type=”hidden” id=”timesj” style=”width:250px” class=”intxt”>
<script type=”text/javascript”>
window.onload = function(){
var nowDate = new Date();
var str = nowDate.getFullYear()+”-“+(nowDate.getMonth() + 1)+”-“+nowDate.getDate()+” “+nowDate.getHours()+”:”+nowDate.getMinutes()+”:”+nowDate.getSeconds();
document.getElementById(“timesj”).value=str;
}
</script>
或者

<input type=”hidden” name=”timesj” id=”timesj” value=”{dede:php} echo $showtime=date(‘Y-m-d H:i:s’);{/dede:php}”>

此种方法好像生成的时间是静态的。

或者

<input type=’hidden’ name=’timesj’ id=’timesj’/>
<script  language=”javascript” type=”text/javascript”>
var wdtime= new Date();
document.getElementById(“timesj”).value=wdtime.toLocaleString();
</script>
以上表单中使用了type=hidden,所以是隐藏模式。
三、在系统模板中添加
plus/diy_list.htm 42的else前面或后面加入

if($fielddata[1]==’datetime’)
{
    $fields[$field] = GetDateTimeMk($fields[$field]);
}
经过以上三步的处理,用户在前台填表后,管理后台就能看到用户添加的时间了。

DEDE自定义表单地区联动类型不可用的解决办法

原因是官方模板文件中注释掉了相关选项,修改方式如下:

需要修改两个文件,
第一个:dede/templets/diy_field_edit.htm 124行 官方把 “<option value=”stepselect”>联动类型</option–>”这句给注释掉了,取消注释。
第二个:dede/templets/diy_field_add.htm 145 行 官方把“<div class=’nw’><input type=’radio’ class=’np’ name=’dtype’ id=’dtype16′ value=”stepselect”>联动类型</div> ”这句给注释了,取消注释。

改好后,保存就ok了!

当然,你在添加自定义表单中的字段时,数据类型一定要选择“联动类型”!

 

关于在使用地区联动的时候,表单数据未能正常显示地区名称时,或者只出现数字的,

请看《dede自定义表单联动类型只显示枚举值数字的问题

DEDE自定义表单联动类型只显示枚举值(数字)的问题-唯一正确有效的办法

网络上有类似的文章,但是都是不全,错误的方法。所谓一子错,满盘皆输.

以下是本站长整理出来亲身验证无误的方法.

dede自定义表单中联动类型不可用的解决方法   (如果没有显示联动选项的话,请您先阅读此文章)

直接上修改办法:

1.在”后台目录”\templets\diy_list.htm找到(大约在41行):

$fields[$field] = “<a href='{$fields[$field]}’ target=’_blank’><img src=’p_w_picpath/channeladd.gif’ border=’0′ /> 其它附件</a>”;
}
在下面加入:

//联动类型显示修正开始
else if($fielddata[1]==’stepselect’)
{
$db->Execute(‘me’,”SELECT * FROM `dede_stepselect` WHERE itemname='{$fielddata[0]}'”);
while($arr = $db->GetArray(me))
{
$egroup = $arr[‘egroup’];
}
$fields[$field] = Getenums(“{$fields[$field]}”,$egroup);
}
//联动类型显示修正结束
2.找到:

{/dede:datalist}

在下面加入:

<?php
function Getenums($evalue=0,$egroup)
{
if( !isset($GLOBALS[’em_’.$egroup.’s’]) )
{
$cachefile = DEDEDATA.’/enums/’.$egroup.’.php’;
if(!file_exists($cachefile))
{
require_once(DEDEINC.’/enums.func.php’);
WriteEnumsCache();
}
if(!file_exists($cachefile))
{
return ”;
}
else
{
require_once($cachefile);
}
}
if($evalue>=500)
{
if($evalue % 500 == 0)
{
return (isset($GLOBALS[’em_’.$egroup.’s’][$evalue]) ? $GLOBALS[’em_’.$egroup.’s’][$evalue] : ”);
}
else if (preg_match(“#([0-9]{1,})\.([0-9]{1,})#”, $evalue, $matchs))
{
$esonvalue = $matchs[1];
$etopvalue = $esonvalue – ($esonvalue % 500);
$esecvalue = $evalue;
$GLOBALS[’em_’.$egroup.’s’][$etopvalue] = empty($GLOBALS[’em_’.$egroup.’s’][$etopvalue])? ”
: $GLOBALS[’em_’.$egroup.’s’][$etopvalue];
$GLOBALS[’em_’.$egroup.’s’][$esonvalue] = empty($GLOBALS[’em_’.$egroup.’s’][$esonvalue])? ”
: $GLOBALS[’em_’.$egroup.’s’][$esonvalue];
$GLOBALS[’em_’.$egroup.’s’][$esecvalue] = empty($GLOBALS[’em_’.$egroup.’s’][$esecvalue])? ”
: $GLOBALS[’em_’.$egroup.’s’][$esecvalue];
return $GLOBALS[’em_’.$egroup.’s’][$etopvalue].’ – ‘.$GLOBALS[’em_’.$egroup.’s’][$esonvalue].’ – ‘.$GLOBALS[’em_’.$egroup.’s’][$esecvalue];
}
else
{
$elimit = $evalue % 500;
$erevalue = $evalue – $elimit;
$GLOBALS[’em_’.$egroup.’s’][$erevalue] = empty($GLOBALS[’em_’.$egroup.’s’][$erevalue])? ”
: $GLOBALS[’em_’.$egroup.’s’][$erevalue];
$GLOBALS[’em_’.$egroup.’s’][$evalue] = empty($GLOBALS[’em_’.$egroup.’s’][$evalue])? ”
: $GLOBALS[’em_’.$egroup.’s’][$evalue];
return $GLOBALS[’em_’.$egroup.’s’][$erevalue].’ – ‘.$GLOBALS[’em_’.$egroup.’s’][$evalue];
}
}
}
?>
修改完毕。

需要注意的是:添加新字段时候,表单提示文字必须和联动的组类别名一致,比如我要添加一个表单提示文字是“课程”,那么新增类别组的时候 类别名也要填写“课程”

 

 

单页面自动更新的方法-Maxwo.com

单页面自动更新的方法

织梦dedecms具有很好的生成HTML功能,在后台主页面中也添加了一键更新功能,不过后台单页面文档的更新,必须在单页文档管理栏目下才能完成,点击一键更新无法更新
下面的教程教您怎么让织梦自定义文档在更新网站时能够自动完成一键更新

站点后台目录文件,默认/dede/ 目录下
找到 makehtml_all.php 文件,打开

大约在144行找到下面的源文件:

else if($step==10)
{
$adminID = $cuserLogin->getUserID();
$mkcachefile = DEDEDATA.”/mkall_cache_{$adminID}.php”;
@unlink($mkcachefile);
OptimizeData($dsql);
ShowMsg(“完成所有文件的更新!”,”javascript:;”);
exit();
}//make step

改为:

else if($step==10)
{

include_once(DEDEINC.”/arc.sgpage.class.php”);
$dsql->Execute(“ex”,”SELECT aid FROM `dede_sgpage` “);
$i = 0;
while($row = $dsql->GetArray(“ex”))
{
$sg = new sgpage($row[‘aid’]);
$sg->SaveToHtml();
$i++;
}

$adminID = $cuserLogin->getUserID();
$mkcachefile = DEDEDATA.”/mkall_cache_{$adminID}.php”;
@unlink($mkcachefile);
OptimizeData($dsql);
ShowMsg(“完成所有文件的更新!”,”javascript:;”);
exit();
}//make step

通过更改以上代码,既可以使得网站的一键更新成为真正意义上的一键更新

 

DEDE更新列表页时错误提示Fatal error: Call to a member function GetInnerText() on a non-object in错误修改方法

DedeCms更新列表页时提示Fatal error: Call to a member function GetInnerText() on a non-object in错误修改方法

 

最近在做一个婚纱摄影网站,用到了自定义模型,遇到了些问题,在更新列表页时提示:Fatal error: Call to a member function GetInnerText() on a non-object in \include\taglib\channel\img.lib.php on line 42

这个错误提示会在更新自定义模型栏目列表的时候出现,修复此问题方法很简单。

编辑打开 \include\taglib\channel\img.lib.php

继续阅读

DEDE为CHANNEL 标签开启 description”栏目描述”属性

channel 这个标签没有description属性你需要自己把这个属性开启。到你的程序目录 include\taglib 找到 channel.lib.php 修改一下文件(78行~94行),如果你想查找所有top最顶层的栏目描述的话修改,以下代码top/son/self都开启了栏目描述。(红色代码)

if($type=='top')

    {
        $sql = "SELECT id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
          From `#@__arctype` WHERE reid=0 And ishidden<>1 order by sortrank asc limit 0, $line ";
    }
    else if($type=='son')
    {
        if($typeid==0) return '';
        $sql = "SELECT id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
          From `#@__arctype` WHERE reid='$typeid' And ishidden<>1 order by sortrank asc limit 0, $line ";
    }
    else if($type=='self')
    {
        if($reid==0) return '';
        $sql = "SELECT id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description
            FROM `#@__arctype` WHERE reid='$reid' And ishidden<>1 order by sortrank asc limit 0, $line ";
    }

dedecms 双语搜索结果实现方法MAXWO.COM

一般来说,我们使用DEDECMS制作中英文站时,需要在中文站上只搜索出中文站的内容,而在英文站只会搜索出英文站中的内容,此时就需要给英文站搜索栏目单独做个模板出来,可以按以下方法来实现.

第一步:复制plus目录下的serach.php文件 把复制后的更名为 searche.php做为新的搜索文件.

继续阅读

DEDE中英文站pagelist分页语种分类

作为曾经的织梦新手,相信碰到以下的几个问题是非常常见的,第一个就是织梦的留言板功能外观上不大适合企业网站,第二个就是做英文版的时候,分页同样实现英文的比较困难,曾近在论坛、百度等地方搜索了很久均没能找到满意的答案,不过今天找到下面这篇内容,并进行测试,发现可以适合织梦目前最新的5.7版,并且已经成功的实现,所以与大家分享下:

温馨提示:下面的第几行,第几行可以忽略,用DW的搜索功能进行索引,可以方便找到,目标代码。而下面有些代码搜索不到,只是因为一些“空格”的问题,修改的时候注意下就能找到。

1、打开include/arc.listview.class.php(本文以DedeCMS5.7为例)
找到(约29行)

var $remoteDir;

在其下面加上一个新行

var $pagelang;

找到(约528行)

$list_len = trim($ctag->GetAtt(“listsize”));

继续阅读