【二次开发教程】二、友情链接开发,前台申请页面。

在上一节大概介绍了一下2开时所要了解的一些基础http://wenda.wecenter.com/question/14010 这一节将以友情链接开发作为实际例子来进一步说明,这一节主要要讲的是友情链接前台申请时的开发,其主要功能就是点击申请按钮,出现一个弹窗,用于输入申请信息供后台审核。 先上一个效果图:
1.jpg
下面按照步骤一步一步进行详解: 1、现在首页底部添加一个申请按钮,打开views\default\home\explore.tpl.htm,在19行左右添加:
<ol class="breadcrumb">
      <li><a class="btn btn-mini btn-success" href="javascript:;" onclick="$.dialog('ajaxData', {'title':'申请友链', 'url':G_BASE_URL + '/link/apply/'});">申请友链</a></li>
</ol>
一个点击事件,然后调用一个AJAX弹窗,提交到app\link\main.php中的apply_action函数。
这是实际上就是MVC中,将视图(V)中用户的操作提交给控制器(C),然后由控制器来指定要执行的模型(M),在WC中控制器主要由app\模块名\main.php和ajax.php组成,不明白的可以参考一下上一篇。接着介绍main.php中的处理
2、新建一个文件app\link\main.php,代码如下
class main extends AWS_CONTROLLER //继承一个基类
{
  //这个是系统默认的权限判断,目前只需关系$rule_action这个数组元素
 public function get_access_rule()
  {
	  $rule_action['rule_type'] = 'white';
	  if ($this->user_info['permission']['visit_site'])
	  {
		  $rule_action['actions'][] = 'apply'; //表示在非登录情况下可以访问,这个apply行为被允许操作
	  }
	  return $rule_action;
  }
  
  //默认行为,当没有指定具体行为时,将默认执行这个
  function index_action() 
  {				
	  
  }
  
  public function apply_action() 
  {
	  //根据MVC构架,控制器指负责显示某个视图(V),和使用哪个模型(M)
	  //此处只需输出view\default\link\ajax_apply.tpl.htm这个页面给用户,即用户点击申请后所看到的页面
	  TPL::output('link/ajax_apply');
  }	
}
3、建立一个视图文件(V),也就是模板文件view\default\link\ajax_apply.tpl.htm,代码如下
<div id="quick_publish_error" class="error-message alert  alert-error hide"><em></em></div>

<form action="link/ajax/apply/" method="post" id="quick_publish" class="form-horizontal">
  <div class="form-group">
    <label class="col-sm-3 control-label">网站名称:</label>
    <div class="col-sm-9">
      <input type="text" name="site_name" class="form-control">
    </div>
  </div>
  <div class="form-group">
    <label class="col-sm-3 control-label">网站地址:</label>
    <div class="col-sm-9">
      <input type="text" name="site_url" class="form-control">
      <p class="aw-text-color-999">完整的格式,如:http://xxx.com</p>
    </div>
  </div>
  <div class="form-group">
      <p class="aw-text-color-999" style="margin-left:20px;">提交申请后请贵站先做好本站链接,我们将在2-3个工作内进行审核,谢谢合作!</p>
  </div>
</form>


<div class="modal-footer">
    <span class="pull-right">
		<button class="btn btn-primary btn-success" onclick="ajax_post($('#quick_publish'), _quick_publish_processer);return false;">提交申请</button>
    </span>
</div>
此时又有一个用户行为需要处理,即用户提交申请后的处理,由代码可以看出提交的地址是:
link/ajax/apply/
表示提交到app\link\ajax.php中的apply_action()
这个ajax.php是另外一个控制器(C),区别于main.php。main.php主要用于将视图界面(V)显示给用户(如用户点击申请友链,然后弹出申请框),而ajax.php主要用于处理某个具体的行为请求(如此处的提交申请)
4、新建一个app\link\ajax.php,其格式和mian.php是一样的,只是分工不一样,代码如下:
class ajax extends AWS_CONTROLLER //继承一个基类
{
	public function get_access_rule()
	{
		$rule_action['rule_type'] = 'white';
		if ($this->user_info['permission']['visit_site'])
		{
			$rule_action['actions'][] = 'apply';
		}
		return $rule_action;
	}
	
