私人论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2659|回复: 6

Destoon

[复制链接]

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
发表于 2018-6-15 09:36:14 | 显示全部楼层 |阅读模式
一、模板存放及调用规则

模板存放于系统 template 目录;

如果当前默认模板套系为 default,则:
<?php include template('header');?>
表示使用 template/default/header.htm 模板文件
<?php include template('header', 'member');?>
表示使用 template/default/member/header.htm 模板文件

{template 'header'}
被解析为 <?php include template('header');?>
表示使用 template/default/header.htm 模板文件
{template 'header', 'member'}
被解析为 <?php include template('header','member');?>
表示使用 template/default/member/header.htm 模板文件

模板目录下在 these.name.php 是模板别名的配置文件,模板别名可以在后台模板管理修改。

变量 {$destoon} 被解析为 <?php echo $destoon;?>
常量 {DESTOON} 被解析为 <?php echo DESTOON;?>
对于数组,标准写法应为 例如 {$destoon['index']},可简写为{$destoon[index]},模板在解析时会自动追加引号。

{func_name($par1, $par2)}
被解析为 <?php func_name($par1, $par2);?>

{php expression}
被解析为 <?php expression ?>

{if $a=='b'} do A {/if}
被解析为 <?php if($a=='b') { do A }?>
{if $a=='b'} do A {else} do B {/if}
被解析为 <?php if($a=='b') { do A } else { do B } ?>
{if $a=='b'} do A {elseif $b=='c'} do C {else} do B {/if}
被解析为 <?php if($a=='b') { do A } else if($b=='c') { do C } else { do B } ?>

{loop $var $v}...{loop}
被解析为 <?php if(is_array($var)) { foreach($var as $v) { ... } }?>
{loop $var $k $v}...{loop}
被解析为 <?php if(is_array($var)) { foreach($var as $k=>$v) { ... } }?>

变量或表达式可以用HTML注释,例如 <!--{$destoon}--> 仍被解析为 <?php echo $destoon; ?> (可自动过滤此类注释);
可直接在模板里书写PHP代码,直接书写PHP代码与DESTOON 模板语法是兼容的。

<!--[注释内容]-->注释内容不在网页源代码中显示。
回复

使用道具 举报

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
 楼主| 发表于 2018-6-15 09:51:00 | 显示全部楼层
标签调用

标签调用是根据 调用条件(condition) 从 数据表(table) 读取 调用数量(pagesize) 条数据,并按 排序方式(order) 排序,最终通过标签模板的布局输出数据;
标签的工作分两个部分,一是读取数据,二是显示数据。

标签函数原型
标签函数保存于 include/tag.func.php
tag($parameter, $expires = 0)
$parameter 表示传递给tag函数的字符串,系统自动将其转换为多个变量。
例如传递 table=destoon&pagesize=10&hello=world
系统相当于得到:
$table = 'destoon';
$pagesize = 10;
$hello = 'world';
三个变量
$expires 表示标签缓存过期时间
        >0 缓存$expires秒;
        0 - 系统默认标签缓存时间;
        -1 - 不缓存;
        -2 - 缓存SQL结果;
一般情况保持默认不需要传递。

最好学习一下 SQL 语言。

数据读取过程
例如以下标签:
<!--{tag("moduleid=5&condition=status=3&order=addtime desc&pagesize=10")}-->
会被转换为如下的SQL语句:
SELEC *
FROM DT_sell
WHER status=3
ORDER BY addtime DESC
LIMIT 0,10
读出的数据会保存在 $tags 数组里
通常情况下不需要写table=xxx,应该写moduleid=模块ID,系统会自动对应模块的表

数据显示过程
1、通过标签模板显示
传递 &template=abc 给标签函数,例如:
<!--{tag("moduleid=...&template=abc")}-->
默认的标签模板保存在模板目录 /tag/ 目录里,例如 &template=abc 将调用模板目录 /tag/abc.htm 模板来显示数据。
如果标签模板存放于其他目录,例如 def,则传递 &dir=def&template=abc,系统将调用模板目录 /def/abc.htm 模板。

