在上一节大概介绍了一下2开时所要了解的一些基础http://wenda.wecenter.com/question/14010
这一节将以友情链接开发作为实际例子来进一步说明,这一节主要要讲的是友情链接前台申请时的开发,其主要功能就是点击申请按钮,出现一个弹窗,用于输入申请信息供后台审核。
先上一个效果图:
下面按照步骤一步一步进行详解:
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;
下一节将讲后台的对申请数据的处理
阅读全文
收起全文