网站

DedeCMS为TAG标签增加描述功能

分类 :织梦dedecms     2019-01-17 人气: 0条评论

TAG标签是一个好东西,Mediawiki更是将标签发挥到极致,自从使用Mediawiki后,我便想将TAG标签增加描述功能,让TAG标签不再是一个文章聚集处,而是类似于分类。

本次提供了两个版本,一个是简洁板,一个是整合了ckeditor的加强版,请自行选择。

一、简洁版修改前的准备工作

该文中用到了将tag改为ID的内容,所以使用前先按我以前写的文章改变链接:

修改后的效果

后台效果


前台效果


修改第一步
找到dede_tagindex数据表新建tagms字段,类型varchar,长度255,允许空值,我用navicat建的

tags_main.php

打开后台/dede/tags_main.php

第一处

大概在27行找到
$dlist->SetParameter("tag", $tag);
下面增加
$dlist->SetParameter("tagms", $tagms);

第二处

大概在49行找到
$query = "UPDATE `dede_tagindex` SET `count`='$count' WHERE id='$tid' ";
 修改为
$query = "UPDATE `dede_tagindex` SET `count`='$count',`tagms`='$tagms' WHERE id='$tid' ";

第三处

大概在147行找到
$query = " INSERT INTO `dede_tagindex`(`tag`,`count`,`total`,`weekcc`,`monthcc`,`weekup`,`monthup`,`addtime`) VALUES('$keyword','0','1','0','0','$timestamp','$timestamp','$timestamp');";
修改为
$query = " INSERT INTO `dede_tagindex`(`tag`,`tagms`,`count`,`total`,`weekcc`,`monthcc`,`weekup`,`monthup`,`addtime`) VALUES('$keyword','$tagms','0','1','0','0','$timestamp','$timestamp','$timestamp');";

tags_main.htm

打开/dede/templets/tags_main.htm

第一步

找到更新的JS

