Yii2 Pjax 使用

简介: 参考:Yii2 Pjax TutorialPjax是JQuery的插件,结合ajax和Html5的pushState技术来实现异步刷新,每次通过a标签点击和form表单提交向服务器发送一个指定的请求之后,服务器都会返回需要更新的内容,Pjax会更新老旧内容以及向浏览记录中加入一条新的url而不需要更新刷新整个页面。

参考: Yii2 Pjax Tutorial

Pjax是JQuery的插件,结合ajax和Html5的pushState技术来实现异步刷新,每次通过a标签点击和form表单提交向服务器发送一个指定的请求之后,服务器都会返回需要更新的内容,Pjax会更新老旧内容以及向浏览记录中加入一条新的url而不需要更新刷新整个页面。

Yii2 framework提供了一个Pjax widget帮助我们快速简洁的使用Pjax.
1. 引入Pjax


use yii\widgets\Pjax;
?>
  1. 添加Pjax包裹住需要更新的内容部分
 Pjax::begin(); ?>
这部分内容需要更新
 Pjax::end(); ?>

你也可以选择配置哪个链接和form表单使用Pjax,是否将新的Url添加到浏览记录,替换或者保持原样。如果Pjax没有响应,超时之后页面将会重新加载。

Yii2 Pjax Examples

Refresh

本例是一个简单的点击超链接来实现刷新时间,通过Pjax widget实现异步刷新。这里有一个在线的示例:Demo

 Pjax::begin()?>
=Html::a('刷新时间', ['site/index'], ['class' => 'btn btn-primary'])?>

刷新的时间为:=$time?>

Pjax::end()?>

所有被包裹在Pjax widget中的a标签和form都会发送一个Pjax请求.
控制器渲染和提供数据给页面

public function actionIndex()
{
    
    $time = date('Y-m-d H:i:s', time());
    return $this->render('index', [
        'time' => $time
    ]);
}

Navigation

本例实现多个超链接指向不同的Controller Actions,返回不同的内容,在线示例Demo

 Pjax::begin();?>
=Html::a("显示时间", ['site/time'], ['class' => 'btn btn-primary'])?>
=Html::a("显示日期", ['site/date'], ['class' => 'btn btn-primary'])?>

显示的数据为:=$response?>

Pjax::end();?>

控制器中代码为:

public function actionDate()
{
    
    return $this->render('time-date', [
        'response' => date('Y-m-d')
    ]);
}
public function actionTime()
{
    
    return $this->render('time-date', [
        'response' => date('H:i:s')
    ]);
}

Form提交数据

一个Form表单提交数据的在线示例:Demo,示例中Pjax包裹一个Form表单,里边有一个输入框和提交按钮以及下边的响应数据。
- 注意:Form表单必须添加 data-pjax

 Pjax::begin();?>
=Html::beginForm(['site/submit'], 'post', ['data-pjax' => ''])?>
=Html::textInput('name')?>
=Html::submitButton('加密')?>
= Html::endForm()?> 

返回加密数据:=$hash?>

Pjax::end();?>

控制器中提交代码

public function actionSubmit()
{
    
    $security = new Security();
    $name = Yii::$app->request->post('name');
    $hash = '';
    if(!is_null($name)){
        $hash = $security->generatePasswordHash($name);
    }
    return $this->render('submit', [
        'hash' => $hash
    ]);
}

由于表单是POST请求,pushState没有触发,地址栏Url也不会更新.

禁用pushState

有时候我们需要禁用pushState,更新数据的同时,保持Url不变,在线示例Demo,一个简单的投票示例代码,Pjax配置参数enablePushState需设置为false

 Pjax::begin(['enablePushState' => false]);?>
=Html::a('加一', ['site/upvote'], ['class' => 'btn btn-primary'])?>
=Html::a('减一', ['site/downvote'], ['class' => 'btn btn-primary'])?>

投票数为:=Yii::$app->session->get('vote', 0)?>

Pjax::end();?>

控制器部分投票逻辑

public function actionVote()
{
    
    return $this->render('vote');
}

public function actionUpvote()
{
    
    $vote = Yii::$app->session->get('vote', 0);
    Yii::$app->session->set('vote', ++$vote);
    return $this->render('vote');
}

