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基础知识:类与对象(4) 范围解析操作符(::)
Dec 13 PHP
php array_unique之后json_encode需要注意
Jan 02 PHP
php实现文件下载更能介绍
Nov 23 PHP
PHP递归算法的详细示例分析
Feb 19 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
PHP中的表达式简述
May 29 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
PHP常用函数之格式化时间操作示例
Oct 21 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
Aug 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
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
php数组分页实现方法
2016/04/30 PHP
PHP简单日历实现方法
2016/07/20 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
javascript基本算法汇总
2016/03/09 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
python插入数据到列表的方法
2015/04/30 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
Python中Qslider控件实操详解
2021/02/20 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
挪威手表购物网站:Klokker
2016/09/19 全球购物
党校培训自我鉴定范文
2014/04/10 职场文书
村官个人总结范文
2015/03/03 职场文书
工作简历自我评价
2015/03/11 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
js实现模拟购物商城案例
2021/05/18 Javascript
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python