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模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
Nov 07 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
php绘图之加载外部图片的方法
Jan 24 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
浅析php如何实现爬取数据原理
Sep 27 PHP
PHP读取目录树的实现方法分析
Mar 22 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中smarty实现多模版网站的方法
2015/06/11 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
[54:26]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第一场 12.10
2020/12/12 DOTA
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
简单介绍Python中的struct模块
2015/04/28 Python
python实现杨辉三角思路
2017/07/14 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
护理学专业推荐信
2013/12/03 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
精神文明建设标语
2014/06/16 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
关于工作经历的证明书
2014/10/11 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
Linux下搭建SFTP服务器的命令详解
2022/06/25 Servers