2、直接在模板里循环数据
<!--{php $tags=tag("moduleid=...&template=null");}-->
此写法传递标签模板为 null ,并且直接返回数据给 $tags 数组,此时可以直接在模板里循环了。
以下为一个完整的示例:
<!--{php $tags=tag("moduleid=...&template=null");}-->
{loop $tags $t}
...
{/loop}

第一种写法一般用于多次调用的数据,第二种写法一般用于只调用一次的数据。

常用参数及含义
moduleid
moduleid 指模块 ID,可在后台模块管理里查询。对于直接调用模块的数据,设置正确的模块 ID 后,将不需要传递 table 参数,系统会自动获取。
例如传递 moduleid=5,系统将识别为调用供应信息,自动设置 table 参数为 sell。
一般情况下,除了扩展模块里的功能都需要通过moduleid来调用。
table
table 指表名,可在后台数据库维护里查询。对于 Destoon 系统表,不需要加表的前缀;对于非 Destoon 系统表,需要填写完整的表名,且传递 prefix 参数。
例如对于 Destoon 系统表,传递 table=announce,如果表前缀为 DT_,系统将识别表名为 DT_announce。
对于非 Destoon 系统表,传递 table=tb_abc&prefix= 或者 table=abc&prefix=tb_,系统将识别表名为 tb_abc。
fields
fields 指查询的字段,默认为 *。可以传递例如 fields=title,addtime,但是一般情况下无需传递,Destoon 独有的标签缓存机制会自动缓存查询结果,不必担心效率问题。
condition
condition 指查询的条件,如果不传递,则为 1,代表任意条件的数据(此项需了解 SQL 语法)。Destoon 所有模块遵循统一标准开发,所以很多条件是通用的。
例如 status=3 表示正常通过的信息、status=3 and level=1 表示级别为 1 的信息、status=3 and thumb<>'' 表示有标题图片的信息等。
order
order 指数据的排序方法(此项需了解 SQL 语法)。
例如 order=addtime desc 表示按添加时间降序排列、order=itemid desc 表示按itemid降序排列、order=rand() 表示随机数据等。
pagesize
pagesize 指调用数据的数量,如果不传递,默认为 10。
template
template 指指定的标签模板,如果不传递,默认为 list,位于模板目录 /tag/list.htm,如果传递为 null,表示不应用标签模板。参见上述数据显示过程。
debug
debug 参数用于调试标签,例如传递 &debug=1,系统将输出标签构造成的 SQL 语句,以便验证标签写法是否正确,不需要调试的标签不用加此参数。

其他常见用法举例

& 和 and 的区别
& 用来分割参数,and 是 sql 语句 where 后的读取条件,二者完全不同。

多表联合查询
例如查询会员名为 destoon 的会员和公司资料,可以使用:
{tag("table=DT_member m,DT_company c&prefix=&condition=m.userid=c.userid and m.username='destoon'&template=list-com")}
DT_member 和 DT_company 是表的实际名称(包含表前缀),prefix= 表示系统不再自动在表名前加前缀。
通常通过传递 moduleid 可以实现大部分的调用,除非您确认熟悉联合查询,否则不推荐使用。
截至目前,系统默认模板里还没有一个功能需要用到联合查询。

控制标题长度
在标签里传递 length 参数,例如 &length=20 表示 20 个字符长度(一个汉字占 2 个字符),一般情况建议用 css 隐藏多余字符(定义 height 和 overflow:hidden )。
传递 length 参数,系统仅对 title 字段自动截取,如果需要截取其他字段,可用 dsubstr 函数。
例如 {dsubst($t[company], 20, '...')} 表示截取 company 字段为 20 个字符,截取后,结尾追加...

设置日期显示格式
可以在标签里传递 datetype 参数:
1 表示 年;
2 表示 月-日;
3 表示 年-月-日;
4 表示 月-日 时:分;
5 表示 年-月-日 时:分;
6 表示 年-月-日 时:分:秒
也可以在模板里直接使用 date 函数,例如 {date('Y-m-d', $t[addtime])} 表示将时间转换为 年-月-日 格式
date 函数的使用请参阅 PHP 手册。

