织梦二次开发

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

织梦二次开发实现动态生成页面锚点定位跳转

[复制链接]

40

主题

42

帖子

684

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
38
贡献
604
发表于 2018-10-22 09:28:24 | 显示全部楼层 |阅读模式
  要对织梦做这个功能的织梦二次开发是因为,前几天接了一个客户的要“动态的”生成内容页锚点定位跳转。

  其实页面锚点定位跳转如果是一个页面的话是非常简单的,在织梦基地有一个例子,位置是:http://www.dedebase.com/tools/db.html

  大家看一下在这里织梦官方给我们做了一个DedeCMSV57数据库结构文档查询的锚点定位跳转,大家可以点上面的网址去操作一下看看,选择一个表名,网页直接跳转到对应的表中。

  我就以表dede_addonarticle为例子,把对应的跳转代表拿出来给大家看看,代码如下:  

  1.   <a href="#dede_addonarticle">dede_addonarticle</a>
  2.     <br><br><br><br><br>
  3.   <a name="dede_addonarticle"></a>
复制代码

  大家看看上面只不过是一段html代码,非常简单的代码,代码的关键是在a标签里面使用了#dede_addonarticle和name="dede_addonarticle",name属性所在的a标签就是用户点击dede_addonarticle表跳转到的位置。

  其实,也可以使用id,即把name换成id来使用,有一个比较有名的前端框架bootstarp就有这个功能,当然,这个bootstrap监听滚动功能可以实现比这个复杂得多,不过再怎么复杂也使用了类似的原理。

问题:

  上面如果做一个页面的话,直接写好代码就搞定了。

  问题是客户要求:

  1)每个内容页都要有这个功能。
  
  2)上面的<a href="#dede_addonarticle">dede_addonarticle</a>里面的href后面的值和后面的文本名称每个页面都不同。

  即:一个页面为<a href="#abc">数据库表</a>

      第二个页面为<a href="#good">好产品</a>

     第三个页面为<a href="#ios">苹果系统</a>

  这里只列举了三个页面,在这三个页面中href的值分另是abc,goo,ios,并且后面的文本分别是“数据库”,“好产品”和“苹果系统”。

  要求用织梦系统动态生产页面,每个页href的值要不同,文本也不同。

  具体实现的后的结果类似这个站的
  1. http://www.gore.com.cn/products/categories/electronic-components-electrochemical-materials?view=EMI-shielding-grounding-solutions-mobile-electronics
复制代码
当我点击时直接跳转到对应的位置,截图如下:

锚跳转

锚跳转


  大家看到没有,一点就跳到对应的位置,并且,点击的文本所在的导航也跟着一起到达相应的位置,对用户的体验是非常友好的。

  实现这个功能原理用的就是html里面锚点定位跳转,只不过这个比较复杂。

  我用到了bootstrap监听滚动和做了织梦二次开发,二者结合才把这个功能给做出来。

  因为,本教程主要讲织梦二次开发,所以,bootstrap就不讲了,如果你感兴趣的话自动去研究一下这个监听滚动功能。

  bootstrap的官方网站是http://getbootstrap.com/

  有人反译的网站(若打不开多刷新几次)https://v3.bootcss.com/

功能实现:

  主要讲织梦二次开发,其实,上面的所有的内容都是为了引出如何做织梦二次开发来,其它的全部忽略。

  刚接过这个单子的时候不知道怎么搞,因为,本人从没有搞过这个东西。

  第一次这样想:在织梦后台添加字段id和text,id用来填写href值里面的#后面的值,text用来填写文本,即 <a href="#id">text</a>

  因为,每个页面的text是不一样的,并且id也要不同。

  那只能在后台添加多个字段,这样一算的话,如果text要十个的话,我在后台至少要添加20个字段,这太吓人了不但麻烦而且让客户在更新内容时,后台添加内容的页面就有20个字段,太麻烦不说而且还不好看,果断放弃掉这种方法。
  当时就想如果有一个方法能够动态的添加文本就行了,这样如果一个页面有三个文本,就动态的生成6个文本框填写,如果有5个就生产五个文本框填写,这样就省动了固定添加好几十个字段的麻烦,也让添加内容的页面更加简洁。

  其实,织梦本身就有这个功能,如下图所示:

增加指定的字段

增加指定的字段

  大家看看这个功能,是不是比较熟悉,特别是做软件下载的网站的朋友。

  没有错,这个功能就是织梦系统里面的软件模型。

  这个模型里面的“手动指定地址”功能正好能解决我们的动态添加字段的问题。

  即,软件地址 后面填写id, 服务器名称后面填写text,

  而且,你想添加多少就可以添加多少,只需要点击增加网址即可。

