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

在上一节大概介绍了一下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">完整的格式,如:[url=http://xxx.com</p>]http://xxx.com</p>[/url]
</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;

下一节将讲后台的对申请数据的处理
已邀请:

skyboa - 互联网民工

赞同来自:

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

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

赞同来自:

感谢热心的楼主

左手背上 - ybds.cc

赞同来自:

不明觉历啊

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

赞同来自:

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

kk - WeCenter开发组

赞同来自:

不错的教程!

yangker2010 - www.hello029.com

赞同来自:

牛人越来越多啊,好现象

platoer

赞同来自:

不用这么麻烦吧?

直接建立一个帖子,申请者留言就可以了,多么简单的事情啊。

buleba - 80后

赞同来自:

楼主利害

Hiker - 群策群力

赞同来自:

不明觉厉,v5

haines - 90后,开源,woshur.com

赞同来自:

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

buffonly - www.lianaiyisheng.com

赞同来自:

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

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