当前位置:首页 > CMS教程 > phpcms > 列表

PHPCMS广告模块详细分析——广告的生成

发布:smiling 来源: PHP粉丝网  添加日期:2014-10-22 16:20:53 浏览: 评论:0 

广告位模版配置文件在缓存中,广告的模版存在于phpcms\templates/default\poster\ 中,它和更新js功能有及其密切的关系.

下面开始分析广告的js是怎么生成的.

首先看位于 cache/poster_js下的一个已经生成的js文件,名为1.js的文件时对应的数据,位于poster_space表中id为1的记录,因为这条记录中path的值为 poster_js/1.js

  1. function PCMSAD(PID) {   
  2.   this.ID        = PID;   
  3.   this.PosID  = 0;    
  4.   this.ADID       = 0;   
  5.   this.ADType     = "";   
  6.   this.ADName     = "";   
  7.   this.ADContent = "";   
  8.   this.PaddingLeft = 0;   
  9.   this.PaddingTop  = 0;   
  10.   this.Wspaceidth = 0;   
  11.   this.Height = 0;   
  12.   this.IsHitCount = "N";   
  13.   this.UploadFilePath = "";   
  14.   this.URL = "";   
  15.   this.SiteID = 0;   
  16.   this.ShowAD  = showADContent;   
  17.   this.Stat = statAD;   
  18. }   
  19.    
  20. function statAD() {   
  21.     var new_element = document.createElement("script");    
  22.     new_element.type = "text/javascript";   
  23.     new_element.src="http://localhost/phpcms952/index.php?m=poster&c=index&a=show&siteid="+this.SiteID+"&spaceid="+this.ADID+"&id="+this.PosID;    
  24.     document.body.appendChild(new_element);   
  25. }   
  26.    
  27. function showADContent() {   
  28.   var content = this.ADContent;   
  29.   var str = "";   
  30.   var AD = eval('('+content+')');   
  31.   if (this.ADType == "images") {   
  32.       if (AD.Images[0].imgADLinkUrl) str += "<a href='"+this.URL+'&a=poster_click&sitespaceid='+this.SiteID+"&id="+this.ADID+"&url="+AD.Images[0].imgADLinkUrl+"' target='_blank'>";   
  33.       str += "<img title='"+AD.Images[0].imgADAlt+"' src='"+this.UploadFilePath+AD.Images[0].ImgPath+"' width='"+this.Width+"' height='"+this.Height+"' style='border:0px;'>";   
  34.       if (AD.Images[0].imgADLinkUrl) str += "</a>";   
  35.   }else if(this.ADType == "flash"){   
  36.       str += "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' width='"+this.Width+"' height='"+this.Height+"' id='FlashAD_"+this.ADID+"' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0'>";   
  37.       str += "<param name='movie' value='"+this.UploadFilePath+AD.Images[0].ImgPath+"' />";    
  38.       str += "<param name='quality' value='autohigh' />";   
  39.       str += "<param name='wmode' value='opaque'/>";   
  40.       str += "<embed src='"+this.UploadFilePath+AD.Images[0].ImgPath+"' quality='autohigh' wmode='opaque' name='flashad' swliveconnect='TRUE' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width='"+this.Width+"' height='"+this.Height+"'></embed>";   
  41.       str += "</object>";      
  42.   }   
  43.   str += "";   
  44.   document.write(str);   
  45. }   
  46.     
  47. var cmsAD_1 = new PCMSAD('cmsAD_1');    
  48. cmsAD_1.PosID = 1;    
  49. cmsAD_1.ADID = 1;    
  50. cmsAD_1.ADType = "images";    
  51. cmsAD_1.ADName = "banner";    
  52. cmsAD_1.ADContent = "{'Images':[{'imgADLinkUrl':'http%3A%2F%2Fwww.phpcms.cn','imgADAlt':'','ImgPath':'http://localhost/phpcms952/uploadfile/poster/2.png'}],'imgADLinkTarget':'New','Count':'1','showAlt':'Y'}";    
  53. cmsAD_1.URL = "http://localhost/phpcms952/index.php?m=poster&c=index";    
  54. cmsAD_1.SiteID = 1;    
  55. cmsAD_1.Width = 430;    
  56. cmsAD_1.Height = 63;    
  57. cmsAD_1.UploadFilePath = '';    
  58. cmsAD_1.ShowAD();   
  59.    
  60. var isIE=!!window.ActiveXObject;    
  61. if (isIE){   
  62.    
  63.     if (document.readyState=="complete"){   
  64.         cmsAD_1.Stat();   
  65.     } else {   
  66.         document.onreadystatechange=function(){   
  67.             if(document.readyState=="complete") cmsAD_1.Stat();   
  68.         }   
  69.     }   
  70. else {   
  71.     cmsAD_1.Stat();   
  72. }   

这是一个类型为banner的广告模型,我们拿出它的模版文件:

  1. function PCMSAD(PID) {   
  2.   this.ID        = PID;   
  3.   this.PosID  = 0;    
  4.   this.ADID       = 0;   
  5.   this.ADType     = "";   
  6.   this.ADName     = "";   
  7.   this.ADContent = "";   
  8.   this.PaddingLeft = 0;   
  9.   this.PaddingTop  = 0;   
  10.   this.Wspaceidth = 0;   
  11.   this.Height = 0;   
  12.   this.IsHitCount = "N";   
  13.   this.UploadFilePath = "";   
  14.   this.URL = "";   
  15.   this.SiteID = 0;   
  16.   this.ShowAD  = showADContent;   
  17.   this.Stat = statAD;   
  18. }   
  19.    
  20. function statAD() {   
  21.     var new_element = document.createElement("script");    
  22.     new_element.type = "text/javascript";   
  23.     new_element.src="{APP_PATH}index.php?m=poster&c=index&a=show&siteid="+this.SiteID+"&spaceid="+this.ADID+"&id="+this.PosID;    
  24.     document.body.appendChild(new_element);   
  25. }   
  26.    
  27. function showADContent() {   
  28.   var content = this.ADContent;   
  29.   var str = "";   
  30.   var AD = eval('('+content+')');   
  31.   if (this.ADType == "images") {   
  32.       if (AD.Images[0].imgADLinkUrl) str += "<a href='"+this.URL+'&a=poster_click&sitespaceid='+this.SiteID+"&id="+this.ADID+"&url="+AD.Images[0].imgADLinkUrl+"' target='_blank'>";   
  33.       str += "<img title='"+AD.Images[0].imgADAlt+"' src='"+this.UploadFilePath+AD.Images[0].ImgPath+"' width='"+this.Width+"' height='"+this.Height+"' style='border:0px;'>";   
  34.       if (AD.Images[0].imgADLinkUrl) str += "</a>";   
  35.   }else if(this.ADType == "flash"){   
  36.       str += "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' width='"+this.Width+"' height='"+this.Height+"' id='FlashAD_"+this.ADID+"' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0'>";   
  37.       str += "<param name='movie' value='"+this.UploadFilePath+AD.Images[0].ImgPath+"' />";    
  38.       str += "<param name='quality' value='autohigh' />";   
  39.       str += "<param name='wmode' value='opaque'/>";   
  40.       str += "<embed src='"+this.UploadFilePath+AD.Images[0].ImgPath+"' quality='autohigh' wmode='opaque' name='flashad' swliveconnect='TRUE' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width='"+this.Width+"' height='"+this.Height+"'></embed>";   
  41.       str += "</object>";      
  42.   }   
  43.   str += "";   
  44.   document.write(str);   
  45. }   
  46.     
  47. var cmsAD_{$spaceid} = new PCMSAD('cmsAD_{$spaceid}');    
  48. cmsAD_{$spaceid}.PosID = {$spaceid};    
  49. cmsAD_{$spaceid}.ADID = {$p_id};    
  50. cmsAD_{$spaceid}.ADType = "{$p_type}";    
  51. cmsAD_{$spaceid}.ADName = "{$p_name}";    
  52. cmsAD_{$spaceid}.ADContent = "{'Images':[{'imgADLinkUrl':'{urlencode($p_setting[1]['linkurl'])}','imgADAlt':'{$p_setting[1]['alt']}','ImgPath':'<?php echo $p_type=='images' ? $p_setting[1]['imageurl'] : $p_setting[1]['flashurl'];?>'}],'imgADLinkTarget':'New','Count':'1','showAlt':'Y'}";    
  53. cmsAD_{$spaceid}.URL = "{APP_PATH}index.php?m=poster&c=index";    
  54. cmsAD_{$spaceid}.SiteID = {$siteid};    
  55. cmsAD_{$spaceid}.Width = {$width};    
  56. cmsAD_{$spaceid}.Height = {$height};    
  57. cmsAD_{$spaceid}.UploadFilePath = '';    
  58. cmsAD_{$spaceid}.ShowAD();   
  59.    
  60. var isIE=!!window.ActiveXObject;    
  61. if (isIE){   
  62.    
  63.     if (document.readyState=="complete"){   
  64.         cmsAD_{$spaceid}.Stat();   
  65.     } else {   
  66.         document.onreadystatechange=function(){   
  67.             if(document.readyState=="complete") cmsAD_{$spaceid}.Stat();   
  68.         }   
  69.     }   
  70. else {   
  71.     cmsAD_{$spaceid}.Stat();   
  72. }   

这样,给我们的认识就是,模版上的变量被替换了,并重新生成了js文件,放到了相应的文件夹,代码如下:

  1. <?php   
  2.    
  3. /**  
  4.  *  
  5.  * @param 广告生成js类  
  6.  */   
  7. defined('IN_PHPCMS'or exit('No permission resources.');   
  8.    
  9. class html {   
  10.    
  11.     private $db$s_db$queue;   
  12.    
  13.     /**  
  14.      *  
  15.      * 类的构造函数读取了三个模型作为了类的内部变量  
  16.      * 广告位,广告,队列  
  17.      *  
  18.      * 这里提一下队列模型  
  19.      *  
  20.      * phpcms的队列模型,就是在任务太多的情况下  
  21.      * 将其存入名为queue的表中  
  22.      * 处理完一个删除一个  
  23.      * 可以理解为排队机制  
  24.      *  
  25.      */   
  26.     public function __construct() {   
  27.         $this->s_db = pc_base::load_model('poster_space_model');   
  28.         $this->db = pc_base::load_model('poster_model');   
  29.         $this->queue = pc_base::load_model('queue_model');   
  30.     }   
  31.    
  32.     /**  
  33.      * 生成广告js文件  
  34.      * @param intval $id 广告版位ID  
  35.      * @return boolen 成功返回true  
  36.      */   
  37.     public function create_js($id = 0) {   
  38.         $id = intval($id);   
  39.         if (!$id) {   
  40.             $this->msg = L('no_create_js');   
  41.             return false;   
  42.         }   
  43.         $siteid = get_siteid();   
  44.         /**  
  45.          *  
  46.          * 这里的生成js文件就是单一的  
  47.          * 在上文提到的调用中循环采用了这个  
  48.          * 所以下面拿到的是当前站点id下的广告位的数据  
  49.          *  
  50.          */   
  51.         $r = $this->s_db->get_one(array('siteid' => $siteid'spaceid' => $id));   
  52.         $now = SYS_TIME;  //将系统时间写入变量   
  53.         if ($r['setting'])   
  54.             $space_setting = string2array($r['setting']); //如果存在广告位的设置,就转化成数组,其实肯定存在的   
  55.         if ($r['type'] == 'code')   
  56.             return true;  //代码类型的就直接返回了,因为不用生产js文件   
  57.         $poster_template = getcache('poster_template_' . $siteid'commons'); //读取了广告模版设置的缓存   
  58.         /**  
  59.          *  
  60.          * 下面进行一个判断  
  61.          *  
  62.          * 判断广告位的类型配置是不是存在option一项  
  63.          *  
  64.          *  
  65.          */   
  66.         if ($poster_template[$r['type']]['option']) {   
  67.             /**  
  68.              * 如果存在  
  69.              * 获取  
  70.              *  当前站点 当前广告位 能使用 设置时间在当前时间内 , 按照 人为排序正序 id倒序  
  71.              * 的所有广告  
  72.              *  
  73.              * 并且打散数组  
  74.              */   
  75.             $where = "`spaceid`='" . $id . "' AND `siteid`='" . $siteid . "' AND `disabled`=0 AND `startdate`<='" . $now . "' AND (`enddate`>='" . $now . "' OR `enddate`=0) ";   
  76.             $pinfo = $this->db->select($where'*''''`listorder` ASC, `id` DESC');   
  77.             if (is_array($pinfo) && !emptyempty($pinfo)) {   
  78.                 foreach ($pinfo as $k => $rs) {   
  79.                     if ($rs['setting']) {   
  80.                         $rs['setting'] = string2array($rs['setting']);   
  81.                         $pinfo[$k] = $rs;   
  82.                     } else {   
  83.                         unset($pinfo[$k]);   
  84.                     }   
  85.                 }   
  86.                 extract($r);   
  87.             } else {   
  88.                 return true;   
  89.             }   
  90.         } else {   
  91.             /**  
  92.              * 如果不存在  
  93.              *  
  94.              * 取出数据的方式和上面一致  
  95.              *  
  96.              * 但是在打散的数组的每个变量前面都加上了 P  
  97.              *  
  98.              * 所以对于该广告模块来说,充分使用了extract这个函数  
  99.              *  
  100.              * 有兴趣的同学可以研究下  
  101.              *  
  102.              */   
  103.             $where = " `spaceid`='" . $id . "' AND `siteid`='" . $siteid . "' AND `disabled`=0 AND `startdate`<='" . $now . "' AND (`enddate`>='" . $now . "' OR `enddate`=0)";   
  104.             $pinfo = $this->db->get_one($where'*''`listorder` ASC, `id` DESC');   
  105.             if (is_array($pinfo) && $pinfo['setting']) {   
  106.                 $pinfo['setting'] = string2array($pinfo['setting']);   
  107.             }   
  108.             extract($r);   
  109.             if (!is_array($pinfo) || emptyempty($pinfo))   
  110.                 return true;   
  111.             extract($pinfo, EXTR_PREFIX_SAME, 'p');   
  112.         }   
  113.         $file = CACHE_PATH . $path;   
  114.         /**  
  115.          *  
  116.          * 这里用的ob函数进行输出  
  117.          *  
  118.          * 优点:不会因为php文件提前输出header而出错,又可以及时刷新缓存区而不浪费资源  
  119.          */   
  120.         ob_start();   
  121.         /**  
  122.          *  
  123.          * 这里在文件输出流中引入了广告模版文件  
  124.          * 而在原始的模版文件中存在着大量的php变量  
  125.          * 这些变量和上面被打散的数组中的变量是一致的  
  126.          * 也就是说在这一步  
  127.          * 变量被巧妙的替换了  
  128.          * 很自然的转化成了js文件  
  129.          */   
  130.         include template('poster'$type);   
  131.         $data = ob_get_contents();   
  132.         /**  
  133.          *  
  134.          * 将合并后的文件内容存进变量后清空了ob文件流  
  135.          */   
  136.         ob_end_clean();   
  137.         /**  
  138.          *  
  139.          * 最后根据路径写入文件  
  140.          */   
  141.         $strlen = pc_base::load_config('system''lock_ex') ? file_put_contents($file$data, LOCK_EX) : file_put_contents($file$data);  
  142.         @chmod($file, 0777);   
  143.         return true;   
  144.     }   
  145.    
  146. }   
  147.    
  148. ?> 

四、总结

根据上面的图文注释,小伙伴们都可以清楚的知道phpcms的广告是怎么产生的了吧.

配置文件+模版文件+数据库中具体数据=js广告文件

五、后记

用了一晚上的时间,又重新分析了一下phpcms,这个功能原来在大连实训的时候写过,也是参考phpcms的,这回也算是复习吧.

温故知新,回头再看phpcms,还是有很多值得学习的,看来有空还要研究下它的队列机制了.

Tags: PHPCMS广告模块 PHPCMS广告生成

分享到: