1.使用DEDE自带的一个工具,生成一个表单,通过该表单,可以提交你按照什么条件来检索内容.
2.后台->核心->内容模板管理->自定义搜索 , 这里你可以选择自己需要的条件,然后就可以创建一个表单了, 该表单提交后,会把结果通过 自定义搜索结果页模板 显示内容,默认的模板文件叫 advancedsearch.htm
3. 先测试下,把dede自带的模板文件advancedsearch.htm拷贝到 templets/default / 下即可.
需求: 把检索结果页面,换成a67 提供的检索结果页面. 通用列表页.html, 并完成分页效果.
1. 把通用列表页.html 的内容复制拷贝到 advancesearch.htm
2. 修改 advancesearch.htm 的相关设置,网页编码,引入资源,图片的路径. 可以参考index.htm 模板内容
1.把默认的模板文件和检索的响应文件,做成自己.
现在我们编写自己的 mysearch.php ,了解一下 dede 是怎样把结果给你查询并显示.
步骤:
1.显示提示信息的文字.
2.对导航的样式进行二次修改.
我们为了不去修改 DataListCp源码, 可以使用面向对象的继承,然后重写一个方法.
在mysearch.php
class MyDataListCP extends DataListCP{
function GetPageList(){
}
}
这里有一个知识点补充
有时候,你们会看到类似这样的用法,就直接把一个变量来使用,而没有 $_GET[‘名字’];
extract();该函数可以把数组数据导出到当前符号表,这样就可以直接通过 $索引名 来访问
如何在检索页面 mysearch.htm 中显示我们的栏目列表
思路:传统的方法,就是引入 head.htm 文件.
{dede:include } 不好使用.
正确思路
因为 mysearch.html 是在 mysearch.php 引入 , 则我们可以在 mysearch.php文件中获取到栏目信息 dede_arctype 获取信息.
在mysearch.php 中加入了代码:
注意:这段代码,必须放在 $dlist->Display() 之前执行
在mysearch.hml 中代码如何取出
这里有话说: <?php echo GetOneTypeUrlA($type);?> 可以得到列表页的url地址,但是要求$type是该栏目dede_arctype 表中取出的完整信息.
另外一种写法:
需求: 在搜索时,带上 typeid,area , year 这三个参数值
思路:
localhost/dedecms/plus/mysearch.php?typeid=2&area=大陆&year=2010
我们对mysearch.php 进行开发.
增加如下代码:
1.
2.
思考,如何把 year 和 area 加入,在mysearch.php 增加如下代码:
继续思考: 分页操作会出现什么? 在分页时候,我们会丢失查询条件.
这里处理,要使用 $dlist 有一个函数,该函数可以保存上次提交的信息.
具体的代码如下改进:
显示自己网站的所有分类检索
步骤,先找到位置. 添加如下代码:
完成点击列表页的某个连接,跳转到对应的检索页面
在 list_movie.htm 增加超链接
需求: 完成列表页小星星的评分功能
思考:
1.把评分值,传递给一个函数,让该函数根据 分值,返回一个image的字符串,并显示.
步骤:
前台模板文件:
后台get_stars函数,在extendd.func.php 增加 get_stars函数
需求: 当我们点击检索结果的某个电影超链接时,如何跳转到对应的内容页
这里,我们来分析.
思路: 是否能够使用{dede:field.arcurl/}
步骤: 对 datalistcp.class.php 做了二次改造
在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(); 的用处.
需求:完成列表页昨天更新功能
思考: 先找到对应的模板页. list_movie.htm,在找到关键代码.
这里,我们的代码是
需求: 对列表页评分高低排序显示
思路: 模板文件是list_movie.htm ,然后代码
并且对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.
然后我们创建采集点,先配置基本信息
点击
保存并下一步
并设置内容获取规则!
真的采集
到采集点管理,点击采集即可
然后倒入到数据库中即可
看看如何采集标题
如何自定义PHP程序来完成数据采集
知识点: 1. HTTP协议 2. 如何同PHP代码来发送HTTP请求和接收HTTP响应(HTML文本) 3. 如何对返回的HTML文本做正则处理 4. 如何保存数据.
补充HTTP流程(时序图)
最后的代码是:
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 自己就给我们提供非常强大的预定义的模块.(会员管理、会员中心…),如果你想看看还有哪些.
如果没有你需要的模块,则需要开发.
提示: 在工作,尽量找一个成型的功能模块,看看别人如何开发. 我们这里准 参考问答模块来,开发我们自己的影评模块
熟悉一下dede的自带的轻量级的MVC框架.[听点 : dede MVC ,MVC本身.]
MVC核心思想( 把数据的输入,数据处理和数据的显示分离,,减少程序的耦合性.)
原理示意图:
TP/ZF/yii/cake… MVC
学习一下DEDE的 mvc 框架,参考 ask 模块的代码和结构.
2.写代码
在empmanage 目录创建 index.php 文件, 该文件就是入口文件.
整个代码现在完成,参考的代码是 empmange文件夹所有内容.
正式开发我们的影评自定义模块
先设计数据表(设计表的依据[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 的详细信息获取,并显示
步骤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: 完成点击内容页的 发布新评论,就跳转到对应的发布评论页面
步骤8 : 将会员管理系统和a67网站整合到以前
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条评论
这里有几点注意:
? 如何在一个很多文件中,迅速的定位某个函数.
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 '没有传递数据'}