YII2框架中使用yii.js实现的post请求


Posted in PHP onApril 09, 2017

yii2提供了很多帮助类,比如Html、Url、Json等,可以很方便的实现一些功能,下面简单说下这个Html。用yii2写view时时经常会用到它,今天在改写一个页面时又用到了它。它比较好用的地方就在于,它不仅仅是生成一个简单的html标签,结合yii2自己的静态资源文件yii.js可以很方便的实现一个post请求。

yii2将这些功能都做好了封装,只要在合适的地方调用它的方法就可以了,可以说yii2是个可以开箱即用的框架,你可以用它很快的实现一个需要的功能:比如在页面中放置一个删除按钮,点击按钮发送post请求,弹出确认对话框。如果没有yii\helpers\Html类和yii.js,那么你需要写大量的js/jquery来实现这个功能。如果用yii2的话,下面的代码就可以实现:

// html代码
 <?= Html::a(
   '删除',
   [
     'delete',
     'id' => $id,
   ],
   [
     'data' => [
       'confirm' => '你确定要删除吗?',
       'method' => 'post',
     ],
   ]
 )
 ?>
 // html代码

它会在页面中生成下面一段html代码:

<a href="delete?id=1" rel="external nofollow" data-confirm="你确定要退出吗?" data-method="post">删除</a>

点击这个按钮会弹出对话框,确认删除后会发送post请求。那么这个post请求是如何发送的呢?到现在为止可是一段js代码都没写呢。

yii2框架隐藏了技术实现的细节,post请求的实现在yii.js中。在yii.js中,定义了window.yii对象,并初始化了window.yii对象的initModule方法:

window.yii = (function ($) {
  var pub = {
    // 定义了处理事件的方法,比如下面这个:
    confirm: function (message, ok, cancel) {
      if (window.confirm(message)) {
        !ok || ok();
      } else {
        !cancel || cancel();
      }
    },


    handleAction: function ($e, event) {
      var $form = $e.attr('data-form') ? $('#' + $e.attr('data-form')) : $e.closest('form'),
      method = !$e.data('method') && $form ? $form.attr('method') : $e.data('method'),

      // 其他省略

    },

    // 其他省略
  };
  // 初始化模块
  initModule: function (module) {
    if (module.isActive !== undefined && !module.isActive) {
      return;
    }
    if ($.isFunction(module.init)) {
      module.init();
    }
    $.each(module, function () {
      if ($.isPlainObject(this)) {
        pub.initModule(this);
      }
    });
  },

  // 初始化方法
  init: function () {
    initCsrfHandler();
    initRedirectHandler();
    initAssetFilters();
    initDataMethods();
  },

  return pub;
})(window.jQuery);

window.jQuery(function () {
  window.yii.initModule(window.yii);
});

其中上面的initDataMethods()会调用pub.handleAction方法:

function initDataMethods() {
    var handler = function (event) {
      var $this = $(this),
        method = $this.data('method'),
        message = $this.data('confirm'),
        form = $this.data('form');

      if (method === undefined && message === undefined && form === undefined) {
        return true;
      }

      if (message !== undefined) {
        $.proxy(pub.confirm, this)(message, function () {
          pub.handleAction($this, event);
        });
      } else {
        pub.handleAction($this, event);
      }
      event.stopImmediatePropagation();
      return false;
    };

    // handle data-confirm and data-method for clickable and changeable elements
    $(document).on('click.yii', pub.clickableSelector, handler)
      .on('change.yii', pub.changeableSelector, handler);
  }

可以看到这个方法会获取上面生成的a标签的data属性值,然后交给handlerAction来处理。handlerAction通过动态生成一个form来处理各种请求,最后通过触发submit事件来提交。

// 其他省略

$form = $('<form/>', {method: method, action: action});
var target = $e.attr('target');
if (target) {
  $form.attr('target', target);
}
if (!/(get|post)/i.test(method)) {
  $form.append($('<input/>', {name: '_method', value: method, type: 'hidden'}));
  method = 'post';
  $form.attr('method', method);
}
if (/post/i.test(method)) {
  var csrfParam = pub.getCsrfParam();
  if (csrfParam) {
    $form.append($('<input/>', {name: csrfParam, value: pub.getCsrfToken(), type: 'hidden'}));
  }
}
$form.hide().appendTo('body');

// 其他省略

PS:做项目用框架很方便,但是框架用的久了,就容易把基本的技术给忘掉了。还是要打好基础呀,这样不管用什么框架都不至于用得云里雾里的。

PHP 相关文章推荐
PHP默认安装产生系统漏洞
Oct 09 PHP
pw的一个放后门的方法分析
Oct 08 PHP
php xml实例 留言本
Mar 20 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
php cc攻击代码与防范方法
Oct 18 PHP
鸡肋的PHP单例模式应用详解
Jun 03 PHP
PHP获取当前url的具体方法全面解析
Nov 26 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
php并发加锁示例
Oct 17 PHP
php 使用html5实现多文件上传实例
Oct 24 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 #PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 #PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 #PHP
ThinkPHP中调用PHPExcel的实现代码
Apr 08 #PHP
yii框架无限极分类的实现方法
Apr 08 #PHP
PHP下载远程图片的几种方法总结
Apr 07 #PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 #PHP
You might like
生成静态页面的PHP类
2006/07/15 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
php防止用户重复提交表单
2015/11/02 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
html5新特性与用法大全
2018/09/13 HTML / CSS
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
市场营销大学生职业规划书
2014/02/25 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
老人节主持词
2015/07/04 职场文书
Android中的Launch Mode详情
2022/06/05 Java/Android