分享

教你如何用织梦程序设计网站,看字就会

 温存过去 2014-03-02

第一章:织梦系统认识入门篇——环境配置与程-织梦CMS

备注 有很多细节性的问题,只有你遇到后才知道,在这里无法一一列出,如果你在建织梦模板的时候出现什么困难,欢迎和我们交流,我们的网址baijin168.cn 168成品网站设计

APMServ 5.2.6下载地址:http://down.chinaz.com/soft/7558.htm

1)软件简介

    APMServ 5.2.6 是一款拥有图形界面的快速搭建Apache 2.2.9PHP
5.2.6
MySQL 5.1.284.0.26NginxMemcachedphpMyAdminOpenSSL
SQLite
ZendOptimizer,以及ASPCGIPerl网站服务器平台的绿色软件。
1
、注意事项:APMServ程序所在路径不能含有汉字和空格。
2
MySQL默认用户名:root,密码为空
3
MySQL数据库文件存放目录:MySQL5.1\dataMySQL4.0\data
4
、网站根目录[HTML,PHP]www\htdocs [ASP]www\asp [CGI,Perl]www\cgi-bin
5
、访问本机请用http://127.0.0.1/https://127.0.0.1/ (如果开启SSL)
6
、非默认端口,网址为http://127.0.0.1:端口/https://127.0.0.1:端口/
7
、如果在扩展功能中选择使用Memcached,它的端口为:11211
8
APMServ集成了以下软件:
Apache 2.2.9          [HTTP
服务器]
Nginx 0.7.19          [HTTP
服务器]
NetBox 2.8 Build 4128 [HTTP
服务器+ASP脚本解释引擎]
PHP 5.2.6             [PHP
脚本解释引擎]
MiniPerl 5.8          [Perl
脚本解释器]
Memcached 1.2.4       [key-value
内存缓存系统]
MySQL 5.1.28          [MySQL
数据库服务器]
MySQL 4.0.26          [MySQL
数据库服务器]
phpMyAdmin 2.11.9.2   [MySQL
数据库在线管理工具]
eAccelerator 0.9.5.3  [PHP
脚本加速引擎]
ZendOptimizer 3.3.3   [PHP
脚本加速引擎]
OpenSSL 0.9.8h        [HTTPS(SSL)
安全传输协议]

2)安装过程

  1. 下载压缩包,解压出7z的自解压文件;
  2. 运行这个自解压文件,将他解压到您硬盘的任意位置;
  3. 双击打开根目录下的APMServ.exe
  4. 直接点击启动即可;

3)常见问题

Apache如果启动失败,请检查一下本机是否已经运行了占用80端口的软件,比如迅雷、QQ音乐等。如果运行了,请先关闭这些软件再进行尝试;如果没有运行,请修改一下这个软件的Apache端口或者重启计算机尝试!

 

第二章:织梦系统认识新手篇——系统文件夹讲解-织梦CMS

上一节课,我们将到了织梦(Dede)系统的 WinXP运行环境配置以及Dede系统的安装,今天我们就来开始认识了一些Dede系统各个文件夹的代表含义,这里我们以最新的V5.6版来做演示。我们在织梦官方网站下载后的程序文件列表解压后如图:

Dede系统的文件夹主要包括了以下几个方面

·                                 系统目录

·                                 数据目录

·                                 模板目录

·                                 后台目录

·                                 会员目录

·                                 模块插件目录

·                                 其它目录

1)系统目录

系统目录,一般都是全局函数、类处理文件、标签源码等一些保持系统正常运行的必须存在的文件!这个文件夹为

include/

我在上面之所以以/结尾,意思就是这个文件夹下的所有子文件夹及文件均是系统目录。绝大多数情况下是既不能删除,也不能移动。甚至连更名都不允许。除非你能对Dede进行彻底的二次开发,否则请不要对这个目录进行操作。

2)数据目录

数据库目录,一般用于存在网站是运行的过程中所产生的一些文件,有了这些文件,系统才能更好的运行起来。当然,有的文件,也是必须存在的。这个文件夹为

data/

当然,由于这个目录下的文件夹较多,为了能使大家能够更好的区别了解,我在这里也为大家简单的整理了一下这些子文件夹的含义:

data  数据目录
└─admin  网站后台管理的一些必要配置
└─backupdata  默认的系统数据库备份目录(后台可设置为其它目录)
└─cache 缓存目录(这个缓存是栏目缓存等)
└─enums 联动菜单
└─js JS文件 // 这个来源于后台生成—> 获取JS文件
└─mark 水印相关
└─module 模块插件 //这里的文件均可以在后台模块管理处安装或下载
└─payment 看这文字跟支付相关,貌似V5.6无效了(待确定)
└─rss RSS订阅文件,在后台生成
└─safe DedeV5.6 新增的后台 验证安全设置 的配置文件
└─sessions 这个不用说了,sessions验证文件
└─textdata 这个是如果将文章以文本形式存储的话,那么就会储存到这里
└─tplcache 模板生成具体内容时的标签缓存
└─uploadtmp 上传的临时文件夹
└─ziptmp ZIP操作时的临时文件夹
└─common.inc.php  数据库配置文件
└─config.cache.inc.php 系统配置文件
└─config.cache.bak.php 系统配置文件备份
└─config.file.inc.php 远程发布的配置文件
└─downmix.data.php  防猜忌混淆字符串配置
└─safequestions.php 会员注册时的安全问题配置
└─template.rand.php 文档随机模板配置

上面呢,我列出了大部分的文件夹的大体含义,这里仅供大家参考。如果有错误的地方欢迎大家提出。

3)模板目录

