2019-12-12 symfony 分页异步加载

可以参考一下

js文件:

// 搜索
$('#search').on('click', function () {
  let title = 'title=' + $('#title').val();
  let param = title + '&' + $('#urlParameter').val();
  let url = $(this).attr('data-url') + '?' + param;
  getExamList(url);
});

// 分页
$('div[data-role="market"]').on('click', 'li', function () {
  let url = $(this).data('url');
  let title = 'title=' + $('#title').val();
  if (url.split('?').length === 1) {
    url = url + title + '&' + $('#urlParameter').val();
  } else {
    url = url + '&' + title + '&' + $('#urlParameter').val();
  }
  getExamList(url);
});

function getExamList(url) {
  let context = $('div[data-role="market"]');

  $.get(url, function (data) {
    context.html(data);
  }).fail(function () {
    let loading = '<div class="empty" colspan="10" style="color:#999;padding:80px;">' + Translator.trans('加载出错...') + '</div>';
    context.html(loading);
  });
}

yml文件(routing):

    role_play_exam_list:
      path:  /role_play_exam_list
      defaults: { _controller: CorporateTrainingBundle:Activity/RolePlay:searchRolePlayList }

php文件(controller):

    public function searchCourseSet(Request $request){
        $conditions = $request->request->all();
        $selectedConditions = array('title', 'page', 'pageSize', 'category', 'subCategory', 'selectedthirdLevelCategory');
        $conditions = ArrayToolkit::parts($conditions, $selectedConditions);// 过滤数据

        $total = $this->getRolePlayService()->searchRolePlays($conditions);
        $paginator = new Paginator($request, $total, 20 );
        // 设置分页跳转的页面, 若有需要
        // $paginator->setBaseUrl($this->generateUrl('role_play_exam_list'));

        $exams = $this->getRolePlayService()->searchRolePlays(
            $conditions,
            array(),//  array('id' => 'DESC'),
            $paginator->getOffsetCount(),
            $paginator->getPerPageCount()
        );

        return $this->render(
            'activity/role-play/table.html.twig',
            array(
                'exams' => $exams,
                'paginator' => $paginator,
            )
        );
    }

twig文件:

