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数学运算
Dec 30 PHP
php代码中使用换行及(\n或\r\n和br)的应用
Feb 02 PHP
基于xcache的配置与使用详解
Jun 18 PHP
phpQuery占用内存过多的处理方法
Nov 13 PHP
php数组去重复数据示例
Feb 25 PHP
php代码审计比较有意思的例子
May 07 PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 PHP
php使用fullcalendar日历插件详解
Mar 06 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
基于qmail的完整WEBMAIL解决方案安装详解
2006/10/09 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python操作csv文件实例详解
2017/07/31 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
解决django 向mysql中写入中文字符出错的问题
2020/05/18 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
Python自动登录QQ的实现示例
2020/08/28 Python
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
好的自荐信包括什么内容
2013/11/07 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
优秀求职信
2014/05/29 职场文书
走进敬老院活动总结
2014/07/10 职场文书
股东协议书范本2016
2016/03/21 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL
python 中[0]*2与0*2的区别说明
2021/05/10 Python
python基础之错误和异常处理
2021/10/24 Python