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 相关文章推荐
第八节 访问方式 [8]
Oct 09 PHP
php 特殊字符处理函数
Sep 05 PHP
php中使用Imagick实现图像直方图的实现代码
Aug 30 PHP
PHP设计模式 注册表模式(多个类的注册)
Feb 05 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
PHP冒泡算法详解(递归实现)
Nov 10 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
PHP统一页面编码避免乱码问题
Apr 09 PHP
PHP如何实现跨域
May 30 PHP
yii2 url重写并隐藏index.php方法
Dec 10 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
PHP实现微信提现功能(微信商城)
Nov 21 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
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
JS 实现图片直接下载示例代码
2013/07/22 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
微信小程序实现留言板(Storage)
2018/11/02 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
python制作一个桌面便签软件
2015/08/09 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
python绘制中国大陆人口热力图
2018/11/07 Python
python requests post多层字典的方法
2018/12/27 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
J2EE面试题
2016/03/14 面试题
优秀团员个人的自我评价
2013/10/02 职场文书
干部现实表现材料
2014/02/13 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
优秀员工事迹材料
2014/12/20 职场文书
教师研修随笔感言
2015/11/18 职场文书
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server