dedecms笔记二

需求:如何自定义搜索和分页
dedecms笔记二_第1张图片
步骤:
1.使用DEDE自带的一个工具,生成一个表单,通过该表单,可以提交你按照什么条件来检索内容.
2.后台->核心->内容模板管理->自定义搜索 , 这里你可以选择自己需要的条件,然后就可以创建一个表单了, 该表单提交后,会把结果通过 自定义搜索结果页模板 显示内容,默认的模板文件叫 advancedsearch.htm
3. 先测试下,把dede自带的模板文件advancedsearch.htm拷贝到 templets/default / 下即可.
4.使用即可

课后练习题:
需求: 把检索结果页面,换成a67 提供的检索结果页面. 通用列表页.html, 并完成分页效果.

步骤:
1. 把通用列表页.html 的内容复制拷贝到 advancesearch.htm
2. 修改 advancesearch.htm  的相关设置,网页编码,引入资源,图片的路径.  可以参考index.htm 模板内容

1.把默认的模板文件和检索的响应文件,做成自己.
把默认提交的 页面 advancedsearch.php  换成 mysearch.php  ,先在 plus/ 创建 mysearch.php
把默认的检索的模板文件advancesearch.htm,换成 mysearch.htm

现在我们编写自己的 mysearch.php ,了解一下 dede 是怎样把结果给你查询并显示.
mysearch.php 核心代码:
dedecms笔记二_第2张图片
现在我们要在 mysearch.htm 文件中取出 mysearch.php 查询的内容,核心代码是:
dedecms笔记二_第3张图片
针对{dede:datalist} 标签特殊说明
1.可以再{dede:datalist} 中嵌入某些{dede}标签
2.{dede:global.autoindex/} 无效

需求做出我们自己的分页导航

这里,我们需要使用另外一个标签,该标签专门用于分页导航 {dede:pagelist/}
在 mysearch.htm 加入该标签

在适当的位置加入该标签, 在实际开发中,我们往往需要对分页导航条,进行自定义。
韩顺平织梦二次开发学习笔记(二) - 不高的山 - 不高的山的web笔迹
步骤:
1.显示提示信息的文字.
2.对导航的样式进行二次修改.
我们为了不去修改 DataListCp源码, 可以使用面向对象的继承,然后重写一个方法.
在mysearch.php
class MyDataListCP extends DataListCP{
function GetPageList(){
dedecms笔记二_第4张图片
 }


这里有一个知识点补充
有时候,你们会看到类似这样的用法,就直接把一个变量来使用,而没有 $_GET[‘名字’];
extract();该函数可以把数组数据导出到当前符号表,这样就可以直接通过 $索引名 来访问
韩顺平织梦二次开发学习笔记(二) - 不高的山 - 不高的山的web笔迹
 
如何在检索页面 mysearch.htm 中显示我们的栏目列表

思路:传统的方法,就是引入 head.htm 文件.
{dede:include } 不好使用.

正确思路
因为 mysearch.html 是在 mysearch.php 引入 , 则我们可以在 mysearch.php文件中获取到栏目信息 dede_arctype 获取信息.

在mysearch.php 中加入了代码:
dedecms笔记二_第5张图片
注意:这段代码,必须放在 $dlist->Display() 之前执行

在mysearch.hml 中代码如何取出
dedecms笔记二_第6张图片

这里有话说: <?php echo GetOneTypeUrlA($type);?> 可以得到列表页的url地址,但是要求$type是该栏目dede_arctype 表中取出的完整信息.

另外一种写法:

dedecms笔记二_第7张图片

需求: 在搜索时,带上 typeid,area , year 这三个参数值
dedecms笔记二_第8张图片
思路:
localhost/dedecms/plus/mysearch.php?typeid=2&area=大陆&year=2010
我们对mysearch.php 进行开发.

增加如下代码:
1.
dedecms笔记二_第9张图片
2.
dedecms笔记二_第10张图片

思考,如何把 year area 加入,在mysearch.php 增加如下代码:

dedecms笔记二_第11张图片
继续思考: 分页操作会出现什么? 在分页时候,我们会丢失查询条件.
这里处理,要使用 $dlist 有一个函数,该函数可以保存上次提交的信息.
具体的代码如下改进:
dedecms笔记二_第12张图片
显示自己网站的所有分类检索
步骤,先找到位置. 添加如下代码:
dedecms笔记二_第13张图片

完成点击列表页的某个连接,跳转到对应的检索页面

dedecms笔记二_第14张图片
在 list_movie.htm 增加超链接
韩顺平织梦二次开发学习笔记(二) - 不高的山 - 不高的山的web笔迹
 
需求: 完成列表页小星星的评分功能

思考:
1.把评分值,传递给一个函数,让该函数根据 分值,返回一个image的字符串,并显示.
步骤:
前台模板文件:
韩顺平织梦二次开发学习笔记(二) - 不高的山 - 不高的山的web笔迹
 后台get_stars函数,在extendd.func.php 增加 get_stars函数
dedecms笔记二_第15张图片
 

需求: 当我们点击检索结果的某个电影超链接时,如何跳转到对应的内容页
dedecms笔记二_第16张图片
这里,我们来分析.
思路: 是否能够使用{dede:field.arcurl/}

步骤: 对  datalistcp.class.php 做了二次改造
dedecms笔记二_第17张图片
在mysearch.htm 中增加

<a href="http://zqbgds.blog.163.com/blog/{dede:field.arcurl/}" target="_blank"><img src="http://zqbgds.blog.163.com/blog/{dede:field.litpic/}" /></a>

知识点: dede提供了一堆帮助类. 这些工具类的函数可以直接使用.
现在,我先给大家说说 GetOneArchive(); 的用处.
 

需求:完成列表页昨天更新功能
韩顺平织梦二次开发学习笔记(二) - 不高的山 - 不高的山的web笔迹
思考: 先找到对应的模板页. list_movie.htm,在找到关键代码.
这里,我们的代码是
dedecms笔记二_第18张图片

需求: 对列表页评分高低排序显示
dedecms笔记二_第19张图片
思路: 模板文件是list_movie.htm ,然后代码
dedecms笔记二_第20张图片
 
并且对arclist标签源码,修改
else if($orderby == 'pfz') $ordersql = " order by addf.pfz $orderWay";

需求: 如何从外站来采集自己需要的数据


我们从 www.67.com 采集数据
知识点:
1.    了解php 是如何通过Http协议发送请求,抓取数据.(我们先使用工具,再用程序)
2.    正则表达式
使用工具:
步骤:
1.首先找到要抓取的对象(页面 【列表页和内容页】)
列表页地址 http://www.a67.com/list/1/p.2
内容页: http://www.a67.com/movie/232439
2.在dede后台创建采集点
后台->采集->采集节点管理->创建采集点
在 dede/manage/templets/co_add_step0.htm 做修改
$dsql->SetQuery("Select id,typename From `#@__channeltype` where id in(1,2,18) order by id asc ");
3. 然后我们创建采集点,先配置基本信息
dedecms笔记二_第21张图片
点击 保存并下一步


并设置内容获取规则!

dedecms笔记二_第22张图片
 

真的采集
到采集点管理,点击采集即可
然后倒入到数据库中即可


看看如何采集标题
如何自定义PHP程序来完成数据采集
知识点: 1. HTTP协议 2. 如何同PHP代码来发送HTTP请求和接收HTTP响应(HTML文本) 3. 如何对返回的HTML文本做正则处理 4. 如何保存数据.
补充HTTP流程(时序图)

dedecms笔记二_第23张图片
最后的代码是:
Mycatch.php
<?php
    set_time_limit (100);
    //1. 连接到 www.a67.com
    $fp=fsockopen("www.a67.com",80,$errno,$errstr,30);
    if(!$fp){      
        die("连接失败 $errno - $errstr  ");
    }
    //2.构建HTTP协议串发送给www.a67.com, 去抓取 http://www.a67.com/movie/229813的
    //内容
    $http_str="GET /list/1/p.2 HTTP/1.1\r\n";
    $http_str.="HOST: www.a67.com\r\n";
    $http_str.="Connection: close\r\n\r\n";
    //发送HTTP请求信息
    fwrite($fp,$http_str,strlen($http_str));  
    $res_str='';
    while(!feof($fp)){
        $res_str.=fread($fp,1024);
    }
    fclose($fp);
    //file_put_contents("d:/my.log",$res_str);
    //从$res_str取出图片地址,然后再从新抓取图片
    $reg='/<img alt="[^"]*" title="[^"]*" src="http://zqbgds.blog.163.com/blog/([^"]*)"/';
    preg_match_all($reg,$res_str,$arr);
/*    echo "<pre>";
    var_dump($arr[1]);
    echo "</pre>";*/
    //遍历$arr[1]
    foreach($arr[1] as $val){     
        $fp=fsockopen('img.a67.com',80);
        //去掉 前面的 http://img.a67.com
        $part_path=str_replace('http://img.a67.com/','',$val);  
        $fileinfo=pathinfo($part_path);
        $http_str="GET $part_path  HTTP/1.1\r\n";
        $http_str.="HOST: img.a67.com\r\n";
        $http_str.="Connection: close\r\n\r\n";
        fwrite($fp,$http_str,strlen($http_str));      
        $res_str='';
        while(!feof($fp)){
            $res_str.=fread($fp,1024);
        }
        fclose($fp);
    //    header("content-type: image/jpeg");     
        $str_pos=strpos($res_str,"\r\n\r\n");
        $img_str=substr($res_str,$str_pos+12);     
        //保存到文件中
        $filename=$fileinfo['basename'];
        file_put_contents("./myimages/$filename",$img_str);
    //    echo $img_str;
    //    die();      
        //echo $part_path."<br/>";
    }
    die("ok");
//    echo "<pre>";
//    var_dump($arr);
//    echo "</pre>";
?>

需求:开发电影评论模块功能.

思路:
1.要设计新的表.
2.我们需要使用dede支持的开发自定义模块功能. 言外之意,dede 自己就给我们提供非常强大的预定义的模块.(会员管理、会员中心…),如果你想看看还有哪些.
dedecms笔记二_第24张图片
如果没有你需要的模块,则需要开发.
提示: 在工作,尽量找一个成型的功能模块,看看别人如何开发. 我们这里准 参考问答模块来,开发我们自己的影评模块

熟悉一下dede的自带的轻量级的MVC框架.[听点 : dede MVC ,MVC本身.]
MVC核心思想( 把数据的输入,数据处理和数据的显示分离,,减少程序的耦合性.)
原理示意图:
dedecms笔记二_第25张图片
TP/ZF/yii/cake… MVC
 
学习一下DEDE的 mvc 框架,参考 ask 模块的代码和结构.
我们来开发一个非常简单的 雇员管理系统(完成 crud 操作)
步骤:
1.在 dedecms的主目录下创建了一个 empmange的模块
dedecms笔记二_第26张图片
2.写代码
在empmanage 目录创建 index.php 文件, 该文件就是入口文件.
整个代码现在完成,参考的代码是 empmange文件夹所有内容.
韩顺平织梦二次开发学习笔记(二) - 不高的山 - 不高的山的web笔迹
 
正式开发我们的影评自定义模块

先设计数据表(设计表的依据[1.根据需求文档, 2. 参考界面])

评论表 comments
create table a67_comments (
id int unsigned primary key auto_increment, /*主键*/
userid mediumint(8) unsigned not null default 0,   /*因为userid 和 dede_member 表  mid是外键关系*/
title varchar(128) not null default '', /*标题*/
content longtext not null default '',
addtime int unsigned not null default 0,
movieid mediumint(8) unsigned not null default 0  /*这字段是评论的电影id,和dede_archives 构成关系*/
)type=MyISAM default charset=utf8

步骤1. 先把模板文件拷贝到 templates/default目录下.
完成任务是 当我在 浏览器 http://localhost/dedecms/pinglun/index.php?c=pinglun&a=listpl&aid=13

步骤2: 开发控制器 control/pinglun.php

步骤3: 开发 model/mpinglun.php

步骤4:处理 templates/default/list_pl.html

步骤5: 首先我们在list_pl.html 的详细信息获取,并显示
dedecms笔记二_第27张图片
步骤6 : 完成发布评论
用户可以针对某个电影发表评论.
首先在list_pl.htm 对表单进行修改
在DEDE系统中,因为自带了强大的会员系统,因此,对于每个模块,入口的文件index.php,可以通过创建一个用户即可.
require_once(DEDEINC."/memberlogin.class.php");
$cfg_ml =new MemberLogin(); //如果用户登录过,dede会把该用户的信息放入到session中.
New MemberLogin()对象就把登录用户信息保存

Dede给我们提供了一个 函数 ShowMsg(); //在 common.fun.php
/**
 *  短消息函数,可以在某个动作处理后友好的提示信息
 *
 * @param     string  $msg      消息提示信息
 * @param     string  $gourl    跳转地址
 * @param     int     $onlymsg  仅显示信息
 * @param     int     $limittime  限制时间,安装毫秒
 * @return    void
 */
function ShowMsg($msg, $gourl, $onlymsg=0, $limittime=0)

这个函数的主要应用两种情况.
1.显示信息然后返回原来的页面
2.显示信息到另一个页面(如果是外网 http://xxx 如果就是本网站的页面,则使用相对路径. )

如果 $gourl, 是 -1 则表示上一个页面.
如果 $onlymsg =0表示跳转, 如果是 1 或者其它值. 表示不跳转
$limittime=0 表示停留的时间.

步骤7: 完成点击内容页的 发布新评论,就跳转到对应的发布评论页面
dedecms笔记二_第28张图片

dedecms笔记二_第29张图片
 
步骤8 : 将会员管理系统和a67网站整合到以前
韩顺平织梦二次开发学习笔记(二) - 不高的山 - 不高的山的web笔迹
1.把这个网站的面包屑导航条作出,
<div class="logn">当前位置:<?php echo $ainfos->Fields['position']; ?> <?php echo $ainfos->Fields['title']; ?> > 评论</div>
2.如果用户登录过,则提示可以进入到会员中,否则,提示他登录.

Dede 的ask 模块都有 header.htm, 用于导航.
具体代码:
<div class="txt">
    <ul>
        <li>
         <?php if($cfg_ml->M_ID){?>
         <b><?php echo $cfg_ml->M_LoginID;?></b>,您好 欢迎来到问答中心 [<a href="http://zqbgds.blog.163.com/blog/../member" title="会员中心">会员中心</a>] <a href="http://zqbgds.blog.163.com/blog/../member/index_do.php?fmdo=login&dopost=exit">退出</a>
    <?php }else{ ?>
      您好,请您先 <a href="http://zqbgds.blog.163.com/blog/<?php echo $cfg_ask_basehost;?>/member/login.php?gourl=<?php echo $cfg_ask_curl;?>">登陆</a> 或者 <a href="http://zqbgds.blog.163.com/blog/../member/reg_new.php">注册</a>
    <?php }?>
         </li>
      </ul>
</div>
这样处理后,可以登录,页可以进入到会员中心.

步骤 9: 最后一个需求,就是如何对所有的评论,分页显示
思路: 前面我们学习过检索内容,所以思路大致一样.
在 pinglun.php 这个控制中去,使用 DataListCP这个类,带检索并可以分页.

步骤10: 使用ajax无刷新的取最新的 5条评论
dedecms笔记二_第30张图片
这里有几点注意:
? 如何在一个很多文件中,迅速的定位某个函数.
1.    source insight
2.    php->zend studio /netbean / easyeclipse [ide] [mis]
在zend studio 下创建一个空的PHP 工程,然后把dede 的项目源码拷贝到空项目即可使用. 然后可以通过 工具,来选中一个函数,查看该函数的声明.

? 使用phpmyadmin来查看
http://localhost/ phpmyadmin

? 当我们使用dede 或者是以后工作是,可以先使用 httpwatch/firebug 找到请求的PHP 文件,然后,通过 die(“ 输出”),或者使用 file_put_contents()来测试

? isset和  empty的区别是什么
empty 判断一个变量是否为“空”,isset 判断一个变量是否已经设置。
$name=0;
$name='';
$name=null;
$name="0";
$name;
if(empty($name)){
    echo "ok"; //上面五种写法empty($name)都是 true
}
isset 函数是用于检测这个变量是否设置过,在下面两种情况下会认为
isset 为假
①$id; 没有给任何值
②或者就是根本没有定义.
因此我们建议在 判断某个表单是否提交有数据(可能是0 '' ),使用
isset来判断
if(isset($_GET/$_POST['变量']){
echo $_GET['变量']
}else{ echo '没有传递数据'}

你可能感兴趣的:(dedecms)