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 相关文章推荐
将数字格式的计算结果转为汉字格式
Oct 09 PHP
Mysql中limit的用法方法详解与注意事项
Apr 19 PHP
php 什么是PEAR?(第三篇)
Mar 19 PHP
php之CodeIgniter学习笔记
Jun 17 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
php中解析带中文字符的url函数分享
Jan 20 PHP
php中JSON的使用方法
Apr 30 PHP
PHP+Ajax实现验证码的实时验证
Jul 20 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 PHP
PHP7新增函数
Mar 09 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
德生PL660的电路分析和打磨
2021/03/02 无线电
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
Python设计模式之观察者模式实例
2014/04/26 Python
介绍Python中几个常用的类方法
2015/04/08 Python
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Python如何操作docker redis过程解析
2020/08/10 Python
python使用建议与技巧分享(一)
2020/08/17 Python
迪奥官网:Dior.com
2018/12/04 全球购物
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
应聘美工求职信
2013/11/07 职场文书
日语专业毕业生自荐信
2013/11/11 职场文书
商场消防安全责任书
2014/07/29 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
开幕式邀请函
2015/01/31 职场文书
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL