YII2框架中使用yii.js實(shí)現(xiàn)的post請求
yii2提供了很多幫助類,比如Html、Url、Json等,可以很方便的實(shí)現(xiàn)一些功能,下面簡單說下這個Html。用yii2寫view時時經(jīng)常會用到它,今天在改寫一個頁面時又用到了它。它比較好用的地方就在于,它不僅僅是生成一個簡單的html標(biāo)簽,結(jié)合yii2自己的靜態(tài)資源文件yii.js可以很方便的實(shí)現(xiàn)一個post請求。
yii2將這些功能都做好了封裝,只要在合適的地方調(diào)用它的方法就可以了,可以說yii2是個可以開箱即用的框架,你可以用它很快的實(shí)現(xiàn)一個需要的功能:比如在頁面中放置一個刪除按鈕,點(diǎn)擊按鈕發(fā)送post請求,彈出確認(rèn)對話框。如果沒有yii\helpers\Html類和yii.js,那么你需要寫大量的js/jquery來實(shí)現(xiàn)這個功能。如果用yii2的話,下面的代碼就可以實(shí)現(xiàn):
// 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>
點(diǎn)擊這個按鈕會彈出對話框,確認(rèn)刪除后會發(fā)送post請求。那么這個post請求是如何發(fā)送的呢?到現(xiàn)在為止可是一段js代碼都沒寫呢。
yii2框架隱藏了技術(shù)實(shí)現(xiàn)的細(xì)節(jié),post請求的實(shí)現(xiàn)在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()會調(diào)用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標(biāo)簽的data屬性值,然后交給handlerAction來處理。handlerAction通過動態(tài)生成一個form來處理各種請求,最后通過觸發(fā)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:做項(xiàng)目用框架很方便,但是框架用的久了,就容易把基本的技術(shù)給忘掉了。還是要打好基礎(chǔ)呀,這樣不管用什么框架都不至于用得云里霧里的。
- PHP實(shí)現(xiàn)支持GET,POST,Multipart/form-data的HTTP請求類
- php處理restful請求的路由類分享
- 通過JS和PHP兩種方法判斷用戶請求時使用的瀏覽器類型
- php自定義類fsocket模擬post或get請求的方法
- 解讀PHP的Yii框架中請求與響應(yīng)的處理流程
- yii2 在控制器中驗(yàn)證請求參數(shù)的使用方法
- Yii框架通過請求組件處理get,post請求的方法分析
- Yii 框架控制器創(chuàng)建使用及控制器響應(yīng)操作示例
- Yii框架響應(yīng)組件用法實(shí)例分析
- Yii2框架RESTful API 格式化響應(yīng),授權(quán)認(rèn)證和速率限制三部分詳解
- YII Framework學(xué)習(xí)之request與response用法(基于CHttpRequest響應(yīng))
- PHP封裝請求類實(shí)例分析【基于Yii框架】
相關(guān)文章
php實(shí)現(xiàn)文件管理與基礎(chǔ)功能操作
這篇文章通過實(shí)例代碼給大家講解了php文件管理與基礎(chǔ)功能的實(shí)現(xiàn),非常不錯,具有參考借鑒價值,需要的朋友參考下2017-03-03Windows下Apache + PHP SESSION丟失的解決過程全紀(jì)錄
這篇文章主要介紹了Windows下Apache + PHP SESSION丟失的解決過程全紀(jì)錄,花費(fèi)了很長時間,最終解決的方式卻令人啼笑皆非,郁悶之極。2015-04-04Codeigniter操作數(shù)據(jù)庫表的優(yōu)化寫法總結(jié)
用codeigniter也有一段時間了,一直沒有做什么總結(jié)?,F(xiàn)在總結(jié)一些Codeigniter操作數(shù)據(jù)庫表的優(yōu)化寫法,需要的朋友可以參考下2014-06-06Laravel框架實(shí)現(xiàn)即點(diǎn)即改功能的方法分析
這篇文章主要介紹了Laravel框架實(shí)現(xiàn)即點(diǎn)即改功能的方法,結(jié)合具體實(shí)例形式分析了Laravel框架即點(diǎn)即改功能的實(shí)現(xiàn)原理、步驟及相關(guān)操作技巧,需要的朋友可以參考下2019-10-10