	//当用户点击“提交申请”时的处理
	public function apply_action()
	{
		$site_name = $_POST['site_name'];
		$site_url = $_POST['site_url'];
		//此处就是控制器(C)指派模型(M)的过程,表示调用models\link.php中的is_exist_url()
		//用于判断该网站地址是否已经存在
		if ($this->model('link')->is_exist_url($site_url))
		{
			H::ajax_json_output(AWS_APP::RSM(null, '-1', AWS_APP::lang()->_t('该网站已经提交过,请勿重复提交!')));
		}
		//对提交的参数进行简单的判断
		if (trim($site_name) == '')
		{
			H::ajax_json_output(AWS_APP::RSM(null, '-1', AWS_APP::lang()->_t('请输入网站名称!')));
		}
		if (trim($site_url) == '')
		{
			H::ajax_json_output(AWS_APP::RSM(null, '-1', AWS_APP::lang()->_t('请输入网站地址!')));
		}
		//表示调用models\link.php中的apply(),将申请数据插入数据库中
		$this->model('link')->apply($site_name,$site_url) ;
		H::ajax_json_output(AWS_APP::RSM(null, '-1', AWS_APP::lang()->_t('申请成功,等待管理员审核!')));
	}	
}
5、models\link.php模型(M)的编写,模型主要用于功能的处理,由控制器(C)来指派,代码如下:
class link_class extends AWS_MODEL
{
	//插入数据,第四步调用的就是这个函数了,将数据插入到表中
	function apply($site_name,$site_url)
	{		
		$this->insert('links', 
		array(
			'site_name' => $site_name,
			'site_url' => $site_url,
			'time' => time()
		));
	}
	
	//检查该URL是否存在
	function is_exist_url($site_url)
	{		
		//根据site_url字段从表aws_links中获取id,如果存在将会返回一个id,如果不存在则返回空
		//aws_links的sql在文章末尾放出
		return $this->fetch_one('links', 'id', "site_url = '" . $site_url . "'");
	}
}
至此,前台用户申请的功能已经编写完成,下面再总结一下流程: 1、用户点击“申请友链”,此时触发控制器(app\link\main.php),控制器再指定显示哪个视图(V),此时弹出友情链接申请框 2、在弹出框中,用户点击“提交申请”,触发控制器(app\link\ajax.php),控制器再指派模型(M)来处理用户请求 aws_links的sql
CREATE TABLE IF NOT EXISTS `aws_links` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `site_name` varchar(255) CHARACTER SET utf8 NOT NULL,
  `site_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_hungarian_ci NOT NULL,
  `time` int(10) unsigned NOT NULL DEFAULT '0',
  `status` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf-8;
下一节将讲后台的对申请数据的处理
1.jpg
    已邀请:

    skyboa - 互联网民工

    活雷锋啊!楼主V5!!!!

    hongbin - 最近在研究社会化问答

    感谢热心的楼主

    左手背上 - ybds.cc

    不明觉历啊

    Jaffe - UI设计及前端码农(weibo.com/jaffe)

    感谢楼主分享这么详细的二次开发教程!

    kk - WeCenter开发组

    不错的教程!

    yangker2010 - www.hello029.com

    牛人越来越多啊,好现象
    不用这么麻烦吧? 直接建立一个帖子,申请者留言就可以了,多么简单的事情啊。

    buleba - 80后

    楼主利害

    Hiker - 群策群力

    不明觉厉,v5

    haines - 90后,开源,woshur.com

    一直觉得发布文章的功能应该放在更靠前的地方,目前的入口藏的太深了。 这个问题就是很好的印证。完全可以通过文章的形式发布出来,作者作为一个开发者,理应比小白用户更能透彻的使用WC,但问题还是出来了。 是否可以考虑在导航栏 加个“发布”按钮,现有的“发起”改为“提问”。或者参考quora的方式,把发布文章的功能直接放在用户(头像)的子菜单。 @zhengqiang @kk@AWSupport

    buffonly - www.aqys.com

    我只想说第一篇和这一篇写的很好,醍醐灌顶,一下就明白了

    该问题目前已经被锁定, 无法添加新回复