public function actionDownvote()
{
    
    $vote = Yii::$app->session->get('vote', 0);
    Yii::$app->session->set('vote', --$vote);
    return $this->render('vote');
}

GridView分页

有一个在线的Demo,展示了GridView结合Pjax使排序,过滤,分页异步加载.

 Pjax::begin();?>
=GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        'name'
    ]
])?>
 Pjax::end();?>

控制器中提供数据:

public function actionGrid()
{
    
    $models = [
        ['name' => 123]
    ];
    $dataProvider = new ArrayDataProvider([
        'allModels' => $models,
        'pagination' => [
            'pageSize' => 3
        ]
    ]);

    return $this->render('grid', [
        'dataProvider' => $dataProvider
    ]);
}

结束

好的建议,请告知我。

目录
相关文章
|
消息中间件 物联网
MQTT常见问题之mqtt 报 MqttException:客户机未连接如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
前端开发 JavaScript
😲完了完了,forEach异步执行,怎么后面的先完成了!?
代码review,业务里的代码千奇百怪,到底还能遇到什么呢?oh no,真的有人在forEach里用异步调用!
737 0
|
机器学习/深度学习 数据采集 人工智能
人工智能安全(下)
人工智能安全(下)
899 0
人工智能安全(下)
|
网络协议 API PHP
探索PHP的异步编程:使用ReactPHP实现非阻塞I/O
【8月更文挑战第4天】在传统的同步编程模型中,PHP脚本按顺序执行,每个任务必须等待前一个任务完成后才能开始。这种模式在处理I/O密集型操作时,如网络请求或文件读写,会导致性能瓶颈。异步编程提供了一种解决方案,允许多个操作同时进行,从而提高效率。本文将介绍如何使用ReactPHP库在PHP中实现异步编程,并通过代码示例展示其如何优化I/O操作。
527 1
|
11月前
|
存储 移动开发 程序员
alist对接钉钉sso登录
本文介绍了如何将Alist与钉钉SSO登录对接。Alist是一个基于Go语言开发的文件管理程序,支持多平台和多种存储方式。通过设置自定义头部、配置钉钉开放平台应用及回调参数,并获取Client ID和Client Secret,可实现钉钉SSO登录功能。最后根据需求配置用户权限,默认权限值可通过相加不同权限数字获得。成品展示了一个美观且实用的文件管理系统。
alist对接钉钉sso登录
|
存储 SQL 关系型数据库
OceanBase的架构特点
【8月更文挑战第10天】OceanBase的架构特点
608 66
|
数据管理 大数据 OLAP
AnalyticDB核心概念详解:表、索引与分区
【10月更文挑战第25天】在大数据时代,高效的数据库管理和分析工具变得尤为重要。阿里云的AnalyticDB(ADB)是一款完全托管的实时数据仓库服务,能够支持PB级数据的实时查询和分析。作为一名数据工程师,我有幸在多个项目中使用过AnalyticDB,并积累了丰富的实践经验。本文将从我个人的角度出发,详细介绍AnalyticDB的核心概念,包括表结构设计、索引类型选择和分区策略,帮助读者更有效地组织和管理数据。
540 3
|
前端开发 JavaScript API
Vue3商品SKU多规格编辑组件
Vue3商品SKU多规格编辑组件
781 5
Qt实用技巧:对QPushButton(等类似透明有黑色背景的QWidget实现透明/半透明的方法
Qt实用技巧:对QPushButton(等类似透明有黑色背景的QWidget实现透明/半透明的方法
Qt实用技巧:对QPushButton(等类似透明有黑色背景的QWidget实现透明/半透明的方法
|
前端开发
layui-form
`layui-form`是一个前端表单组件,提供多种表单类型如单行、多行排列的输入框,下拉选择框(支持模糊搜索),单选框和复选框。表单元素可通过`required`和`lay-verify`属性进行必填和验证设置。编辑器如`layedit`可用于富文本输入,表单监听事件如提交和单选器可绑定回调函数进行处理。此外,能动态更新渲染表单,初始化表单数据并进行数据校验,包括自定义验证规则。
528 1