首页 > 技术文章 > discuz X3.2 自定义系统广告详解

perfectzhang 2016-03-14 19:54 原文

dz自身是支持自定义广告位的归属于自定义类别,在广告位图标上不能够醒目的显示而且一些必要的后台交互也不好实现,所以找葫芦画瓢做个系统广告。

一、在source/class/adv中添加自定义的广告类文件adv_protaldropdown.php,格式为[adv_广告名]。

二、在source/language/adv中添加自定义的广告语言文件lang_protaldropdown.php,格式为[lang_广告名]。 

三、在static/image/admincp中添加图标portaldropdown.gif,格式为[广告名.gif] 

四、在template模板中放置广告展示位钩子

  实例:<!--{ad/portaldropdown/gg_full wrapfix}-->

  参数:钩子类别/广告名/广告所处div的class/队列广告排序位

 

lang_protaldropdown.php

<?php

/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: lang_portaldropdown.php 27449 2012-02-01 05:32:35Z zhangguosheng $
 */

if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}

$lang = array
(
	'portaldropdown_name' => '首页下拉广告',
	'portaldropdown_desc' => '展现方式: 广告以长方形图片的形式显示于导航下方,展示规定时间后自动缩回,通常使用宽小高大的长方形图片或 Flash 的形式。对联广告一般只在使用像素约定主表格宽度的情况下使用,如使用超过 90% 以上的百分比约定主表格宽度时,可能会影响访问者的正常浏览。当访问者浏览器宽度小于 800 像素时,自动不显示此类广告。当前页面有多个对联广告时,系统会随机选取其中之一显示。<br />价值分析: 对联广告由于只展现于高分辨率(1024x768 或更高)屏幕的两侧,只占用页面的空白区域,因此不会招致访问者反感,能够良好的突出推广内容。但由于对分辨率和主表格宽度的特殊要求,使得广告的受众比例无法达到 100%。',
	'portaldropdown_index' => '首页',	
	'portaldropdown_replay'	=> '是否允许重播',
	'portaldropdown_replay_comment' => '开启此项,该广告可重复展现',
	'portaldropdown_disableclose' => '关闭广告的链接',
	'portaldropdown_disableclose_comment' => '如果广告代码中已内置关闭操作,可以关闭系统预置的关闭链接',
	'portaldropdown_show' => '显示',
	'portaldropdown_hidden' => '隐藏',
	'portaldropdown_yes'=>'是',
		'portaldropdown_no'=>'否'
);

?>

 adv_protaldropdown.php 

<?php

/**
 */

if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}

class adv_portaldropdown {//注意格式

	var $version = '1.1';//版本
	var $name = 'portaldropdown_name';//名称——对应语音文件的变量
	var $description = 'portaldropdown_desc';//描述说明--对应语言文件中的变量,图1所以
	var $copyright = '<a href="http://www.xingame.net" target="_blank">Netho</a>';//版权
	var $targets = array( 'portal');//广告投放范围
	var $imagesizes = array('900x300');//默认图片广告大小

	function getsetting() {//广告参数选项设置
		global $_G;
		$settings = array(
			'replay' => array(//是否重播
				'title' => 'portaldropdown_replay',
				'type' => 'mradio',
				'value' => array(
						array(0, 'portaldropdown_yes'),
						array(1, 'portaldropdown_no'),
				),
				'default' => 0,
			),
	        'disableclose' => array(//是否隐藏
			    'title' => 'portaldropdown_disableclose',
			    'type' => 'mradio',
			    'value' => array(
			            array(0, 'portaldropdown_show'),
				    	array(1, 'portaldropdown_hidden'),
				),
			    'default' => 0,
			)
		);		
		return $settings;
	}
	

	function setsetting(&$advnew, &$parameters) {
		global $_G;
		if(is_array($advnew['targets'])) {
			$advnew['targets'] = implode("\t", $advnew['targets']);
		}
		$parameters['extra']['fullAdType']=$advnew['style']=='flash'?'flash':'jpg';
	}

	function evalcode($data) {//广告内容组装
		$fullAdType=$data['parameters']['extra']['fullAdType'];
		$adHTML=$data['code'];
		$isReplay=$data['parameters']['extra']['replay']?'true':'false';
		
		$create=$isReplay==='true'?'<div class="gg_fbtn" style="display: block;"><a style="" class="gg_freplay" title="重播" href="#"></a><a class="gg_fclose" title="关闭" href="#" style="display: none;"></a></div>':'';
		$create.='<div class="gg_fcon" style="display: none;text-align: center;"></div>';
		$create.='<script type="text/javascript">seajs.use("common", function(index){index.dropListAdv("'.$fullAdType.'",\\\''.$adHTML.'\\\','.$isReplay.');});</script>';
		
		return array(
				'check' => '
			if($_G[\'basescript\'] != \'portal\' || CURMODULE != \'index\' ]))
			) {
				$checked = false;
			}',
				'create' => '
						
			$temp=\''.$create.'\';				
			$adcode = empty($parameter[\'disableclose\']) ? (empty($_G[\'cookie\'][\'adclose_\'.$coupleadid]) ? \'<br /><a href="javascript:;"style="z-index: 200 !important;" onclick="setcookie(\\\'adclose_\'.$coupleadid.\'\\\', 1, 1);this.parentNode.style.display=\\\'none\\\'"><img src="\'.STATICURL.\'image/common/ad_close.gif" /></a>\'.$temp : \'\') : $temp;
			',
		);
	}

}

?>

  

图标

模板钩子(局部代码)

<!--{template common/header}-->
<!--[name]网站首页[/name]-->
<script type="text/javascript">
   	seajs.use("portal_index", function(index){index.init();});
</script>
<div class="wp">
	<!--{ad/portaldropdown/gg_full wrapfix}-->
	<!--[diy=diy1]-->
	<div id="diy1" class="area"></div>
	<!--[/diy]-->

	<div id="bd">
		<!-- 顶部推荐区begin -->
		<div class="top-recommends cl">
			<div class="newest-card">
				<!--[diy=diy_panels]-->
				<div id="diy_panels" class="area"></div>
				<!--[/diy]-->
			</div>
			<div alog-alias="favsites" class="favsites-nav">
				<!--[diy=diy_gamenav]-->
				<div id="diy_gamenav" class="area"></div>
				<!--[/diy]-->				
			</div>
		</div>
		<!-- 顶部推荐区end -->

  

  

接下来简单说说广告的流程

evalcode()函数返回数组[check,create]

check:当前模块是否为广告投放范围,否则false;

create:当check为true时,建立组装广告代码(这里就可以灵活变动了)

check和create的值均为字符串语句,

后台添加广告时由/source/admincp/admincp_adv.php处理存入数据库common_advertisement,

启用广告时由/source/function/cache/cache_advs.php处理,build_cache_advs()函数读取common_advertisement表中所有的广告属性(adv_protaldropdown.php中的setting)建立缓存保存在common_syscache表中,

全局钩子系统处理广告钩子所展示的广告时就进入广告执行阶段由/source/function/function_core.php中的adshow()函数执行adv_protaldropdown.php中evalcode()函数返回的字符串语句(@eval($evalcode['create'])),然后create中所组装的广告代码就得以展示,

注意在调试时可以将代码直接插入到adshow函数测试,测试通过后将代码转义再放在adv_portaldropdown.php中的evalcode()函数中。

 以上是个人理解的流程整理。。。。。。

实在是写不下去了!!!!

 

 

 

 

图1

推荐阅读