{#  导入ajax分页器 #}
{% import "macro.html.twig" as web_macro %}   

……

{#  twig 调用 #}
      <button id="search" data-url="{{ path('role_play_exam_list') }}" type="submit">搜索</button>

<div data-role="market">
      {#  tiwg 显示 #}
      {{ render(controller('CorporateTrainingBundle:Activity/RolePlay:searchRolePlayList')) }}
</div>

……

{# ajax分页器使用 #}
{{ web_macro.ajax_paginator(paginator) }}

macro.html.twig中的ajax_paginator部分

{% macro ajax_paginator(paginator, class)  %}
  <input class="js-page" type="hidden" name="page" value="{{ paginator.currentPage|default(1) }}">

  {% if paginator.lastPage > 1 %}
    <nav class="{{ class|default('text-center') }}">
      <ul class="pagination cd-pagination">
        {% if paginator.currentPage != paginator.firstPage %}
          <li data-url="{{ paginator.getPageUrl(paginator.firstPage) }}" data-page="{{paginator.firstPage}}"><a href="javascript:;"><i class="cd-icon cd-icon-first-page"></i></a></li>
          <li data-url="{{ paginator.getPageUrl(paginator.previousPage) }}" data-page="{{paginator.previousPage}}"><a  href="javascript:;"><i class="cd-icon cd-icon-arrow-left"></i></a></li>
        {% endif %}
        {% for page in paginator.pages %}
          <li {% if page == paginator.currentPage %}class="active"{% endif %} data-url="{{ paginator.getPageUrl(page) }}" data-page="{{page}}"><a href="javascript:;">{{ page }}</a></li>
        {% endfor %}

        {% if paginator.currentPage != paginator.lastPage %}
          <li data-url="{{ paginator.getPageUrl(paginator.nextPage) }}" data-page="{{paginator.nextPage}}"><a  href="javascript:;"><i class="cd-icon cd-icon-arrow-right"></i></a></li>
          <li data-url="{{ paginator.getPageUrl(paginator.getLastPage) }}" data-page="{{paginator.getLastPage}}"><a  href="javascript:;"><i class="cd-icon cd-icon-last-page"></i></a></li>
        {% endif %}
      </ul>
    </nav>
  {% endif %}
{% endmacro %}

Paginator类

<?php

namespace AppBundle\Common;

class Paginator
{
    protected $itemCount;

    protected $perPageCount;

    protected $currentPage;

    protected $pageRange = 10;

    protected $baseUrl;

    protected $pageKey = 'page';

    public function __construct($request, $total, $perPage = 20)
    {
        $this->setItemCount($total);
        $this->setPerPageCount($perPage);

        $page = (int) $request->query->get('page');

        $maxPage = ceil($total / $perPage) ?: 1;
        $this->setCurrentPage($page <= 0 ? 1 : ($page > $maxPage ? $maxPage : $page));

        $this->setBaseUrl($request->server->get('REQUEST_URI'));
    }

    public function setItemCount($count)
    {
        $this->itemCount = $count;

        return $this;
    }

    public function setPerPageCount($count)
    {
        $this->perPageCount = $count;

        return $this;
    }

    public function getPerPageCount()
    {
        return $this->perPageCount;
    }

    public function setCurrentPage($page)
    {
        $this->currentPage = $page;

        return $this;
    }

    public function setPageRange($range)
    {
        $this->pageRange = $range;

        return $this;
    }

    public function setBaseUrl($url)
    {
        $template = '';

        $urls = parse_url($url);
        $template .= empty($urls['scheme']) ? '' : $urls['scheme'].'://';
        $template .= empty($urls['host']) ? '' : $urls['host'];
        $template .= empty($urls['path']) ? '' : $urls['path'];

        if (isset($urls['query'])) {
            parse_str($urls['query'], $queries);
            $queries['page'] = '..page..';
        } else {
            $queries = array('page' => '..page..');
        }
        $template .= '?'.http_build_query($queries);

        $this->baseUrl = $template;
    }

    public function getPageUrl($page)
    {
        return str_replace('..page..', $page, $this->baseUrl);
    }

    public function getPageRange()
    {
        return $this->pageRange;
    }

    public function getCurrentPage()
    {
        return $this->currentPage;
    }

    public function getFirstPage()
    {
        return 1;
    }

    public function getLastPage()
    {
        return ceil($this->itemCount / $this->perPageCount);
    }

    public function getPreviousPage()
    {
        $diff = $this->getCurrentPage() - $this->getFirstPage();

        return $diff > 0 ? $this->getCurrentPage() - 1 : $this->getFirstPage();
    }

    public function getNextPage()
    {
        $diff = $this->getLastPage() - $this->getCurrentPage();

        return $diff > 0 ? $this->getCurrentPage() + 1 : $this->getLastPage();
    }

    public function getOffsetCount()
    {
        return ($this->getCurrentPage() - 1) * $this->perPageCount;
    }

    public function getItemCount()
    {
        return $this->itemCount;
    }

    public function getPages()
    {
        $previousRange = round($this->getPageRange() / 2);
        $nextRange = $this->getPageRange() - $previousRange - 1;

        $start = $this->getCurrentPage() - $previousRange;
        $start = $start <= 0 ? 1 : $start;

        $pages = range($start, $this->getCurrentPage());

        $end = $this->getCurrentPage() + $nextRange;
        $end = $end > $this->getLastPage() ? $this->getLastPage() : $end;

        if ($this->getCurrentPage() + 1 <= $end) {
            $pages = array_merge($pages, range($this->getCurrentPage() + 1, $end));
        }

        return $pages;
    }

    public static function toArray(Paginator $paginator)
    {
        return array(
            'firstPage' => $paginator->getFirstPage(),
            'currentPage' => $paginator->getCurrentPage(),
            'firstPageUrl' => $paginator->getPageUrl($paginator->getFirstPage()),
            'previousPageUrl' => $paginator->getPageUrl($paginator->getPreviousPage()),
            'pages' => $paginator->getPages(),
            'pageUrls' => array_map(function ($page) use ($paginator) { return $paginator->getPageUrl($page); }, $paginator->getPages()),
            'lastPageUrl' => $paginator->getPageUrl($paginator->getLastPage()),
            'lastPage' => $paginator->getLastPage(),
            'nextPageUrl' => $paginator->getPageUrl($paginator->getNextPage()),
        );
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容