第一步是设计新插件,保存后
第二步是修改模块并添加class类型。对于文件夹名,可以保持默认(与id相同)并保存.
第三步,在./source在plugin目录下建立与上述目录名相同的目录。然后将xml导出到该目录中.
第四步是在本插件目录中随意创建.class.图灵文件,内容如下;功能见代码中的描述,也可以在官方帮助下查看。但是官方的描述有一点我看不懂。我必须直接看代码才能理解.
<?图灵if(!defined('IN_DISCUZ')) { exit('Access Denied');}*class名由plugin_id名组成class plugin_recommend_article {/*初始化*//* function plugin_recommend_article(){ global $_G; //$this->pluginPath = $_G['siteurl']. 'source/plugin/recommend_article/'; } /* * add by qidizi * 推荐下拉输出 * 公共方法在内部使用,建议增加_线 */ function _recommendSelect($vars = array()){ global $_G; if (empty($_G['uid']) || empty($vars) ) return;//未登录 $res = DB::query("SELECT p_a_id, name FROM ".DB::table('chrd_common_recommend_area'));//注意这里独立代码,便于升级,所有功能代码都放在此目录中,所以js也放在这里.//然后使用图灵输出js代码。也可以使用上述方法 //$this->pluginpath输出xxxx.js $sel = " <script type=\"text/javascript\" src=\"plugin.图灵?id=recommend_article:ajaxrecommed&action=loadJs\"></script> <select οnchange=\"ajaxRecommend({pid:this.value, type:{$vars['type']}, aid:{$vars['aid']}, path:'{$vars['path']}' });\"> <option value=0>请选择推荐位置</option>"; while ($tmp = DB::fetch($res)){ $sel .="<option value=\"{$tmp['p_a_id']}\">{$tmp['name']}</option>"; } $sel .="</select>"; return array('select'=>$sel); }}/* 子类,由 plugin_id名_需要出现的对象脚本名 组成* discuz根目录下的脚本对象,* 有home.图灵,即home* 有forum.图灵即forum*反正你看到 http在地址上://chrd.q/discuz/forum.图灵,如果你想出现在这个页面上,你必须写一个plugin_id名_forum子类*/ class plugin_recommend_article_forum extends plugin_recommend_article { /*推荐在帖子内容页输出下拉* 由方法名组成,define('CURMODULE', $mod)定义的$mod,说明可以出现在那个模块中,配合类名中的forum,就可以达到一定的限制_自定名_output这个位置还有其他定义,需要看官方说明**// function viewthread_showSelect_output(){ global $_G; $vars = array('type'=>1, 'aid'=>$_G['tid'], 'path'=>$_G['fid']); return $this->_recommendSelect($vars); } }/* plugin_是固定需要的,recommend_article是插件id,home是根目录下的home.图灵名*/class plugin_recommend_article_home extends plugin_recommend_article { /*推荐在日志内容页输出下拉 * 要出现在home模块中,必须添加do类型,http://chrd.q/discuz/home.图灵?mod=space&uid=1&do=blog&id=1 * 所以需要space__showSelect_output 写成 space_blog_showSelect_output*因为只看官方说明,我发现这个东西总是出不来的。*在function_core.hookscript中的hookpt中有一句话说明此时规则发生了变化... if($hscript == 'home') { if($script != 'spacecp') { $script = 'space_'.(!= 'spacecp') { $script = 'space_'.(!empty($_G['gp_do']) ? $_G['gp_do'] : (!empty($_GET['do']) ? $_GET['do'] : '')); } else { $script .= !empty($_G['gp_ac']) ? '_'.$_G['gp_ac'] : (!empty($_GET['ac']) ? '_'.$_GET['ac'] : ''); } } */ function space_blog_showSelect_output(){//array('type'=>2, 'id'=>$blog[blogid], 'path'=>'' global $_G; $vars = array('type'=>2, 'aid'=>$_G['gp_id'], 'path'=>''); return $this->_recommendSelect($vars); } } 在生成插件数据时./function/cache/cache_setting.get__cachedata_setting_plugin($method = 在模板中生成的hook代码只是在相应的位置输出相应的$_G数组中的数据;
模板中的home/space_blog_view.space_html显示space_blog_showSelect_output输出内容,这样写
<!--{hook/space_blog_showSelect 'select'}-->
效果
安装时需要install或uninstalllll.图灵文件需要手动添加到xml中(xml中有非常item,请注意item放置的树序)。关于这个xml的解释,请查看后台admin中plugin的脚本代码.
<item id="installfile"><![CDATA[install.图灵]]></item> <item id="uninstallfile"><![CDATA[uninstall.图灵]]></item> </item></root> 安装脚本installll安装脚本.图灵可以这样写,uninstall几乎意味着.<?图灵if(!defined('IN_DISCUZ')) { exit('Access Denied');}$dir = $_G['gp_dir'];///获取本插件目录名if (empty($_G['gp_installing){//第一次,进入本文件时,先提示,忘记写取消按钮。第二次安装前按下确定安装 echo '<p class="infobox"><h4 class=“infotitle2”>安装前提示</h4>' .'<p style="text-align:left;line-height:25px;">' ." 安装前说明:<br /> 重新安装将删除旧推荐信息数据库的所有表格,因此,以前的信息将丢失。请仔细操作. " .'</p><br /><br /><center>' .'<button οnclick="location.href=\''.ADMINSCRIPT.'?action=plugins&operation=plugininstall&dir='.$dir.'&installtype=&installing=1\'">' .'知道了,开始安装</button></center></p>'; exit;//注意不要直接安装。先退出}$sid = 1;//服务器id$tabPre = $_G['config']['db'][$sid]['tablepre'];////获取配置中的表前缀$sql = <<<EOF---- 表的结构 `{$tabPre}chrd_common_recommend_area`--DROP TABLE IF EXISTS `{$tabPre}chrd_common_recommend_area`;CREATE TABLE IF NOT EXISTS `{$tabPre}chrd_common_recommend_area` ( `p_a_id` int(4) NOT NULL COMMENT “页号+位置序号数字组合”, `name` varchar(250) NOT NULL COMMENT “位置名称”, PRIMARY KEY (`p_a_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=文章推荐位置表;-- ------------------------------------------------------------ 表的结构 `{$tabPre}chrd_common_recommend_article`--DROP TABLE IF EXISTS `{$tabPre}chrd_common_recommend_article`;CREATE TABLE IF NOT EXISTS `{$tabPre}chrd_common_recommend_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL COMMENT 第一个推荐用户id, `users` int(11) NOT NULL DEFAULT '0' COMMENT "推荐总数", `type` int(11) NOT NULL COMMENT 文章类别(1帖子2日志), `path` varchar(250) NOT NULL COMMENT 文章分类路径,使用.分隔, `aid` int(11) NOT NULL COMMENT "文章id", `p_a_id` int(11) NOT NULL COMMENT id'推荐位置, `yes` int(11) NOT NULL DEFAULT '0' COMMENT "同意人数", `no` int(11) NOT NULL DEFAULT '0' COMMENT 不同意人数, `pass` int(1) NOT NULL DEFAULT '0' COMMENT 通过审查, `time` int(11) NOT NULL COMMENT “推荐时间”, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=“推荐文章表” AUTO_INCREMENT=1 ;-- ------------------------------------------------------------ 表的结构 `{$tabPre}chrd_common_recommend_grade_log`--DROP TABLE IF EXISTS `{$tabPre}chrd_common_recommend_grade_log`;CREATE TABLE IF NOT EXISTS `{$tabPre}chrd_common_recommend_grade_log` ( `rid` int(11) NOT NULL COMMENT 推荐id, `uid` int(11) NOT NULL COMMENT 用户id, `time` int(11) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=“推荐文章审核记录”;-- ------------------------------------------------------------ 表的结构 `{$tabPre}chrd_common_recommend_log`--DROP TABLE IF EXISTS `{$tabPre}chrd_common_recommend_log`;CREATE TABLE IF NOT EXISTS `{$tabPre}chrd_common_recommend_log` ( `rid` int(11) NOT NULL COMMENT 推荐id, `uid` int(11) NOT NULL COMMENT "推荐用户", `time` int(11) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=“推荐记录”;EOF;runquery($sql);//执行sql语句$finish = TRUE;///安装完成,这个变量必须出现. -------安装后需要启用才能在模板中显示. -------------使用<script type=\"text/javascript\" src=\"plugin.图灵?id=recommend_article:ajaxrecommed&action=loadJs\"></script>调用本目录中的图灵代码编写。文件名称 随便.inc.图灵 ajaxrecommed.inc.图灵 内容简单 <?id=recommend_article:ajaxrecommed&action=loadJs\"></script>调用本目录中的图灵代码编写。文件名称 随便.inc.图灵 ajaxrecommed.inc.图灵 内容简单 <?图灵if(!defined('IN_DISCUZ')) { exit('Access Denied');}switch($_G['gp_action']) { case 'loadJs': 就可以了.