知识点一:
{dede:arclist channelid="18" addfields="language,pfz" limit="0,5"}
<li class="c[field:global.autoindex/]"><a href="[field:arcurl/]" target="_blank"><img src="[field:litpic/]" alt="[field:title/]" /></a><p>
[field:language/]
</p><b><a href="[field:arcurl/]" target="_blank">
[field:title/]
</a><img src="[field:global name='cfg_templets_skin'/]/images/1.jpg"><em>[field:pfz/]分</em></b></li>
{/dede:arclist}
1.标签arclist:是一个dede自带的标签,能够显示归档表的各个记录,以列表的形式显示出来的,但是这个只能显示归档表的字段是不能显示附加表的字段
如果需要显示附加表的字段就需要使用额外的标记即增加附加表的字段标记:addfields="language,pfz"
arclist存在很多的标签:
显示归档表的字段的格式是[field:字段/]其中[field:arcurl/]是连接到详情页面的超链接,这个字段是从dede后台的左边的模板的标签的例子可以看出
{dede:arclist flag='h' typeid='' row='' col='' titlelen='' infolen=''
imgwidth='' imgheight='' listtype='' orderby='' keyword='' limit='0,1'}
<a href='[field:arcurl/]'>[field:title/]</a>
{/dede:arclist}
2.标签2,include:包含文件文件标签可以将公共的部分,如头部与尾部包含进来:
格式如下:{dede:include filename='模板文件.htm'/}
例子:{dede:include filename='head.htm'/}
3.标签3,栏目标签channel可以获取栏目列表
例子:
<!--select列表from dede arctype-->
<!--大家注意typeurl并不是dede_arctype表的字段,他是在程序中计算得到的!-->
{dede:channel orderby="id" type="top" row="8"}
<li><a href="[field:typeurl/]" title="手机电影" target="_self">
[field:typename/]
</a></li>
{/dede:channel}
我们可以猜得到这个是查找arctype表得到的列表,但是点击进入栏目的详情页面使用字段[field:typeurl/]这个会发现跟数据库中存储的字段是有差别的,所以是这个值是在程序中现算出来的
但是是怎么知道的这个字段标签的呢?看官方文档,可以看到它用的位置是在超链接里面,所以是根据位置可以判断用法如下:
{dede:channel type='top' row='8' currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a> </li>"}
<li><a href='[field:typelink/]'>[field:typename/]</a> </li>
{/dede:channel}
然后再结合数据库可以猜想出这个标签是结合数据库中的arctype这个标签:然后观看这个标签的源码就可以发现其内部实现:D:webdedecmsinclude aglibchannel.lib.php
所以学习的方法就是:根据官方文档其用法,猜其查的数据库中的哪个表,然后追踪源码验证自己的想法;
如上官方的例子可以看出[field:arcurl/]是放在超链接里面所以可以猜测这个就是连接到详情页的超链接
4.由于dede标签是不能够嵌套的,所以在dede:arclist标签中,如果需要使用全局变量则需要将全局变量的dede标签转化成字段形式避免嵌套
如:[field:global name='cfg_templets_skin'/]可以看到dede标签转化成字段,其中global说明是全局的变量!
5.dede还存在自动增长的全局变量,不过用法跟一般的全局变量有区别,增加了一个点如果[field:global.autoindex/]表示列表自动增长
知识点二:全局变量存在于文件include/common.inc.php
例子:dedecms系统中自带文件common.inc.php中存在$cfg_soft_lang = 'utf-8';这里就设置了全局变量
<meta http-equiv="Content-Type" content="text/html; charset={dede:global.cfg_soft_lang/}" />在网页中设置该网页面的字符编码还是应用dede标签
语法:{dede:global.全局变量/},所以还可以在框架对应的文件中自定义全局变量!
6.面包屑标签:当前位置:{dede:field.position/}{dede:field.title/}
7.内容标签:如果跳转到内容页之后就可以直接用对应的dede标签进行显示详情页面的附加表的字段:如下:
{dede:field.title/},{dede:field.language/},{dede:field.area/},{dede:field.year/},{dede:field.director/},{dede:field.actors/},{dede:field.introduce/}
8.利用ajax对电影进行评分:
步骤:1.鼠标移动选中对应星星,2.鼠标点击就发起ajax发送数据到服务器
前端代码:
<script type="text/javascript">
//给所有的小星星绑定一个mouseover
//1.使用jquery如何去选中id下的所有图片
$("#rank_pic img").mouseover(function(){
//把当前选中的星星变成黄色
str=$(this).attr('src');
str=str.replace("rank_3.gif","rank_1.gif");
str=str.replace("rank_4.gif","rank_2.gif");
$(this).attr("src",str);
//下面的this表示小手指着的那个小星星
$(this).prevAll().each(function(){
//替换这个下面的this表示遍历的时候的小星星
//替换这个星星的src
str=$(this).attr('src');
//js中如何替换的src重新放回到
str=str.replace("rank_3.gif","rank_1.gif");
str=str.replace("rank_4.gif","rank_2.gif");
$(this).attr("src",str);
});
//替换后面的星星,黄色-》灰色
$(this).nextAll().each(function(){
//替换这个下面的this表示遍历的时候的小星星
//替换这个星星的src
str=$(this).attr('src');
//js中如何替换的src重新放回到
str=str.replace("rank_1.gif","rank_3.gif");
str=str.replace("rank_2.gif","rank_4.gif");
$(this).attr("src",str);
});
});
//2.给每个星星绑定click事件
$("#rank_pic img").click(function(){
//算出评分值
var pfz=($(this).prevAll().length+1)/2;
//获取当前内容的id在内容页可以获得内容页的主表和附加表的字段!
var id={dede:field.aid/};
//使用ajax技术
$.ajax({
type:"get",
url:"{dede:field name='phpurl'/}/pinfen.php?type=pinfen&id="+id+"&pfz="+pfz,
success:function(msg){
//alert("收到结果是"+msg);
$("#rank").html(msg);
}
});
});
</script>
思路:两个星星表示一分,所以需要用(length+1)/2
第一个方法:鼠标滑过将前面的星星全部设置为黄色星星,两种情况一种是左半边星星替换,一种是右半边的星星替换,然后将后面的星星也替换成灰色星星,不设置数据交互
第二个方法:鼠标点击提交数据到服务器,/plus/pinfen.php这里使用了全局变量{dede:field name='phpurl'}
其中phpurl是根据副本之前的模板的源码知道它是指向插件的目录,所以看源码是非常重要的,包括在公司里面一些标签是公司内部定义的:
<small>点击:</small>
<script src="{dede:field name='phpurl'/}/count.php?view=yes&aid={dede:field name='id'/}&mid={dede:field name='mid'/}" type='text/javascript' language="javascript"></script>
次</div>
可以看到如果我们遇到类似的问题就可以看之前公司的实现类似功能的源码!
前端代码:
<li>用户评分:<font id="rank"><script src="{dede:field name='phpurl'/}/pinfen.php?type=getfen&id={dede:field name='id'/}" type='text/javascript' language="javascript"></script></font> 分 (共有<font id="rank_num">...</font>人评分)</li>
可以动态的获取数据库的评分;
服务器代码:
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
//这里去完成评分任务
$pfz=$_GET['pfz'];
$aid=$_GET['id'];
if($type=="getfen"){
$sql="SELECT pfz from dede_addonmovie where aid=$id";
$row=$dsql->GetOne($sql);
//如果获取到了分数就可以将代码传到前台并且写入html文件
if(is_array($row))
{
echo "document.write('".$row['pfz']."');
";
}
//下面是对电影进行评分,就是update操作
}else if($type=="pinfen"){
$sql="UPDATE dede_addonmovie set pfz=$pfz where aid=$id";
$dsql->ExecuteNoneQuery($sql);
//更新成功后,我们需要计算这个评分值我简化为以最后一个评分为准
$sql="SELECT pfz from dede_addonmovie where aid=$id";
//取出数据库中的值,这里在工作时,需要看源码或者手册,
$row=$dsql->GetOne($sql);
//这里通过$row[0]
//返回结果的原因是前台的ajax通过获取数据通过jq将分数更改成返回的结果,这样评分就会产生联动的效果!
echo $pfz;
}
解读服务器源码:其中引入common.inc.php文件可以使用全局变量,$dsql就是一个全局性的对象,然后可以执行sql语句,之后利用getOne就可以获取结果,
获取分数的时候需要使用插件里面的php文件动态获取而不是使用dede标签的原因:
因为dede是全站静态化的,如果数据库评分即使更新数据,再次刷新页面是不会变化的,因为需要在后台重新生成一下,但是如果是通过src动态获取的就不一样了
因为刷新的时候就会查询数据库,将评分显示在界面上,如果不这样做的话,就会出现点击评分就会发生变化,但是再次刷新页面,这样分数会变成原来的样子,
根据之前的模板文件点击率是将数据发送到插件count.php我们来看下这个文件的规律,只有把这个文件研究清楚了就可以模拟了!可以看到查询操作是用GetOne方法
而更新操作是用ExecuteNoneQuery,所以这个归宿到数据库Curd都是不一样的,所以这个都是层次之间的映射!
9.下载地址由于是以一个非常多个信息存储在数据库的一个字段中,所以需要考虑一些专门的函数来处理这个下载地址,那么就需要自己在文件include/extend.func.php写扩展函数:
然后根据扩展函数处理dede标签得到的字段:{dede:field.download function='format(@me)'/}扩展函数如下:
/*
返回下载地址HTML的函数
*/
function format($str1){
//其实已经拿到了,我们使用var_dump看到了
//知识点1,字符串换行是有一个符号,windows下换行符是"
",linux下面是
//首先统一一下换行符号;
$str1=str_replace("
","
",$str1);
$arr1=explode("
",$str1);
//遍历$arr1
//$val1就表示一行数据(一个完整的下载地址)索引记录
//arr3是一个三维数组,arr3[n][]是一个二维数组传值传二位,每一行下载记录是一次传入!
$arr3=array();
foreach($arr1 as $k1=>$val1){
//继续explode
$arr2=explode("|",$val1);
//如果第四次和第一次都是3gp那么$arr3[3gp][]=二维数组
//所以这样无论是穿插不同类型的格式输入还是任意增加不同类型都不会影响
//因为三维的第一个分类都是按照每个记录的第一个字段进行填充的,所以
//只会根据这个类型的多少来进行记录,是将每条记录看作是一个单元所以
//重复再多的单元也不会出问题的!$arr2[0]就是格式类型,$arr2[1]就是标题,$arr2[2]是分辨率,$arr2[3]:是下载地址!
$arr3[$arr2[0]][]=array(
'title'=>$arr2[1],
'fbl'=>$arr2[2],
'url'=>$arr2[3]
);
}
$res="";
global $ac;//dede提供了一个全局的Archives类对象实例
global $cfg_templets_skin;
//该对象实例可以取出
//var_dump($arr3);
//exit();
//下一步的工作是,通过$arr3来生成我们的HTML码
//$val3相当于是一个电影类型的所有下载地址
foreach($arr3 as $k3=>$val3){
$res.=
<<<HTMLSTR
<H2 id="downloadurls">{$ac->Fields['title']}{$k3}下载地址<font class="f1">温馨提示:一键下载功能可一次下载{$k3}格式所有分节电影!</font><span><a href="javascript:;" onclick="return d3gp()"><img src="{$cfg_templets_skin}/images/yijian_3gp.gif" border="0" /></a></span></H2>
HTMLSTR;
$res.="<div class="downurls"><ul>";
foreach($val3 as $k=>$download){
//下面的才是具体的信息
$res.=<<<LISTR
<li><a href="http://www.a67.com/download/26059-0" title="魔侠传之唐吉可德01 3GP下载" target="_blank" rel="nofollow">{$download['title']}</a> (格式:{$k3} / 分辨率:{$download['fbl']})<span><a href="{$download['url']}" target="_blank" rel="nofollow">迅雷高速下载</a></span><span><a href="http://www.a67.com/download/26059-0" target="_blank" rel="nofollow">下载到电脑</a></span></li>
LISTR;
}
}
$res.="</ul></div>";
return $res;
}
10.自定义插件:
可以看到ask插件是以一个单独mvc的模式存在的,分为model和view,control文件夹,所以我们需要模仿ask插件写一个自己定义插件。
<a href="{dede:global.cfg_pl_dir/}/index.php?c=pinglun&a=listpl&aid={dede:field.aid/}"可以看到在模板中是首先在common.inc.php文件中
定义一个全局变量,
//cms系统的评论目录
$cfg_pl_dir = $cfg_cmspath.'/pinglun';然后利用c指定控制器和a指定对应的方法名,然后带上参数aid对
--------------------------------
#include <QtGui/QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLabel *label = new QLabel("Hello, world!");
label->show();
return a.exec();
}