调用某一分类的信息
在标签里传递 catid 参数,例如 &catid=5 表示调用分类 ID 为 5 的所有信息。
如果调用多个分类,用逗号分隔分类 ID,例如 &catid=5,6,7 表示调用分类 ID 为 5、6、7 的所有信息。
分类调用默认包含子分类的信息,如果不需要包含子分类,可设置 &child=0 参数。
例如 &catid=5&child=0 表示只调用分类ID为5的信息,不包括子分类的信息。

调用某一地区的信息
调用地区信息和上述调用分类信息的方法完全相同,将其中的 catid 换为 areaid 即可。

显示信息所在分类
<a href="{$MODULE[$moduleid][linkurl]}{$CATEGORY[$t[catid]][linkurl]}">{$CATEGORY[$t[catid]][catname]}</a>
注意:自V4.0,以上写法将不可用,需要在标签里传递&showcat=1参数,然后在模板里写<a href="{$t[caturl]}">{$t[catname]}</a>

控制列数
此项常用于图片的布局,可使用 cols 参数。
例如调用 12 张图片,一行显示 4 个,共 3 行,则传递 &pagesize=12&cols=4
支持 cols 参数的标签模板限 thumb-table.htm 和 list-table.htm
其中,thumb-table.htm 显示图片列表,list-table.htm 显示文字列表
如果新建支持 cols 的标签模板或直接循环 $tags,可参考以上两个模板的写法
上述效果可以也可以通过CSS实现,无需使用表格,请自行书写

显示文章的简介
使用 {$t[introduce]} 变量,如果要截取字数,例如 80 字符,可使用 {dsubst($t[introduce], 80, '...')}
回复

使用道具 举报

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
 楼主| 发表于 2018-6-19 09:18:22 | 显示全部楼层
<?php
//去掉一些字符
$dikv = preg_replace('/[\'\"\\\(\);]+/','',$tag);
//去掉开头空白、分隔符
$dikv = preg_replace('/^[\s\|,]+/','',$dikv);
//去掉结尾空白、分隔符
$dikv = preg_replace('/[\s\|,]+$/','',$dikv);
//规范中间的分隔符,SQL 中的正则用
$dikv = preg_replace('/[\s\|,]+/','|',$dikv);
//在模块中搜索 文章标题中包含关键字 的文章
if($dikv != ''){
        /*价格25,早报32*/
        $tagtxt = "moduleid=32&condition=keyword REGEXP '($dikv)'&catid=42,147,148,149,150,154,158&pagesize=1&order=addtime desc&template=null";
        //echo $tagtxt;
        $lists = tag($tagtxt);
}else{
        $lists = array();
}
if($lists){
  $dikvgiage = $lists[0];
  $content = tag("table=article_data_32&condition=itemid=". $dikvgiage[itemid] ."&pagesize=1&template=null");
  $content = $content[0]['content'];
}
?>
{if $dikvgiage}
<?php
  $jiage_title = str_replace(array(',',' '),'',$dikvgiage[keyword]);
?>
{/if}
回复

使用道具 举报

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
 楼主| 发表于 2018-6-19 11:13:49 | 显示全部楼层
管理后台文章列表模板
\module\article\admin\template\index.tpl.php
回复

使用道具 举报

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
 楼主| 发表于 2018-9-18 09:33:08 | 显示全部楼层
自动生成价格文章

在数据表 destoon_category 最后添加 ·mungjangtime· 字段。

修改 \admin\category.inc.php

