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通用分页类page.php[仿google分页]
Aug 31 PHP
解析isset与is_null的区别
Aug 09 PHP
php批量删除cookie的简单实现方法
Jan 26 PHP
php实现倒计时效果
Dec 19 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
Mar 07 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
Apr 01 PHP
深入理解PHP原理之执行周期分析
Jun 01 PHP
laravel学习教程之关联模型
Jul 30 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
Laravel 自带的Auth验证登录方法
Sep 30 PHP
thinkphp5实现微信扫码支付
Dec 23 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中的使用情况
2015/11/05 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
jquery实现带单选按钮的表格行选中时高亮显示
2013/08/01 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
JavaScript自定义分页样式
2017/01/17 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
[01:01:41]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第二场 1月31日
2021/03/11 DOTA
Python3遍历目录树实现方法
2015/05/22 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
Django返回json数据用法示例
2016/09/18 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
用python写爬虫简单吗
2020/07/28 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
开放系统互连参考模型
2016/06/29 面试题
省三好学生申请材料
2014/01/22 职场文书
2014政务公开实施方案
2014/02/19 职场文书
销售经理竞聘书
2014/03/31 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
教师个人总结范文
2015/02/11 职场文书
入党积极分子个人总结
2015/03/02 职场文书