function UpdateOne(tid)
{
location = "tags_main.php?action=update&count="+document.getElementById('count'+tid).value+"&tid="+tid;

增加描述的参数,代码修改为

function UpdateOne(tid)
{
location = "tags_main.php?action=update&count="+document.getElementById('count'+tid).value+"&tagms="+document.getElementById('ms'+tid).value+"&tid="+tid;

第二处

<td width="10%">标签</td>

下面增加

<td width="35%">描述</td>

第三处

<td>
<a href="../tags.php?/<?php echo urlencode($fields['tag']); ?>/" target="_blank">{dede:field.tag /}</a>
</td>

下面增加

<td>
<textarea name="" rows="" cols="" id="ms<?php echo $fields['id']; ?>" ><?php echo $fields['tagms'];?></textarea>
</td>

由于增加了一列,后台其他地方的样式就自行解决了。

前台模板部分调用

位置templets\default中的taglist.htm模板中加入

{dede:sql sql="select * from dede_tagindex where tag=~title~"}[field:tagms/]{/dede:sql}


至此便可以完美显示了。
如果你觉得上面简洁版的不太适合你,可以看看下面的加强版的是不是适合。

二、再次加强描述功能

如果只用textarea写普通的内容,我认为这在前台显示实在太丑了,所以这次我将ckeditor进行了整合,所以下面的是最新的修改功能,修改完后如下显示
加强版的好处是:能使用一些html功能,这样可进行排版,表格处理等

标签管理列表页

编辑器点开后的样子



在上面图中,除大编辑窗外还有个小编辑窗,这是为了看是否有内容,有内容说明我们编辑过,空的说明没编辑过。如果你感觉太丑,也可以采用个sql语句判断是否为空,用显示汉字的方式提示,另外,大编辑框默认是隐藏状态。

整合ckeditor编辑器
我没有在织梦其它页面整合过,这是第一次进行整合,吃了很多苦头

数据库修改

前面我们将tagms设计成varchar,因为我的网站的标签描述要放大量内容,甚至做成一个介绍单页,所以我们将varchar改成mediumtext

tags_main.htm

ckeditor请在官网下载,我下载的是最新版的ckeditor5
dede/templets中找到上面的文件,并按下面的步骤加入
<script type="text/javascript" src="ckeditor/ckeditor.js"></script>
下方整体代码
因为一部分一部分引入太累,所以直接放入整体代码
 

<div class="bodytitle">
	<div class="bodytitleleft"></div>
	<div class="bodytitletxt" style="padding-left:10px;">Tags标签管理</div>
</div>
<div class="main">

<table width="98%" border="0" cellpadding="1" cellspacing="1" align="center" class="tbtitle" style="background:#CFCFCF;">
    <tr>
      <td height="20" colspan="6" bgcolor="#F0FBBD" background="images/wbg.gif">
      	<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
          <tr>
            <td align="left" style="padding-left:10px;"><strong>TAG维护</strong></td>
                        <form name='form2' action="tags_main.php">
            <td width="40%" align="right">
   	        搜索:
   	          <input type='text' name='tag' size='10' value="<?php echo $tag;?>">
   	        	<input type='submit' name='sb' value='确定' class="np coolbg" />
   	        	&nbsp; </td>
</form>
          </tr>
      </table></td>
    </tr>
    <tr align="center" bgcolor="#FBFCE2" height="26">
      <td width="3%">删</td>
      <td width="15%">标签</td>
      <td width="60%">描述</td>
      <td width="5%"><a href="tags_main.php?tag=<?php echo $tag;?>&orderby=total&orderway=<?php echo $neworderway;?>"><u>文档数</u></a></td>
	  <td width="5%"><a href="tags_main.php?tag=<?php echo $tag;?>&orderby=addtime&orderway=<?php echo $neworderway;?>"><u>添加时间</u></a></td>
    <td width="5%">操作</td>
    </tr>
	<form name='form3' action="tags_main.php?action=delete" method="post">
		
{dede:datalist}
<?php
	$fields['addtime'] = GetDateMk($fields['addtime']);
	$fields['tag'] = htmlspecialchars($fields['tag']);
?>
	<tr align="center" bgcolor="#FFFFFF" onMouseMove="javascript:this.bgColor='#FCFDEE';" onMouseOut="javascript:this.bgColor='#FFFFFF';">
		<td height="24">
			<input type="checkbox" name="ids[]" value="<?php echo $fields['id']; ?>" class='np' />
		</td>
		<td>
			<a href="../tags.php?/<?php echo $fields['id']; ?>/" target="_blank">{dede:field.tag /}</a>
		</td>
		<td>
			
			<!-- 这儿是编辑器部分 -->
			<?php 
			if(empty($fields['tagms'])) 
			
			echo '<span style="color:red">未编辑</span>';
			else
			echo '<span style="color:green">已编辑</span>';
			?>
			<input type="button" id="bt<?php echo $fields['id']; ?>" onclick="show(<?php echo $fields['id']; ?>);" value="显示编辑器"/>
			
			<div id="sdiv<?php echo $fields['id']; ?>" style="display: none">				
 				<textarea name="editor<?php echo $fields['id']; ?>" id="ms<?php echo $fields['id']; ?>" ><?php  echo $fields['tagms']; ?></textarea>
 			</div>
 			
			<script type="text/javascript">
				editor<?php echo $fields['id']; ?> = CKEDITOR.replace('editor<?php echo $fields['id']; ?>',{height:400});
			</script>
			<!-- 这儿是编辑器部分 -->
			
		</td>
			
			
			<input type='text' value='<?php echo $fields['count']; ?>' id='count<?php echo $fields['id']; ?>' size='5' style="display:none;"/>
	
		<td>
			<?php echo $fields['total']; ?>
		</td>
		<td>
			<?php echo $fields['addtime']; ?>
		</td>
		<td>
		 <a href='javascript:UpdateOne(<?php echo $fields['id'];?>,<?php echo ('editor'.$fields['id'])?>);'>[更新]</a>
		</td>
	</tr>
	
{/dede:datalist}
	<tr bgcolor="#F0FBBD">
	<td align="center" bgcolor="#F8FEE0"  height="28">
		<label>
			<input type="checkbox" onclick="checkall(this.form, 'ids')" name="all" class="np" />
		  <br />全选
		</label>
	</td>
	<td height="28" colspan="5" align="center" bgcolor="#F8FEE0" >
		{dede:pagelist /}
  </td>
	</tr>
	</form>
	<tr align="center" bgcolor="#FAFDF0">
	<td height="40" colspan="6">
		<input type='button' onclick="document.form3.submit()" class="np coolbg" value='删除所选' />
	</td>
	</tr>
	</table>
</div>

接着我们将JS文件放上
 

function UpdateOne(tid,eid)
{
  var editor = escape(eid.document.getBody().getHtml()); //接收ckeditor内容
  location = "tags_main.php?action=update&count="+document.getElementById('count'+tid).value+"&tagms="+editor+"&tid="+tid;
 
}

function show(id)
{
  var eid = id;
   var obt=document.getElementById("bt"+eid);
   var odiv=document.getElementById("sdiv"+eid);
 
     if(odiv.style.display=="none"){
       odiv.style.display="block";
       obt.value="隐藏编辑器";
     }
     else{
       odiv.style.display="none";
       obt.value="显示编辑器";
     }
 
}


其中上面修改的UpdateOne函数我们已经进入了修改,所以可以直接将其替换,同时将show放到下面。
至此tags_main.htm已经处理完

tags_main.php修改

在刚才的文件中我们使用了escape加密,这样不至于url传值时乱码,传到本文件中后,我们要进行解密处理
找到

else if($action == 'update')
{
在下面加入
/*解决js中escape加密,此处用unescape进行解密,这样原文存入数据库*/

function unescape($str) { 

$str = rawurldecode($str); 

preg_match_all("/%u.{4}|&#x.{4};|&#d+;|.+/U",$str,$r); 

$ar = $r[0]; 

foreach($ar as $k=>$v) { 

if(substr($v,0,2) == "%u") 

$ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,-4))); 

elseif(substr($v,0,3) == "&#x") 

$ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,3,-1))); 

elseif(substr($v,0,2) == "&#") { 

$ar[$k] = iconv("UCS-2","GBK",pack("n",substr($v,2,-1))); 

} 

} 

return join("",$ar); 

} 


$tagms = unescape($tagms);
 

datalistcp.class.php修改

include下的datalistcp.class.php是分页功能的类,但在内容传出时,会对内容进行一些过滤修改,因其过滤导致读取的""和style出错,我们进行相关修改
因为不知道datalistcp.class.php是不是还有其它内容使用,我们将其复制一个文件改名为datalistcptag.class.php
第一处修改
找到$val = str_replace("\"","“",$val); 
修改为$val = str_replace("“","\"",$val); 
第二处修改
$ra1 = array里面的style删除

再改tags_main.php

因为上面我们将datalistcp.class.php的文件名改了,tags_main.php引用了该文件,所以在文件顶部将其改为datalistcptag.class.php

至此便大功告成,只要在前台的tag页面中调用就可以了,前台页面中调用的方式请在简洁版的最底部查看。

评论

大侠名号:   验证暗号: 点击我更换图片

继续阅读