function update($category) {
        if(!is_array($category)) return false;
        foreach($category as $k=>$v) {
                if(!$v['catname']) continue;
                $v['parentid'] = intval($v['parentid']);
                if($k == $v['parentid']) continue;
                if($v['parentid'] > 0 && !isset($this->category[$v['parentid']])) continue;
                $v['listorder'] = intval($v['listorder']);
                $v['level'] = intval($v['level']);
                $v['letter'] = preg_match("/^[a-z0-9]{1}+$/i", $v['letter']) ? strtolower($v['letter']) : '';
                $v['catdir'] = $this->get_catdir($v['catdir'], $k);
                if(!$v['catdir']) $v['catdir'] = $k;
                if(array_key_exists('mungjangtime', $v)){
                        #发文时间,只留数字与冒号
                        $v['mungjangtime'] = preg_replace("/[^0-9:\-\.+]/",'',$v['mungjangtime']);

                        #有数字
                        if(preg_match("/[0-9a-z]/i",$v['mungjangtime'])){
                                $v['mungjangtime'] = date('H:i',strtotime($v['mungjangtime']));
                        }
                        $v['mungjangtime'] = mysql_real_escape_string($v['mungjangtime']);

                        $sql = "UPDATE {$this->table} SET catname='$v[catname]',parentid='$v[parentid]',listorder='$v[listorder]',style='$v[style]',level='$v[level]',letter='$v[letter]',catdir='$v[catdir]',mungjangtime='$v[mungjangtime]' WHERE catid=$k ";
                }else{
                        $sql = "UPDATE {$this->table} SET catname='$v[catname]',parentid='$v[parentid]',listorder='$v[listorder]',style='$v[style]',level='$v[level]',letter='$v[letter]',catdir='$v[catdir]' WHERE catid=$k ";
                }
               
                $this->db->query($sql);
        }
        return true;
}


修改 \admin\template\category.tpl.php

show_menu($menus);
+# 自动发文模块组
+$mungjangmid = array(30,28);
?>


<th>分类目录</th>
+<?php if(in_array($mid,$mungjangmid)) { ?><th>生成时间点</th><?php }?>
<th>索引</th>


<td><input name="category[<?php echo $v['catid'];?>][catdir]" type="text" value="<?php echo $v['catdir'];?>" size="10"/></td>
+<?php if(in_array($mid,$mungjangmid)) { ?>
+<td><input name="category[<?php echo $v['catid'];?>][mungjangtime]" type="text" value="<?php echo $v['mungjangtime'];?>" size="10"/></td>
+<?php }?>
<td>




修改 \module\article\list.inc.php 增加如下代码:


/* 每天固定自补价格文 */
# 2018年9月18日 金留庆(aush532@163.com)
#此处补充的是价格而非报价,标题是“9月14日金乡大蒜价格”这样的
#mungjang 萌章,萌曰发,章即文章,发布文章之意。
#先找出 mungjangtime 字段有时间值的分类
#若有,检查此分类是否可执行萌章 (是否已执行?是否到时间?)
#若可,剔除其下不萌章的子分类,得到 待萌分类组
#查询分类下 以昨日日期开头的 且 发布日期不早于昨日 的文章,记为 旧章
#以 旧章 得到今天需有的文章,记为 今章
#将 今章 剔除 网站已有 且 发布日期不早于今日 的文章
#最后执行时间写入 mungjang_file_cid.txt

#后续优化:分成几个函数(分类处理、文章处理)

//if($_GET['aushy']=='aushy'){

# 获取已填入 生成时间点 的分类
$result = $db->query("SELECT `catid`,`mungjangtime`,`moduleid`,`arrchildid` FROM `{$DT_PRE}category` WHERE `mungjangtime` LIKE '%:%'");
$mungjang_category = array();
while($r = $db->fetch_array($result)) {
        $mungjang_category[$r['catid']] = $r;
}