说到这个,估计很多人眼睛都亮了。因为一个网站做得好不好,其实模板(通常也就是网站的前端体现)是非常重要的一个环节,这里废话不多说,我只想说重点。就是这个模板文件夹的目录是:

templets/

同理,由于模板目录里文件比较多,我也会给大家列出一个大概的样式,用于大家参考:

templets/ 前台模板文件的总目录
└─default/ 系统默认的模板风格
   
└─images/  默认模板中所用到的图片
   
└─js/ 默认模板中所用到的JS文件
   
└─css/ 默认模板中所用到的CSS文件
   
└─advancedsearch.htm  模型自定义搜索页面
   
└─ajaxfeedback.htm 文档内容页ajax评论模板
   
└─article_article1.htm  文章模型默认随机内容模板2
   
└─article_article2.htm  文章模型默认随机内容模板1
   
└─article_article.htm  文章模型默认内容模板
   
└─article_article_frame.htm  启用多站点后的文章模型内容模板
   
└─article_default.htm 模型内容模板不存在时的错误提示模板
   
└─article_default_sg.htm 独立表单模型内容模板不存在时的错误提示模板
   
└─article_image.htm 图集内容模板
   
└─article_image_frame.htm 多站点后的图集内容模板
   
└─article_infos.htm 分类信息内容模板
   
└─article_shop.htm  商城内容模板
   
└─article_soft.htm  软件内容模板
   
└─article_soft_frame.htm 多站点软件内容模板
   
└─article_spec.htm 专题内容模板
   
└─footer.htm 全站底部
   
└─googlemap.htm google地图(需要配合自由列表)
   
└─head.htm 全站头部
   
└─index.htm 网站首页
   
└─index_article.htm 文章频道封面
   
└─index_default.htm 模型频道封面模板不存在时的默认模板
   
└─index_default_sg.htm 独立表单模型频道封面模板不存在时的默认模板
   
└─index_image.htm  图集频道封面
   
└─index_infos.htm  分类信息频道封面
   
└─index_shop.htm  商城频道封面
   
└─index_soft.htm  软件频道封面
   
└─list_default.htm  模型列表模板不存在时的默认模板
   
└─list_default_sg.htm  独立表单模型列表模板不存在时的默认模板
   
└─list_free.htm  自由列表默认模板
   
└─list_image.htm  图集列表
   
└─list_infos.htm 分类信息列表
   
└─list_shop.htm  商城列表
   
└─list_soft.htm  软件列表
   
└─list_spec.htm  专题列表
   
└─search.htm  搜索结果页
   
└─singlepage.htm  单页面模板
   
└─tag.htm  TAG首页
   
└─taglist.htm  TAG列表
└─plus/  模块插件的模板目录
└─system/ 其它的一些系统底层模板
└─wap/  手机wap模板

4)后台目录

我们常说的后台目录,一般都是指的管理员在后台地址登陆所在的目录。在DedeCMS 中,默认的后台目录为:

dede/

注意:推荐大家在系统完成调试后修改这个目录名,防止非法用户登录。

5)会员目录

会员目录一般用于网站提供给一些访客用于注册、登陆用的。当然,里面也包括了会员空间,会员管理中心的模板风格等文件。该目录的地址为:

member/

6)模块插件目录

这个目录一般用于模块插件的文件存在,比如购物车、高级搜索、动态浏览时的文件、记录下载次数、阅读次数等。这个文件夹为:

plus/

7)其它目录

其它目录包括Html静态目录,专题目录等等。这些文件可根据自身需要来处理。

a/ 默认的静态页面生成页面
install/ 
系统安装界面
uploads/ 
图片、附件等保存目录
special/ 
专题目录
images/ 
程序本身用到的图片

第三章:织梦系统认识新手篇——模板及常用数据库-织梦CMS

上一节课我们给大家已经详细讲到了Dede系统的各个文件夹的具体含义,今天我们接着来给大家讲解Dede的模板风格及数据库相关的知识。当然,在这里,你也是可以适当的先了解,至于具体的用法和熟悉我们会在后面的教程一步步提到。

·                                 如何新建模板方案

·                                 如何定义目标模板文件

·                                 模板文件的命名规则及注意事项

·                                 常见数据库表及其字段的含义

一、模板风格文件

1)如何新建模板方案

我们在上一讲的文件夹介绍中已经给大家讲过,Dede系统的模板文件夹是位于根目录下的templets文件夹,他包含了当前的默认文件夹、模块插件模板文件夹,系统底层模板文件夹这三个。那么我们如果要创建我们自己的新的模板方案,就只需要在templets文件夹创建一个文件夹来用于存在具体的各个模板文件,如图:

就这么简单,我们自己的模板方案已经创建成功。

2)定义/设置模板风格

我们创建好模板方案以后,其实这时候是无效的。为什么呢?因为我们的后台其实并没有对它进行定义。这时候,我们就需要进入后台,【系统】[系统基本参数]对这个模板方案进行设置。如图:

好了,到这一步的时候呢,我们创建的模板方案已经基本完成了。不过,这里请:

注意:这只是创建了模板方案,模板文件里我们还没有做。这个我们也会一步步来进行完善。

3)模板文件的命名规则及注意事项

我们刚才已经成功创建并设置好了自己的模板方案,那么接下来呢,就是要为这个模板方案创建属于我们自己个性化的模板文件了。Dede系统的模板是以.htm格式的静态网页存在的。所以我们只需要在刚才的 xuewl_com 目录下创建静态的网页文件,比如首页:

 

 Dede系统的模板命名从根本上来说都属于任意的。就是说,对命名的要求是没有的。只是大家来命名之后需要到后台的某些地方进行更改、设置,比如栏目的高级选项。

 好了,Dede系统的模板我们就先了解到这里。以后我们也会继续的慢慢接触这方面的内容及知识。

二、Dede常见数据库表

由于Dede的表比较多,在这里我只能列出常见的、默认的一些表给大家做以参考。如需要详细的数据字典,请关注本站近期推出的DedeCMS数据库字典帮助手册。

dede_archives

字段名

类型

最大长度

默认值

备注

id

mediumint

8

自动编号

文档ID

typeid

smallint

5

0

文档所属主栏目

typeid2

varchar

90

0

文档所属副栏目

sortrank

mediumint

int

0

文档排序(置顶)

flag

mediumint

0

NULL

自定义属性

ismake

smallint

6

0

是否生成静态

channel

smallint

6

0

所属频道

arcrank

smallint

6

0

阅读权限(会员组)

click

mediumint

8

0

点击数

money

smallint

6

0

阅读权限(金币)

arcrank

smallint

6

0

阅读权限

title

char

60

Empty string

文章标题

shorttitle

char

60

Empty string

简短标题

color

char

7

Empty string

标题颜色

writer

char

20

Empty string

作者

source

char

30

Empty string

来源

litpic

char

100

Empty string

缩略图

pubdate

int

10

0

更新时间

senddate

int

10

0

发布时间

litpic

char

100

Empty string

缩略图

mid

mediumint

8

0

发表会员MID

keywords

char

30

Empty string

关键词

lastpost

int

10

0

最后一次顶/踩时间

scores

mediumint

8

0

文档积分

goodpost

mediumint

8

0

顶的次数

badpost

mediumint

8

0

踩的次数

notpost

tinyint

1

0

是否允许评论

description

varchar

255

Empty string

文档简介

filename

varchar

40

Empty string

自定义文件名

dutyadmin

mediumint

8

0

责任编辑

tackid

int

10

0

暂无作用

mtype

mediumint

8

0

会员(我的分类)

weight

int

10

0

V5.6手工排序

第四章:织梦系统提高标签篇——文档列表标签(-织梦CMS

上一节课我们给大家介绍了模板和常用数据库的一些基本知识,从今天开始,我们就要学习织梦的调用标签了。首先,今天要学习的是Dede系统中一个非常重要的标签:文档列表标签,我们也把他叫做arclist标签。为了能更好对它进行专业命名以及规范,以后的教程中我都直接将他称为arclist标签。

在具体学习arclist标签之前,我们还需要了解一下织梦标签的书写格式以及两种调用方式。

一、织梦(DedeCMS)系统的标签知识

1Dede系统标签的两种调用方式及书写格式

Dede系统标签调用有两种格式,也就是有底层模板和无底层模板。

注意:所谓底层模板,就是具体的显示内容。

第一种:无底层模板

Dede系统无底层模板标签通用书写格式为:{dede:标签名 参数=''/} 

例如:{dede:field name='typename'/},在新版本中,这个也等同于{dede:field.typename/}

第二种:有底层模板

Dede系统有底层模板标签通用书写格式为:

{dede:标签名 参数1='1' 参数2='2' ... 参数N='N'}
 
底层模板样式
{/dede:
标签名}

参数1到参数N指的是可以有多个复合参数,并用空格分离。比如,下面的这一段具体调用。

{dede:arclist row='8'}
 [field:textlink/]
{/dede:arclist}

上面,这一个就是调用网站最新更新的8篇文章。其中的[field:textlink/]就是我们所说的底层模板,它是用来显示具体的内容的。

2Dede系统标签调用的主意事项

  1. 所有的标签字符必须在半角英文状态进行;
  2. 所有的标签必须严格按照格式来书写;
  3. 标签调用必须要写在指定的模板文件.htm中才会有效,不能直接在PHP文件中使用;
  4. 标签调用的字段均可使用函数进行字符处理(后面我们会讲到)

二、文档列表标签(arclist)详解

1)适用范围

全局使用/(既所有的前台模板均可调用,比如首页、列表、内容等)

2)参数列表

参数,是用来限制调用条件,满足更多的个性化展示。

  1. row='8' 调用条数既循环次数;
  2. titlelen=‘30’ 限制文档标题的最大字符数(注意:一个汉字为两个字符)
  3. flag='c' 文档自定义属性,这里可同时定义多个属性,需用半角,分隔;
  4. noflag='c' 不包含自定义属性,用法上同;
  5. typeid=‘2’ 指定栏目,多个栏目请用半角符号的,分割;
  6. col=‘2’ 显示列/(不推荐此参数,准备的标准格式应该是CSS控制浮动)
  7. infolen='60' 简介最大字符;
  8. imgwidth='100' 缩略图宽度;
  9. imgheight='100' 缩略图高度;
  10. orderby='pubdate' 排序字段,取值范围有click(等同于hot)/sortrank/id/near/lastpost/scores/rand/weight
  11. keyword='关键字' 包含某关键字,多个请用半角符号,分割
  12. aid='1'  指定文档;
  13. idlist='1,2,3'  指定文档列表;
  14. getall='1'  在没指定这个参数情况下,栏目页,内容页不会获取它的子级栏目;
  15. channelid='1' 指定内容模型频道;
  16. addfields='字段' 获取附加表的字段;
  17. limit='起始ID,多少条' 这个与row不能同时使用;
  18. orderway='desc' 排序方式/asc为正序,desc为倒序,默认为desc
  19. subday='2' 获取指定天数内,通常用于做本月热门类似; 

3)底层模板

底层模板的调用方法为:

[field:字段名/]

这里的字段名默认取值为主表的所有字段(dede_archives),如果您已经指定了channelidaddfileds参数,那么取值范围也会相应增加addfields里的列表;

三、文档列表标签(arclist)图文实例

1)单一参数调用

首先,在我们的默认模板里创建一个名为 index.htm 的首页模板(其实前面,我们也以前创建好) ,写上如下代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www./1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

