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 相关文章推荐
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
Jul 08 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
PHP获取当前系统时间的方法小结
Oct 03 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
Dec 25 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
Oct 01 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
Oct 30 PHP
PHP开发API接口签名生成及验证操作示例
May 27 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中串行化用法示例
2016/11/16 PHP
动态添加js事件实现代码
2009/03/12 Javascript
jquery获取input表单值的代码
2010/04/19 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
JavaScript返回网页中锚点数目的方法
2015/04/03 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
javascript表单正则应用
2017/02/04 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
python黑魔法之参数传递
2016/02/12 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
python获取list下标及其值的简单方法
2016/09/12 Python
Python实现Linux中的du命令
2017/06/12 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
Python高级用法总结
2018/05/26 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
本科生导师推荐信范文
2014/05/18 职场文书
学校安全管理责任书
2014/07/23 职场文书
环境卫生倡议书
2014/08/29 职场文书
健康状况证明书
2014/11/26 职场文书
公司管理建议书
2015/09/14 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
银行大堂经理培训心得体会
2016/01/09 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL
Python之matplotlib绘制折线图
2022/04/13 Python