但是,有一个问题如下所示:
3.jpg
  也就是我们在后面填写的id,经过织梦系统加密以后生成了这样一串连接:/plus/download.php?open=2&id=80&uhash=a5febd3be5be5bdbcf8b25b1

  即
  1. <a href="/plus/download.php?open=2&amp;id=80&amp;uhash=a5febd3be5be5bdbcf8b25b1" target="_blank">服务器环境使用版</a>
复制代码

  这个连接是织梦为了不让一般的人能够看到真正的下载网址而加密了。

  而我们相要结果是:<a href="#id" >服务器环境使用版</a>

  也就是说我们要对织梦进行二次开发,去掉上的连接换成#id,并且去掉target="_blank"。

  要做这个功能就要对织梦某个文件做二次开发,这个文件就是:\include\taglib\channel\softlinks.lib.php

  php文件softlinks.lib.php要改的代码是:
  1. $link = $phppath."/download.php?open=2&id={$refObj->ArcID}&uhash={$uhash}";
复制代码


  把上面的代码替换为:
  1. $link = "#{$link}";
复制代码


若不懂代码请不要改直接改请复制下面的代码覆盖到文件softlinks.lib.php里面即可,推荐使用这种方法,这样比较安全,对于不懂代码的人来说。


  1. <?php
  2. if(!defined('DEDEINC')) exit('Request Error!');
  3. /**
  4. * 软件相关标签
  5. *
  6. * @version        $Id:softlinks.lib.php 1 9:33 2010年7月8日Z tianya $
  7. * @package        DedeCMS.Taglib
  8. * @copyright      Copyright (c) 2007 - 2010, DesDev, Inc.
  9. * @license        http://help.dedecms.com/usersguide/license.html
  10. * @link           http://www.dedecms.com
  11. */

  12. /**
  13. *  获取软件连接
  14. *
  15. * @access    public
  16. * @param     string  $fvalue  默认值
  17. * @param     object  $ctag  解析标签
  18. * @param     object  $refObj  引用对象
  19. * @param     bool  $downloadpage  下载页面
  20. * @return    string
  21. */
  22. function ch_softlinks($fvalue, &$ctag, &$refObj, $fname='', $downloadpage=false)
  23. {
  24.     global $dsql;
  25.     $row = $dsql->GetOne("SELECT * FROM `#@__softconfig` ");
  26.     $phppath = $GLOBALS['cfg_phpurl'];
  27.     $downlinks = '';
  28.     if($row['downtype']!='0' && !$downloadpage)
  29.     {
  30.         $tempStr = GetSysTemplets("channel_downlinkpage.htm");
  31.         $links = $phppath."/download.php?open=0&aid=".$refObj->ArcID."&cid=".$refObj->ChannelID;
  32.         $downlinks = str_replace("~link~", $links, $tempStr);
  33.         return $downlinks;
  34.     }
  35.     else
  36.     {
  37.         return ch_softlinks_all($fvalue, $ctag, $refObj, $row);
  38.     }
  39. }

  40. //读取所有链接地址
  41. function ch_softlinks_all($fvalue, &$ctag, &$refObj, &$row)
  42. {
  43.     global $dsql, $cfg_phpurl;
  44.     $phppath = $cfg_phpurl;
  45.     $islinktype = false;
  46.     //$link_type = trim($ctag->GetAtt('type')); (2011.6.29 修正下载链接列表 by:织梦的鱼)
  47.     if(!empty($link_type)) $islinktype = true;
  48.     $dtp = new DedeTagParse();
  49.     $dtp->LoadSource($fvalue);
  50.     if( !is_array($dtp->CTags) )
  51.     {
  52.         $dtp->Clear();
  53.         return "无链接信息!";
  54.     }
  55.     // 去除链接信息
  56.     if (!empty($row['sites']))
  57.     {
  58.         $sertype_arr = array();
  59.         $row['sites'] = preg_replace("#[\r\n]{1,}#", "\n", $row['sites']);
  60.         $sites = explode("\n", trim($row['sites']));
  61.         foreach($sites as $site)
  62.         {
  63.             if(trim($site)=='') continue;
  64.             list($link,$serverName,$serverType) = explode('|', $site);
  65.             $sertype_arr[trim($serverName)] = trim($serverType);
  66.         }
  67.     }

  68.     $tempStr = GetSysTemplets('channel_downlinks.htm');
  69.     $downlinks = '';
  70.     foreach($dtp->CTags as $ctag)
  71.     {
  72.         if($ctag->GetName()=='link')
  73.         {
  74.             $link = trim($ctag->GetInnerText());
  75.             $serverName = trim($ctag->GetAtt('text'));
  76.             $islocal = trim($ctag->GetAtt('islocal'));
  77.             if (isset($sertype_arr[$serverName]) && $islinktype && $sertype_arr[$serverName] != $link_type) continue;
  78.             
  79.             //分析本地链接
  80.             if(!isset($firstLink) && $islocal==1) $firstLink = $link;
  81.             if($islocal==1 && $row['islocal'] != 1) continue;
  82.    
  83.             //支持http,迅雷下载,ftp,flashget
  84.             if(!preg_match("#^http:\/\/|^thunder:\/\/|^ftp:\/\/|^flashget:\/\/#i", $link))
  85.             {
  86.                 $link = $GLOBALS['cfg_mainsite'].$link;
  87.             }
  88.             $downloads = getDownloads($link);
  89.             $uhash = substr(md5($link), 0, 24);
  90.             if($row['gotojump']==1)
  91.             {
  92.                 $link = $phppath."/download.php?open=2&id={$refObj->ArcID}&uhash={$uhash}";
  93.             }
  94.             $temp = str_replace("~link~",$link,$tempStr);
  95.             $temp = str_replace("~server~",$serverName,$temp);
  96.             $temp = str_replace("~downloads~",$downloads,$temp);
  97.             $downlinks .= $temp;
  98.         }
  99.     }
  100.     $dtp->Clear();
  101.     //www.dedebase.com
  102.     //必须设置为:[根据本地地址和服务器列表自动生成] 的情况
  103.     $linkCount = 1;
  104.     if($row['ismoresite']==1 && $row['moresitedo']==1 && trim($row['sites'])!='' && isset($firstLink))
  105.     {
  106.         $firstLink = preg_replace("#http:\/\/([^\/]*)\/#i", '/', $firstLink);
  107.         
  108.         foreach($sites as $site)
  109.         {
  110.             if(trim($site)=='') continue;
  111.             list($link,$serverName,$serverType) = explode('|', $site);
  112.             if (!empty($link_type) && $link_type != trim($serverType)) continue;
  113.             
  114.             $link = trim( preg_replace("#\/$#", "", $link) ).$firstLink;
  115.             $downloads = getDownloads($link);
  116.             $uhash = substr(md5($link), 0, 24);
  117.             if($row['gotojump']==1)
  118.             {
  119.                 $link = $phppath."/download.php?open=2&id={$refObj->ArcID}&uhash={$uhash}";
  120.             }
  121.             $temp = str_replace("~link~", $link, $tempStr);
  122.             $temp = str_replace("~server~", $serverName, $temp);
  123.             $temp = str_replace("~downloads~", $downloads, $temp);
  124.             $downlinks .= $temp;
  125.         }
  126.     }
  127.     return $downlinks;
  128. }

  129. function getDownloads($url)
  130. {
  131.     global $dsql;
  132.     $hash = md5($url);
  133.     $query = "SELECT downloads FROM `#@__downloads` WHERE hash='$hash' ";
  134.     $row = $dsql->GetOne($query);
  135.     if(is_array($row))
  136.     {
  137.         $downloads = $row['downloads'];
  138.     }
  139.     else
  140.     {
  141.         $downloads = 0;
  142.     }
  143.     return $downloads;
  144. }
复制代码

  然后找到文件channel_downlinks.htm(位置在:templets\system里面),在这个文件里面去掉 target="_blank",这样就搞定了。

进行测试:

  填写二个文本,id对应的分别是good和www.dedebase.com(这里写上织梦基地网址目的是为了让大家对比看看效果),如下图所示:
4.jpg
  结果如下图所示:
5.jpg
  这样就动态的实现了添加id和text,并且,每个网页可以不同,添加的网址是不是也没有加密了。

  只要这个功能结合bootstrap监听就可以实现点击锚文件后,文本动态的跳转滚动到相应的位置,这个功能是比较酷的很多网站上面都有这个功能。
  
  因为,这个是刚给客户做的织梦二次开发的功能,所以,不把完全代码发上来了。

  如果你懂织梦二次开发并且会bootstrap这个前端框架的话,一看上面的就知道怎么做了。


回复

使用道具 举报

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

本版积分规则

QQ|织梦二次开发

GMT+8, 2019-4-25 22:11 , Processed in 0.355578 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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