<title>{dede:global.cfg_webname/}</title>

<style>

#Nav ol {}

#Nav ol li{padding-right:8px;}

#Nav ol li a{ color:#333; text-decoration:none;}

#Nav ol li a:hover{ color:#FF0000; text-decoration:underline;}

</style>

</head>

<body>

<div id="Nav">

<h2>最新文章</h2>

<ol>

{dede:arclist row='10'}

<li><a href="[field:arcurl/]">[field:title/]</a>

</li>

{/dede:arclist}

</ol>

</div>

</body>

</html>

如下图:

 这段代码的意思是调用全站的最新10篇文章,我们将之保存后生成(为了便于演示,生成静态的过程一律省略)的调用结果如下:

2)复合(多个)参数调用

接下来,我们将index.htm 中的<body></body>全部替换为如下代码:

折叠XML/HTML 代码复制内容到剪贴板

1.       <div id="Nav">  

2.           <h2>推荐文章</h2>  

3.           <ol>  

4.           {dede:arclist row='10' titlelen='12' flag='c'}   

5.               <li><a href="[field:arcurl/]">[field:title/]</a> ([field:click/])   

6.               </li>  

7.           {/dede:arclist}   

8.           </ol>  

9.       </div>  

上面这段代码的意思是调用推荐文章10条,并且最大字符数不能超过12个字符(也就是6个汉字),在底层模板中的标题后面加了一个括号用于显示点击数

接下来我们来看最终生成后的效果:

第五章:织梦系统提高标签篇——列表归档标签(list-织梦CMS)

上一节课,我们讲到织梦系统的第一个常用的重要标签(arclist),相信大家已经领略到了Dede系统标签的强大之处,它的灵活、方便、简单等的特点在所有的CMS系统中早已成了亮点。今天,我们继续学习第二个常用的重要标签——文档归档标签(list),为了便于书写及讲解,后面统称为list标签。

今天我们要学习的主要有以下三部分:

·                                 文档归档标签(list)知识详解

·                                 分页页码标签(pagelist)知识详解

·                                 图文实例练习

一、文档归档标签(list)知识详解

1list标签的适用范围

list标签的作用主要是调用当前栏目的所有文档,并且与分页页码标签配合形成的一种详细栏目文档归档。所以:

该标签只适用于终极栏目列表。

2list标签的书写格式

list标签是属于第二种有底层模板的调用方式,故它的调用格式为:

 {dede:list 参数1='1' 参数2='2' ... 参数N='N'}
 
底层模板(insertext)
{/dede:list}

3list标签参数列表

参数,是用来限制调用条件,满足更多的个性化展示。

  1. col='2'  分几列显示(不推荐此标签,建议使用CSSfloat浮动控制)
  2. titlelen='30' 最大标题字符数
  3. infolen='60' 最大简介字符数
  4. imgwidth='100' 缩略图的宽度
  5. imgheight='100' 缩略图高度
  6. orderby='sortrank' 排序字段/默认支持senddate(id),click(hot),lastpost,sortrank 默认为sortrank
  7. orderway='desc' 排序方式 支持 desc,asc
  8. tablewidth='100' 表格宽度,与col参数配合(通常不建议使用)
  9. pagesize='5' 分页文档数(既表示每页的最大文档数量)

模板调用与arclist标签一样,方式为[field:字段名/],字段名取值范围为主表及附加表的所有字段。

注意:附加表字段的调用需要进行简单设置后方可生效

二、分页页码标签(pagelist)知识详解

pagelist标签是用于显示分页页码的,所以它也只能用于终极栏目页面,它的基本调用方式为:

{dede:pagelist 参数=''/}

由于这个标签的局限性,它的参数也少得可怜,只有两个,如下:

  1. listsize='5'  表示页码的数量(也就是页码的长度),如[1] [2] [3] 共计多少个
  2. listitem='' 表示页码的具体样式(index,pre,pageno,next,end,option)

