在vendor\yiisoft\yii2\widgets路径下新增文件ListViewtest,将下列代码粘贴并保存

<?php

namespace yii\widgets;

use Yii;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;

class ListViewtest extends ListView
{
/**
* Renders a single data model.
* @param mixed $model the data model to be rendered
* @param mixed $key the key value associated with the data model
* @param integer $index the zero-based index of the data model in the model array returned by dataProvider.
* @return string the rendering result
*/

public $options = [];//列表外侧的div,可有属性class,id 等
public $num;//计数器
public $itemView_top;//前面几个模板
public $real_itemView;//后面的后续模板
public $num_top;//使用前模板的个数
public $start_num;//起始数值
public $div_allowed;//是否允许用div框住
public $extra;
public $front_moban;

//构析函数,注销变量
public function __destruct() {
  global $options;
  global $num;
  global $itemView_top;
  global $real_itemView;
  global $num_top;
  global $start_num;
  global $front_tag;

  $options = [];
  $num = 0;
  $itemView_top = null;
  $real_itemView = null;
  $num_top = null;
  $start_num = null;
  $front_tag =null;
}

public function run()
{
  if ($this->showOnEmpty || $this->dataProvider->getCount() > 0) {
    $content = preg_replace_callback("/{\\w+}/", function ($matches) {

      $content = $this->renderSection($matches[0]);

      return $content === false ? $matches[0] : $content;
    }, $this->layout);

  } else {
    $content = $this->renderEmpty();
  }

  if ($this->div_allowed === true) {
    $options = $this->options;
    $tag = ArrayHelper::remove($options, 'tag', 'div');
    echo Html::tag($tag, $content, $options);
  }else{
    echo $content;
  }

}

public function renderItems()
{

  global $options;
  global $num;
  global $itemView_top;
  global $real_itemView;
  global $num_top;

  //给初始计数赋值
  $this->start_num = isset($this->start_num)?$this->start_num:0;
  $num = $this->start_num;

  //若只用一套模板,则上下两套模板一致
  if (!isset($this->itemView_top)) {
    $this->itemView_top = $this->itemView;
  }

  $back_tag = $this->front_moban['flag']===true?$this->front_moban['tag_back']:null;

  $models = $this->dataProvider->getModels();
  $keys = $this->dataProvider->getKeys();
  $rows = [];
  foreach (array_values($models) as $index => $model) {
    $rows[] = $this->renderItem($model, $keys[$index], $index);
  }

  return implode($this->separator, $rows).$back_tag;
}

public function renderItem($model, $key, $index)
{
  global $num;//计数
  //global $itemView_top;//储存模板
  global $num_top;
  global $real_itemView;
  global $front_tag;

  if ($num==$this->start_num) {

    $real_itemView = $this->itemView;//暂存模板
    $this->itemView = $this->itemView_top;//赋予新模板
    $front_tag = '';

  }elseif($num == ($this->start_num+$this->num_top)){

    $this->itemView = $real_itemView;//调用原模板
    $front_tag = $this->front_moban['flag'] === true?$this->front_moban['tag_front']:'';

  }elseif($num>($this->start_num+$this->num_top)){

    $this->itemView = $real_itemView;//调用原模板
    $front_tag = '';

  }

  if ($this->itemView === null) {
    $content = $key;
  } elseif (is_string($this->itemView)) {
    $content = $this->getView()->render($this->itemView, array_merge([
      'model' => $model,
      'key' => $key,
      'index' => $index,
      'widget' => $this,
    ], $this->viewParams));
  } else {
    $content = call_user_func($this->itemView, $model, $key, $index, $this);
  }

  $options = $this->itemOptions;

  $tag = ArrayHelper::remove($options, 'tag', 'li');

  $num++;

  if ($this->extra['flag'] === true) {
    if (($num-$this->start_num)%$this->extra['num'] == 0) {
      return $front_tag.str_replace('{num}', ($num<10?'0'.$num:$num), $content).$this->extra['tag'];
    }else{
      return $front_tag.str_replace('{num}', ($num<10?'0'.$num:$num), $content);
    }  
  }else{
    return $front_tag.str_replace('{num}', ($num<10?'0'.$num:$num), $content);
  }




// }
}
}

在视图模板中调用这个ListViewtest

<?php
use yii\widgets\ListViewtest;
?>

<?=ListViewtest::widget([

  'layout' => "{items}\n{pager}",
  'dataProvider' => $dataProvider,
  'itemView' => '_test',//子视图
  'itemView_top' => '_test1',//top模板
  'num_top' => 1,//使用top模板的数目
  'start_num' => 10,//从第几开始计数?默认0

  //调用原模板(itemView模板,非itemView_top模板)时前后包夹标签
  'front_moban' => [
    'flag' => true,        //开关,默认关
    'tag_front' => '<front>',   //前标签
    'tag_back' => '</front>',   //后标签 
  ],

  //每打印多少条数据的末尾,出现一次html标签
  'extra' => [
    'flag' => false,   //开关,默认关
    'tag' => '<hr>',  //该标签
    'num' => 5,     //条数
  ]

  //是否允许用div框住,默认否

  'div_allowed' => true,

  'options' => [  //该div的属性
    'class' => null,
    'id' => 'eee',
  ]

]);?>

改写yii2的listview功能的更多相关文章

  1. Yii2之ListView小部件

    ListView是yii框架中类似GridView,也是用于展示多条数据的小部件,相比GridView,ListView可以更加灵活地设置数据展示的格式. 下面以我自己做的一个使用ListView来展 ...

  2. android listView功能简介

    本文参考连接:http://blog.csdn.net/kesenhoo/article/details/7196920 android中listView是非常常用的组建,下边就经常用到的功能做一下简 ...

  3. android——ListView功能的实现

    1.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...

  4. 简单分析下用yii2的yii\helpers\Html类和yii.js实现的post请求

    yii2提供了很多帮助类,比如Html.Url.Json等,可以很方便的实现一些功能,下面简单说下这个Html.用yii2写view时时经常会用到它,今天在改写一个页面时又用到了它.它比较好用的地方就 ...

  5. Yii2.0登录详解(下)

    在上一篇博文中,笔者讲述了yii2应用用户登陆的基本方法,但是这些方法到底是怎样实现登陆的呢?底层的原理到底是什么?在这篇博文笔者将从Yii的源码角度分析登陆的基本原理以及cookie自动登陆的原理, ...

  6. ListView中响应item的点击事件并且刷新界面

    ---恢复内容开始--- 最近在在实现listview功能中遇到了这个问题: 点击事件写在了adapter的item中,不知道如何在listview的点击事件中更新数据的显示: 总结:1.要使用not ...

  7. listView 分页加载数据

    Android应用 开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页 的形式来展示数据,个人觉得这样会有 ...

  8. 基于Jquery UI的autocompelet改写,自动补全控件,增加下拉选项,动态设置样式,点击显示所有选项,并兼容ie6+

    Jquery UI的autocompelete改写 注意:实现功能,除了原版的自动补全内容外,增加一个点击显示所有选项,样式能动态设置. 加载数据的来源为后台数据库读取. 具体代码如下: 引用 从官方 ...

  9. 面向对象的一小步:添加ActiveRecord的Scope功能

    问题场景 我们用Yii2的ActiveRecord功能非常的方便,假如我们有个Model叫Student,那么ActiveQuery可以通过这种方式轻便地获得: $query = Student::f ...

随机推荐

  1. JSONObject、JSONArray区别

    json,就是一个键对应一个值,超级简单的一对一关系.现在用到的json那可以层层嵌套啊,刚开始接触的时候,确实有种崩溃的赶脚,不想去理,取个数据还那么麻烦.其实,就跟if else语句一样,如果if ...

  2. 浏览器兼容性-JS篇

    总结一下平时遇到的浏览器兼容性问题,本篇关于JS. 1.事件绑定 兼容写法: function add(obj,event){ if (obj.addEventListener) { obj.addE ...

  3. Allegro之Enhance pad Entry(增强焊盘进入约束功能)的使用

    pcb布线时,有时候会从器件的焊盘往外拉线,为了避免出现类似情况 出现锐角焊盘内绕线等等 可在add connect操作下,右键勾选Enhance pad Entry来增强焊盘进入的约束,可有效防止上 ...

  4. WPF整理-处理没有注意到的异常

    在.NET中,我们使用try-catch-finally来处理异常.但,当一个Exception抛出,抛出Exception的代码又没有被try包围时,程序就崩溃了. 这些异常往往是你没有注意到的.在 ...

  5. 关于shiro

    1.1  简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Securi ...

  6. 玩转SQL Server复制回路の变更数据类型、未分区表转为分区表

    玩转SQL Server复制回路の变更数据类型.未分区表转为分区表 复制的应用: 初级应用:读写分离.数据库备份 高级应用:搬迁大型数据库(跨机房).变更数据类型.未分区表转为分区表 京东的复制专家 ...

  7. Java NIO6:选择器2---代码篇

    选择器服务器端代码 上一篇文章毫无条理地讲了很多和选择器相关的知识点,下面进入实战,看一下如何写和使用选择器实现服务端Socket数据接收的程序,这也是NIO中最核心.最精华的部分. 看一下代码: p ...

  8. MySQL 子分区

    200 ? "200px" : this.width)!important;} --> 介绍 子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区 ...

  9. 论HTML5 Audio 标签歌词同步的实现

    HTML5草案里面其实有原生的字幕标签(<track> Tag)的,但使用的是vtt格式的文件,非常规的字幕(.sub, .srt)或歌词文件(.lrc). 用法如下(代码来自W3Scho ...

  10. 用java开发微信公众号:测试公众号与本地测试环境搭建(一)

    本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...