if(! empty($mungjang_category)){

        #先将分类的arrchildid字段 去掉 已定义 生成时间点 的子分类
        $mungjang_category_id = array_keys($mungjang_category);
        foreach($mungjang_category as &$category){
                $arrchildid = explode(',',$category['arrchildid']);
                $arrchildid = array_diff($arrchildid, $mungjang_category_id);
                #补上自己的id
                array_unshift($arrchildid, $category['catid']);
                $category['arrchildid'] =  implode(',', $arrchildid);
        }
        unset($category);

        #今日开始时间
        $mungjang_time_t = strtotime('00:00');
        #昨日开始时间
        $mungjang_time_y = $mungjang_time_t - 86400;
        #记录未萌分类
        $mungjang_cat = array();
        foreach($mungjang_category as $category){
                $mungjang_file = __DIR__ . '/mungjang_file_'.$category['catid'].'.txt';
                #分类萌章时间点
                $mungjang_time = strtotime($category['mungjangtime']);
                //if(time() >= $mungjang_time and time() < ($mungjang_time +100)){
                if(time() >= $mungjang_time){
                        $mungjang_do = FALSE;
                        if (! file_exists($mungjang_file)) {
                                $mungjang_do = TRUE;
                        }else{
                                $mungjang_str = file_get_contents($mungjang_file);
                                if (intval($mungjang_str) < $mungjang_time_t ) {
                                        $mungjang_do = TRUE;
                                }
                        }
                        if($mungjang_do){
                                file_put_contents($mungjang_file,strval(time()));
                                file_put_contents(__DIR__ . '/mungjang.log',date('c').' moduleid='.$category['moduleid'].' catid='.$category['catid']." run\r\n",FILE_APPEND);
                                $mungjang_cat[$category['catid']] = $category;
                        }
                }
               
        }

        if(! empty($mungjang_cat)){

                //排除强制不萌的子分类
                $result = $db->query("SELECT `catid`,`mungjangtime`,`moduleid`,`arrchildid` FROM `{$DT_PRE}category` WHERE `mungjangtime`='-'");
                #重新初始化 $mungjang_category
                $mungjang_category = array();
                while($r = $db->fetch_array($result)) {
                        $mungjang_category[$r['catid']] = $r;
                }

                if(! empty($mungjang_category)){
                        #要排除的分类不为空

                        #找出所有要排除的分类与子分类
                        $mungjang_category_cat = array();
                        foreach($mungjang_category as $category){
                                $arrchildid = explode(',',$category['arrchildid']);
                                $mungjang_category_cat = array_merge($mungjang_category_cat, $arrchildid);
                        }
                        $mungjang_category_cat = array_unique($mungjang_category_cat);

                        #排除
                        foreach($mungjang_cat as &$category){
                                $arrchildid = explode(',',$category['arrchildid']);
                                $arrchildid = array_diff($arrchildid, $mungjang_category_cat);
                                $category['arrchildid'] = implode(',', $arrchildid);
                        }
                        unset($category);
                }

                $mungjang_title_y = date('n',$mungjang_time_y).'月'.date('j',$mungjang_time_y).'日';
                $mungjang_title_t = date('n',$mungjang_time_t).'月'.date('j',$mungjang_time_t).'日';

                foreach($mungjang_cat as $category){
                        if($category['arrchildid'] != ''){

                                #寻旧章
                                $sql_0 = "SELECT * FROM `{$DT_PRE}article_{$category['moduleid']}` WHERE `status`=3 and `addtime`>{$mungjang_time_y} and `catid` in ({$category['arrchildid']})";
                                $sql = $sql_0 . " AND `title` LIKE '%{$mungjang_title_y}%'";
                                $result = $db->query($sql);
                                $mungjang_article_y = array();
                                while($r = $db->fetch_array($result)) {
                                        $r['title'] = str_replace($mungjang_title_y, $mungjang_title_t, $r['title']);
                                        $mungjang_article_y[] = $r;
                                }

                                $sql = $sql_0 . " AND `title` LIKE '%{$mungjang_title_t}%'";
                                $result = $db->query($sql);
                                $mungjang_article_title = array();
                                while($r = $db->fetch_array($result)) {
                                        $mungjang_article_title[] = $r['title'];
                                }

                                #剔今章
                                $mungjang_article = array();
                                foreach($mungjang_article_y as $article){
                                        if(! in_array($article['title'], $mungjang_article_title)){
                                                $article['keyword'] = str_replace($mungjang_title_y, $mungjang_title_t, $article['keyword']);
                                                $article['addtime'] = '';
                                                $article['edittime'] = '';
                                                $article['editor'] = '';
                                                $article['ip'] = '127.0.0.1';
                                                $article['hits'] = '1';
                                                $mungjang_article[$article['itemid']] = $article;
                                        }
                                }

                                if(! empty($mungjang_article)){
                                        $mungjang_article_id = array_keys($mungjang_article);
                                        $mungjang_article_id = implode(',', $mungjang_article_id);

                                        #取出内容
                                        $sql = "SELECT * FROM `{$DT_PRE}article_data_{$category['moduleid']}` WHERE `itemid` IN ({$mungjang_article_id})";
                                        $result = $db->query($sql);
                                        $mungjang_article_data = array();
                                        while($r = $db->fetch_array($result)) {
                                                $mungjang_article_data[$r['itemid']] = $r;
                                        }

                                        #执行补充到数据库
                                        foreach($mungjang_article as $itemid => $article){
                                                unset($article['itemid']);

                                                $mungjang_sql_k = '';
                                                $mungjang_sql_v = '';
                                                foreach ($article as $key =>$value) {
                                                        if ($value != '') {
                                                                $mungjang_sql_k .= '`' . mysql_real_escape_string($key) . '`' .',';
                                                                $mungjang_sql_v .= '\'' . mysql_real_escape_string($value) . '\'' .',';
                                                        }
                                                }

                                                $mungjang_sql_k .= '`addtime`,`edittime`';
                                                $mungjang_sql_v .= strval(time()) . ',' . strval(time());

                                                #添加报价
//*
                                                $sql_a = "INSERT INTO `{$DT_PRE}article_{$category['moduleid']}` ({$mungjang_sql_k}) VALUES ({$mungjang_sql_v})";
                                                $db->query($sql_a);
                                                file_put_contents(__DIR__ . '/mungjang.log',$sql_a . "\r\n",FILE_APPEND);

                                                $mungjang_itemid = $db->insert_id();
                                                #调试用
                                                //$mungjang_itemid = '新id';

                                                $sql_b = "UPDATE `{$DT_PRE}article_{$category['moduleid']}` SET `linkurl`='show-htm-itemid-{$mungjang_itemid}.html' WHERE `itemid`={$mungjang_itemid}";
                                                $db->query($sql_b);
                                                file_put_contents(__DIR__ . '/mungjang.log',$sql_b . "\r\n",FILE_APPEND);

                                                $mungjang_content = '\'' . mysql_real_escape_string($mungjang_article_data[$itemid]['content']) . '\'' ;
                                                $sql_c = "INSERT INTO `{$DT_PRE}article_data_{$category['moduleid']}` (`itemid`,`content`) VALUES ({$mungjang_itemid},{$mungjang_content})";
                                                $db->query($sql_c);
                                                file_put_contents(__DIR__ . '/mungjang.log',$sql_c . "\r\n",FILE_APPEND);
//*/

                                        }

                                }

                        }

                }

        }

}

//}
/* 每天固定自补价格文 完结 */


注意 mysql 与 mysqli 不兼容的地方。
回复

使用道具 举报

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
 楼主| 发表于 2018-9-18 17:43:15 | 显示全部楼层
给带日期的 title 加上年份

if(in_array($moduleid, array(24,25))){
        #标题里有日期
        if(preg_match("/\d{1,2}月\d{1,2}日/i",$seo_title)){
                if(preg_match("/\d{4}年/i",$seo_title)){
                        echo $seo_title;
                }else if(preg_match("/(\d{2}年)/i",$seo_title)){
                        echo preg_replace("/(\d{2}年)/i",'20${1}',$seo_title);
                }else if(! preg_match("/年/i",$seo_title)){
                        $item_year =  date('Y',$addtime) . '年';
                        echo preg_replace("/(\d{1,2}月\d{1,2}日)/i",$item_year.'${1}',$seo_title);
                }
        }else{
                echo $seo_title;
        }
}
回复

使用道具 举报

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
 楼主| 发表于 2018-9-29 17:26:16 | 显示全部楼层
省市县三级地区文件 /file/setting/area.sql
地区工具.zip (205.41 KB, 下载次数: 111)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人论坛

GMT+8, 2026-2-20 10:11 , Processed in 0.063828 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表