第六章:织梦系统提高标签篇——文档内容调用(fiel-织梦CMS

前面两节课,我们分别给大家讲了文档列表标签(arclist)与文档归档标签(list)的知识及实例讲解。不难看出,这两个标签都有一个共同点——均是列表类,有底层模板的调用标签。今天,我们要讲解的field标签,是在文档阅读页使用的,他是一个不具备底层模板的通用类标签。

但是由于内容阅读页面的特殊性,所涉及的东西较为复杂,所以我们今天要讲解的标签是比较多,但也都是一些非常简单的标签。简单得到了您只需要记住,然后熟能生巧。

·                                 文档内容标签(field

·                                 内容分页(pagebreak

·                                 分页标题(pagetitle

·                                 相关文档(likearticle

·                                 用户信息(memberinfos

·                                 /下一篇(pagenext

一、文档内容(field)等相关标签知识讲解

1)文档内容标签(fidld)

这个标签可以说是织梦系统所有标签中最简单的一个了,您只需要记住这个标签的调用书写是格式为:

{dede:field.字段名/}

这个字段名的取值范围为主表及相关附加表的所有字段,且调用附加表字段不像arclistlist标签一样需要额外设置参数或者后台。它是无需做任何设置的,默认均全部有效!

这里,我就简单给大家列出几个比较常用的调用:

{dede:field.title/} 文章标题
{dede:field.writer/}
文章作者
{dede:field.source/}
文章来源
{dede:field.pubdate function="MyDate('Y-m-d H:i:s',@me)"/}
更新时间
{dede:field.typename/}
文档栏目名称
{dede:field.scores/}
文档积分
{dede:field.body/}
正文内容
...

其它的调用,大家可以参考主表数据库字典。

2)内容分页(pagebreak

这个标签可谓是经典至极,为什么?因为它不但没有底层模板,它甚至连一个参数都没有。光杆司令一个,看看它的调用方法:

{dede:pagebreak/}

看见了吧,不管你做的是什么样的模板,做多少个模板,它的调用代码就是这个,无例外。意义也表达得很清楚,就是文档内容正文分页。

3)分页标题(pagetitle

分页标题这个标签,也是无底层模板的调用标签,有且仅有一个参数:

style='select' 分页标题的显示样式(select:下拉菜单/ link:文字链接)

它也是一样, 没有意外。所有的模板都是这样的调用。只是根据自己的实际情况选择一下显示的方式而已。可用调用代码为:

{dede:pagetitle style='select'/}

4)相关文档(likearticle

相关文档只适用于是文档内容页,它是一个有底层模板的调用标签,其标签名为likearticle,参数有以下几个:

  1. row='5' 调用条数
  2. titlelen='30'  标题最大字符数
  3. infolen='60'  简介最大字符数
  4. col='2'  分几列显示(建议用cssfloat属性)
  5. tabwidth='100' 如果用col参数的话,那么整个表格的宽度
  6. mytypeid='5'  限制栏目ID
  7. imgwidth='100'  缩略图宽度
  8. imgheight='100'  缩略图高度

它的调用代码为:

{dede:likearticle row='8' titlelen='22'}
 [field:title/]
{/dede:likearticle}

这里顺便说一下,相关文档的关联是通过关键字来关联的,所以要想关联,要保证关联的文档都有同样的关键字

5)用户信息(memberinfos

用户信息标签的适用范围是全局使用,之所以把它归档到内容页来讲,是因为这个标签在内容页的使用更加普遍。

该标签是属于有底层模板的调用标签,它有且只有一个参数

  1. mid = '1' 指定要获取的用户ID

 如果在文档阅读页,该参数为空的话,那么就默认指定该文档的发布者会员ID,通常用来调用发布者资料类似功能。其完整代码为:

{dede:memberinfos}
昵称:[field:uname/]
{/dede:memberinfos}

底层模板的取值范围是:dede_member所有字段及spacename(空间名称)sign(用户签名)

6)上/下一篇(pagenext

这两个标签没有什么可以讲的,大家记下来就行了。

上一篇 {dede:prenext get='pre'/}
下一篇 {dede:prenext get='next'/}

第七章:织梦系统提高标签篇——常用全局调用-织梦CMS

在前面的三节课中,我们分别讲了Dede系统的三个最为常用的基本套装页面(首页、列表、内容),可以说,只要认真学完并体会了前面几节课的内容。我们就可以自己制作出个性化的风格了。但是,这个毕竟只是最基本的页面套装而已,我们要实现真正的网站个性化特色,很明显仅仅靠它们是不行的。这也是这节课所要给大家介绍的内容,主要包括以下标签:

·                                 问答模块标签(ask

·                                 栏目列表标签(channel

·                                 友情链接标签(flink

·                                 热门关键字(hotwords

·                                 广告位标签(myad

·                                 自定义宏标记(mytag

·                                 单栏目标签(type

·                                 TAG标签(tag

第八章:织梦系统进阶标签篇——万能循环(Loo-织梦CMS

前面几节课,我们几乎讲到了Dede系统的大多数调用标签,照理来说,学会了前几节课的所有标签,一般类型的站点风格制作已经不具有太大的问题了。今天,我们就来深入的真正了解织梦强大的标签内核。

但是,你甭管我说得天花乱坠,涉及到了内核,以外难度非常之大,肯定学不会。其实不然,今天我们要讲的也只是织梦的两个调用标签而已,只是更为灵活,更为强大而已。今天的内容主要是:

·                                 万能循环标签(loop

·                                 万能调用标签(SQL

一、标签详解

1)万能循环标签(Loop

 所谓万能循环标签,听这个名字就知道,主要是用于循环的列表标签,他的调用结果通常和(arclist)与(list)这样的列表标签类似。但由于它的名称是万能循环,所以,他的范围更加广泛,广泛到是万能,是任意表而已。

那么我们前面说接触的arclist这些难道不是任意吗?答案是否,他的表仅仅是主表(dede_archives)与附加表(dede_addon***)而已,并且要想索引附加表,我们还需要进行其它的一些设置,获是后台,或是标签参数。我在前面也提到了一句话:

arclist的底层模板请用[field:字段名/]调用,其中字段名的取值范围为主表及相关附加表的所有字段。

说到这里,应该就基本能明白了万能循环标签(loop)与其它的一些列表标签的区别之处了。

那么,loop标签的调用格式是什么样的呢?

你首先得明白,loop标签它也是一个Dede标签之一,所以它的调用方式也只能是我们两种调用标签的其中一个,因为它是一个具有底层模板的循环列表标签。故loop标签的调用基本格式为:

{dede:loop 参数='' ...}
 
底层模板(insertext
{/dede:loop}

相信大家看到这里,就等不及的需要知道它到底有那些参数了。

1.       table=''  表示要索引的表(数据库字典)

2.       row=''  表示要循环的次数

3.       sort='' 表示用于排序的字段

4.       if='' 表示附加的条件(SQL语句中的where后面的内容)

大家看看,loop标签就只有这4个参数。

它的底层字段也是和前面一样用[field:字段名/]表示,但字段名的取值范围为参数table的所有字段。

我们来调用一个实例:

调用网站热门文章10条且浏览量必须大于80个点击:

{dede:loop table="dede_archives" sort="click" row="10" if="click > 80"}
[field:title/]<br/>
{/dede:loop}

解释一下:table="dede_archives" 表示要索引的是主表;sort="click" 表示按照点击数(click)从大到小排序;row="10" 表示调用10条;if="clcik > 80" 表示点击数(click)大于80

底层模板显示的就是字段title的内容,这个呢,我们在前面说过,主表(dede__archives)的title字段表示的是文章的标题。

好,我们来看看上一段代码在实际运用中的显示效果:

如果您以为Loop标签只是用来调用主表的最新、热门文章什么的?那你就错了,您主要要理解的是loo标签它可以索引同数据库下的所有的表的循环。比如可以调用整合后的UCHomeDiscuz!的数据,甚至可以调用同数据库下的其它CMS数据,比如wordpressphpcms、帝国CMS等等,只要它满足:同数据库;MySQL有数据。那么loop标签几乎都可以为您完成。

但是,loop标签也有其缺陷,比如无法实现按从小到大排序,更无法实现同时关联多表的操作。

在这时,我们另一个比Loop标签更为强大的SQL标签就可以出来替您摆平这件事儿了,不过,前提是:您得先学会它!

 2)万能调用标签(SQL

在正式开始讲解SQL标签之前,我得先告诉大家一个动态网站运行的一个简单原理:

动态网站的核心就是数据库,所谓数据库就是我们存储数据的一个东西,跟仓库差不多 。在前台注册、登陆、评论或后台编辑文档、添加栏目等等这些操作其实就是对数据库的操作,而数据库的操作无外乎就是以下四种:

1.       增加数据(Insert

2.       修改数据(Update

3.       查询数据(Select[我们常说的索引也是这个东西]

4.       删除数据(Delete

比如,我们后台增加栏目,增加友情链接等等这个操作就属于insert 编辑栏目、修改文档等等这类的就属于Update操作; 而文档列表、栏目列表这些我们能够看得见的就是Select后的操作;最后当我们要删除某个文档或是栏目的时候,其实就属于delete的操作了。

同理,我们在调用标签,实际上就是调用数据库内容,最后看见的其实也就是select后显示的东西。

所以,任何动态类型的网站,凡事涉及到调用什么的,这个是肯定没二话可说,就是select ,包括Dede系统的什么arclist list 等等。

但是,现在仍然不是可以将SQL标签具体内容的时候,而是要先告诉您,SQL查询类(select)语句的一些基本知识:

查询格式为:

SELECT 列名称 FROM 表名称

这里的列名称您可以认为是表的字段,也就是:

SELECT 字段名 FROM 目标表

多个字段,请用半角英文状态的“,”分隔,如果要查询目标表的所有字段,可用通配符“*”表示:

SELECT 字段名1,字段名2,字段名3 FROM 目标表;
SELECT *
,字段名3 FROM 目标表;

如果要设置查询条件,可在后面用where子句,比如:

SELECT 列名称 FROM 表名称 WHERE 运算符

大家可以查看:http://www.w3school.com.cn/sql/sql_where.asp 相关知识。

由此我们可得出一个结论:所有的标签其实都是通过SQL语句的select操作来实现查询的

比如,文档列表标签(arclist)的中的一个简单调用—— 调用整站热门图文8篇:

折叠XML/HTML 代码复制内容到剪贴板

1.       {dede:arclist row='8' orderby='click' flag='p'}   

2.           <img src="[field:litpic/]" />  

3.       {/dede:arclist}  

这个调用呢,其实它真正的SQL语句为:

折叠SQL 代码复制内容到剪贴板

1.       select * from dede_archives where arcrank > -1 and find_in_set('p',flag) >0 order by click desc limit 0,8  

那么就可以理解为:

织梦标签的各个参数就是SQL语句中的where的各个运算过程,多个的关系是而不是

好了,现在我们来看一下SQL标签的调用格式:

{dede:sql sql="完整的SQL语句"}
 
底层模板insertext
{/dede:sql}

从这里不难看出,SQL标签其实就一个参数:

sql=''  一条完整的SQL语句

它的底层字段就是sql语句中查询的所有表中的所有字段。

比如:调用推荐文档12篇:

折叠XML/HTML 代码复制内容到剪贴板

1.       {dede:sql sql="select * from dede_archives where arcrank > -1 and find_in_set('c',flag) >0 order by click desc limit 0,12"}   

2.       [field:title/]   

3.       {/dede:sql}  

这里的SQL语句,大家可以学习相关的SQL语句的相关知识后任意发挥,真正达到万能的作用。

好了,今天的教程就到这里,我们明天见!

第九章:织梦系统深入函数篇——织梦常用函数详解-织梦CMS

今天这篇教程,准确的说应该算是一篇独立的教程系列。但是作为技术员,在建站过程中,函数这个东西是必不可少的。所以,我将它合并到本专题,作为其中的一节课程。希望大家认真理解、零活运用DedeCMS的自带函数。当然,我更希望您能够在学习完以后,自己独立定义织梦(DedeCMS)系统的自定义函数接口,然后分享给大家。我们今天的内容主要包括织梦(DedeCMS)系统的十个常见函数,分别为:

1.            获得当前的脚本网址  

2.            function GetCurUrl()  

3.             

4.            返回格林威治标准时间  

5.            function MyDate($format='Y-m-d H:i:s',$timest=0)  

6.             

7.            把全角数字转为半角  

8.            function GetAlabNum($fnum)  

9.             

10.        把含HTML的内容转为纯text  

11.        function Html2Text($str,$r=0)  

12.         

13.        把文本转HTML  

14.        function Text2Html($txt)  

15.         

16.        输出Ajax  

17.        function AjaxHead()  

18.         

19.        中文截取2,单字节截取模式  

20.        function cn_substr($str,$slen,$startdd=0)  

21.         

22.        把标准时间转为Unix时间戳  

23.        function GetMkTime($dtime)  

24.         

25.        获得一个 0000-00-00 00:00:00 标准格式的时间  

26.        function GetDateTimeMk($mktime)  

27.         

28.        获得一个 0000-00-00 标准格式的日期  

29.        function GetDateMk($mktime)  

30.         

31.        获得用户IP  

32.        function GetIP()  

33.         

34.        获取拼音以gbk编码为准  

35.        function GetPinyin($str,$ishead=0,$isclose=1)  

36.         

37.        dedecms通用消息提示框  

38.        function ShowMsg($msg,$gourl,$onlymsg=0,$limittime=0)  

39.         

40.        保存一个cookie  

41.        function PutCookie($key,$value,$kptime=0,$pa="/")  

42.         

43.        删除一个cookie  

44.        function DropCookie($key)  

45.         

46.        获取cookie  

47.        function GetCookie($key)  

48.         

49.        获取验证码  

50.        function GetCkVdValue()  

51.         

52.        过滤前台用户输入的文本内容  

53.        // $rptype = 0 表示仅替换 html标记  

54.        // $rptype = 1 表示替换 html标记同时去除连续空白字符  

55.        // $rptype = 2 表示替换 html标记同时去除所有空白字符  

56.        // $rptype = -1 表示仅替换 html危险的标记  

57.        function HtmlReplace($str,$rptype=0)  

58.         

59.        获得某文档的所有tag  

60.        function GetTags($aid)  

61.         

62.        过滤用于搜索的字符串  

63.        function FilterSearch($keyword)  

64.         

65.        处理禁用HTML但允许换行的内容  

66.        function TrimMsg($msg)  

67.         

68.        获取单篇文档信息  

69.        function GetOneArchive($aid) 

 织梦DedeCMS删除所有栏目或文章后,新建ID不从1开始的解决方法-织梦CMS

织梦DedeCMS删除所有栏目或文章后,新建ID不从1开始的解决方法

  这个修改方法很简单,从模板无忧那里找到的,只需要在后台系统-SQL命令行工具里面运行以下语句即可,不用采用笨方法重新安装织梦CMS了。

  删除所有栏目,新建ID1开始:

  1

  ALTER TABLE `dede_arctype` AUTO_INCREMENT =1;

  删除所有文章,新发布文章ID1开始:

  1

  ALTER TABLE `dede_archives` AUTO_INCREMENT =1;

织梦(DedeCMS)系统自定义字段图片调用的问题{dede:img ...}-织梦CMS

为什么在首页用自定义列表调用出来的图片字段不是正确的图片地址,而是类似于:

{dede:img text='' width='270' height='129'} http://www./uploads/101017/1-10101H21F54P.gif {/dede:img}

这样的格式!

非常明显,这样是不能正确显示的,这是织梦自定义图片字段的处理方式造成的。要解决这个问题,我们必须得创建一个自定义函数,其实现方式为:

一、实现方法

1)创建自定义函数

打开 /include/extend.func.php 文件(注:这个文件就是系统预留的自定义函数接口文件,主要用于二次开发用的。如果你是老版本,默认没有这个文件,自己创建一个PHP文件即可),在最下面的?>上一行加入以下函数代码:

折叠PHP 代码复制内容到剪贴板

1.       /****************  

2.         function GetOneImgUrl  

3.         @@ 功能:读取自定义字段图片地址  

4.         @@ 作者:华强QQ3421209  

5.         @@ 网址:织梦教程网(xuewl.com  

6.         @@ 时间:2010-10-17 22:48  

7.       *****************/  

8.         

9.       function GetOneImgUrl($img,$ftype=1){   

10.       if($img <> ''){   

11.           $dtp = new DedeTagParse();   

12.           $dtp->LoadSource($img);   

13.           if(is_array($dtp->CTags)){   

14.               foreach($dtp->CTags as $ctag){   

15.                   if($ctag->GetName()=='img'){   

16.                       $width = $ctag->GetAtt('width');   

17.                       $height = $ctag->GetAtt('height');   

18.                       $imgurl = trim($ctag->GetInnerText());   

19.                       $img = '';   

20.                       if($imgurl != ''){   

21.                           if($ftype==1){   

22.                               $img .= $imgurl;   

23.                           }   

24.                           else{   

25.                               $img .= '<img src="'.$imgurl.'" width="'.$width.'" height="'.$height.'" />';   

26.                           }   

27.                       }   

28.                                  

29.                   }   

30.               }   

31.           }   

32.           $dtp->Clear();   

33.           return $img;       

34.       }   

35.   }  

保存后关闭即可。

2)函数调用方法

问:我们创建好函数以后,那么这个函数要如何来调用呢?

答:本函数的调用方法为:

[field:自定义图片字段名 function="GetOneImgUrl(@me,显示类型)"/]

比如:我们的自定义图片字段名为 imgurl ,那么调用方式有以下两种:

 [field:imgurl function='GetOneImgUrl(@me,0)'/] <!--调用图片的信息,自动调用宽度和高度(已包含Html代码的<img />标签)-->
[field:imgurl function='GetOneImgUrl(@me,1)'/] <!--
只调用图片地址,一般可用于背景图嵌套-->

二、示例演示

1)模型字段添加

进入网站后台,点击[核心]——[内容模型管理],点击普通文章更改按钮,进入编辑界面,切换到字段管理选项,点击添加新字段,如图:

 

创建好字段以后,我们在增加或编辑文档时候,那么就会有这个字段了,如图:

上传好你要显示的图片以后,保存即可。

2)前台调用

原本我们前台调用这个字段的方法,就是通过arclist标签的 channelid addfields 两个参数来配合调用(点击查看arclist的标签详解),这里不再重复的一一熬述。但大体的自定义字段的方法是这样的:

{dede:arclist row='2' channeld='1' addfields='自定义字段1,自定义字段2'}
 
底层模板 insertext
{/dede:arclist}

运用到我们刚才的这个函数,调用方法为:

折叠XML/HTML 代码复制内容到剪贴板

1.       {dede:arclist row='5' orderby='id' channelid='1' addfields='imgurl'}   

2.       <li>[field:title/][field:imgurl function='GetOneImgUrl(@me,0)'/]</li>  

3.       {/dede:arclist}  

好了,我们来看一下前台的效果图:

好了

 

 

 

 

 

 

 

 

 

 

参数传递看似很简单的东西,但是真正理解它的本质却并不很容易,在看过《你必须知道的.net》一书后,使我从本质上明白了参数的传递。

 

值类型和引用类型的区别:

值类型(Value Type),值类型实例通常分配在线程的堆栈(stack)上,并且不包含任何指向实例数据的指针,因为变量本身就包含了其实例数据

引用类型(Reference Type),引用类型实例分配在托管堆(managed heap)上变量存储对值的内存地址的引用。

 

using System;
public class Test
{
     static void Main()
     {
         //
定义值类型和引用类型,并完成初始化
         MyStruct myStruct = new MyStruct();
         MyClass myClass = new MyClass();
        
         //
定义另一个值类型和引用类型,
         //
以便了解其内存区别
         MyStruct myStruct2 = new MyStruct();
         myStruct2 = myStruct;
        
         MyClass myClass2 = new MyClass();
         myClass2 = myClass;        
     }
}

              内存概况

 

根据参数类型和传递方式不同,有以下4中不同的情况:

·    值类型参数的按值传递

·    引用类型参数的按值传递

·    值类型参数的按引用传递

·    引用类型参数的按引用传递

1.值类型的参数的按值传递

值类型实例传递的是该值类型实例的一个拷贝,因此被调用方法操作的是属于自己本身的实例拷贝,因此不影响原来调用方法中的实例值。

using System;
namespace Anytao.net.My_Must_net
{
     class Args
     {
         public static void Main()
         {
             int a = 10;
             Add(a);
             Console.WriteLine(a); //
输出结果为10
         }

         private static void Add(int i)
         {
             i = i + 10;
             Console.WriteLine(i); 
         }
     }
}

2.引用类型参数的按值传递

当传递的参数为引用类型时,传递和操作的是指向对象的引用,这意味着方法操作可以改变原来的对象,但是值得思考的是该引用或者说指针本身还是按值传递的。

using System;

namespace Anytao.net.My_Must_net
{
     class Args
     {
         public static void Main()
         {
             ArgsByRef abf = new ArgsByRef();
             AddRef(abf);
             Console.WriteLine(abf.i); //
输出结果为20
         }

         private static void AddRef(ArgsByRef abf)
         {
             abf.i = 20;
             Console.WriteLine(abf.i);
         }

     }

     class ArgsByRef
     {
         public int i = 10;
     }
}

按值传递的实质的是传递值,不同的是这个值在值类型和引用类型的表现是不同的:参数为值类型时,为实例本身,因此传递的是实例拷贝,不会对原来的实例产生影响;参数为引用类型时,为对象引用,因此传递的是引用地址拷贝,会改变原来对象的引用指向,这是二者在统一概念上的表现区别,理解了本质也就抓住了根源。

3.string类型作为引用类型的特殊性

using System;
namespace Anytao.net.My_Must_net
{
     class Test    

     {

         private int i = 10;


         static void Main()
         {
             string str = "Old String";

             Test test=new Test();
             ChangeStr(str);

             ChangeObj(test);
             Console.WriteLine(str); //
输出结果为Old String

             Console.WriteLine(test.i); //输出结果为10
         }
         static void ChangeObj(Test t)

         {

             t=new Test(); //这里将创建一个新的对象,所以改变它不会对原对象有影响

             t.i=20;

         }
         static void ChangeStr(string aStr)
         {
             aStr = "Changing String";
             Console.WriteLine(aStr);
         }
     }
}

下面对上述示例的执行过程简要分析一下:首先,string str = "Old String"产生了一个新的string对象,然后执行ChangeStr(aStr),也就是进行引用类型参数的按值传递,我们强调说这里传递的是引用类型的引用值,也就是地址指针;然后调用ChangeStr方法,过程aStr = "Changing String"完成了以下的操作,先在新的一个地址生成一个string对象,该新对象的值为"Changing String",引用地址为0x06赋给参数aStr,因此会改变aStr的指向,但是并没有改变原来方法外str的引用地址,

 

因此执行结果就可想而知,我们从分析过程就可以发现string作为引用类型,在按值传递过程中和其他引用类型是一样的。如果需要完成ChangeStr()调用后,改变原来str的值,就必须使用ref或者out修饰符,按照按引用传递的方式来进行就可以了,届时aStr = "Changing String"改变的是str的引用,也就改变了str的指向。

4.按引用传递之refout

不管是值类型还是引用类型,按引用传递必须以ref或者out关键字来修饰,其规则是:

方法定义和方法调用必须同时显示的使用ref或者out,否则将导致编译错误;

using System;
namespace Anytao.net.My_Must_net._11_Args
{
     class TestRefAndOut
     {
         static void ShowInfo(string str)
         {
             Console.WriteLine(str);
         }
         static void ShowInfo(ref string str)
         {
             Console.WriteLine(str);
         }
     }
}

当然,按引用传递时,不管参数是值类型还是引用类型,按引用传递时,传递的是参数的地址,也就是实例的指针。refout关键字将告诉编译器,方法传递的是参数地址,而不是参数本身。

如果参数是引用类型,则按引用传递时,传递的是引用的引用而不是引用本身,类似于指针的指针概念。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多