/** * {@inheritdoc} */ public function register(Application $app) { if (!isset($app['twig'])) { $app->register(new TwigServiceProvider()); } if (!isset($app['url_generator'])) { $app->register(new UrlGeneratorServiceProvider()); } if (!isset($app['translator'])) { $app->register(new TranslationServiceProvider()); } // add twig extension. $app['twig'] = $app->share($app->extend('twig', function ($twig, $app) { $processor = new Processor($app['url_generator'], $app['translator']); $twig->addExtension(new PaginationExtension($processor)); return $twig; })); $app['knp_paginator.path'] = __DIR__ . '/../../../../knplabs/knp-paginator-bundle'; $app['knp_paginator.limits'] = [2, 5, 10, 25, 50, 100, 200, 500]; $app['knp_paginator.options'] = []; // Options fixer $app['knp_paginator.options_fixer'] = $app->share(function ($app) { $app['knp_paginator.options'] = array_replace_recursive(['default_options' => ['sort_field_name' => 'sort', 'sort_direction_name' => 'direction', 'filter_field_name' => 'filterField', 'filter_value_name' => 'filterValue', 'page_name' => 'page', 'distinct' => true], 'template' => ['pagination' => '@knp_paginator_bundle/sliding.html.twig', 'filtration' => '@knp_paginator_bundle/filtration.html.twig', 'sortable' => '@knp_paginator_bundle/sortable_link.html.twig'], 'page_range' => 5], $app['knp_paginator.options']); }); // Paginator creator $app['knp_paginator'] = $app->share(function ($app) { $views = rtrim($app['knp_paginator.path'], '/') . '/Resources/views/Pagination'; /** @var \Twig_Loader_Filesystem $loader */ $loader = $app['twig.loader']; $loader->addPath($views, 'knp_paginator_bundle'); // Fix options $app['knp_paginator.options_fixer']; // Create paginator $paginator = new Paginator($app['dispatcher']); $options = ['pageParameterName' => $app['knp_paginator.options']['default_options']['page_name'], 'sortFieldParameterName' => $app['knp_paginator.options']['default_options']['sort_field_name'], 'sortDirectionParameterName' => $app['knp_paginator.options']['default_options']['sort_direction_name'], 'filterFieldParameterName' => $app['knp_paginator.options']['default_options']['filter_field_name'], 'filterValueParameterName' => $app['knp_paginator.options']['default_options']['filter_value_name'], 'distinct' => $app['knp_paginator.options']['default_options']['distinct']]; $paginator->setDefaultPaginatorOptions($options); return $paginator; }); // Event subscribers.= $app['knp_paginator.pagination_subscriber'] = $app->share(function ($app) { return new PaginationSubscriber(); }); $app['knp_paginator.sortable_subscriber'] = $app->share(function ($app) { return new SortableSubscriber(); }); $app['knp_paginator.filtration_subscriber'] = $app->share(function ($app) { return new FiltrationSubscriber(); }); $app['knp_paginator.sliding_pagination_subscriber'] = $app->share(function ($app) { // Fix options $app['knp_paginator.options_fixer']; return new SlidingPaginationSubscriber(['defaultPaginationTemplate' => $app['knp_paginator.options']['template']['pagination'], 'defaultSortableTemplate' => $app['knp_paginator.options']['template']['sortable'], 'defaultFiltrationTemplate' => $app['knp_paginator.options']['template']['filtration'], 'defaultPageRange' => $app['knp_paginator.options']['page_range']]); }); }
/** * @param AbstractQuery $query * @param IndexDefinitionInterface $index * @param Request $request * @return PaginationInterface */ public function getGrid(AbstractQuery $query, IndexDefinitionInterface $index, Request $request) { $sortDirection = $request->get('direction', IndexDefinitionInterface::SORT_ASC); $sortColumn = $request->get('sort'); if (!in_array($sortDirection, [IndexDefinitionInterface::SORT_ASC, IndexDefinitionInterface::SORT_DESC])) { throw new CrudifyException("Invalid sorting direction {$sortDirection}"); } if (null !== $sortColumn && !$index->hasColumnWithField($sortColumn)) { throw new CrudifyException("No such column '{$sortColumn}' in definition."); } if (null !== $sortColumn && !$index->getColumnWithField($sortColumn)->isSortable()) { throw new CrudifyException("Not allowed to sort column '{$sortColumn}'."); } /** @var SlidingPagination $pagination */ $pagination = $this->paginator->paginate($query, $request->get('page', 1), $index->getObjectsPerPage()); if (null !== $index->getDefaultSortColumn()) { $pagination->setParam('sort', $index->getDefaultSortColumn()->getField()); $pagination->setParam('direction', $index->getDefaultSortDirection()); } if (null !== $sortColumn) { $pagination->setParam('sort', $sortColumn); $pagination->setParam('direction', $sortDirection); } $pagination->setTemplate($index->getParent()->getTemplates()->getPagination()); $pagination->setSortableTemplate($index->getParent()->getTemplates()->getSortable()); return $pagination; }
/** * @param $data * @param $currentPage * @param $limitPerPage * @param $options */ public function paginate($data, $currentPage = 1, $limitPerPage = 10, $options = array()) { $paginator = new KnpPaginator(); if ($currentPage === null) { $currentPage = 1; } if (!isset($options['searchParameter'])) { $options['searchParameter'] = 'search'; } // Temporary solution. We'll try to figure out a better one soon! $searchFields = isset($options['searchFields']) ? $options['searchFields'] : false; $searchValue = $this->app['request']->query->get($options['searchParameter'], false); if ($searchFields && !$data instanceof QueryBuilder) { throw new \Exception('If you want to use search, you MUST use the QueryBuilder!'); } if ($searchFields && $searchValue) { if (is_string($searchFields)) { $searchFields = explode(',', $searchFields); } foreach ($searchFields as $searchFieldKey => $searchField) { $data->orWhere($searchField . ' LIKE ?' . $searchFieldKey)->setParameter($searchFieldKey, '%' . $searchValue . '%'); } } $pagination = $paginator->paginate($data, $currentPage, $limitPerPage, $options); return $pagination; }
/** * @test */ function shouldSupportPaginateStrategySubscriber() { $query = $this->getMockDocumentManager()->createQueryBuilder('Test\\Fixture\\Document\\Article')->getQuery(); $p = new Paginator(); $pagination = $p->paginate($query, 1, 10); $this->assertTrue($pagination instanceof SlidingPagination); }
/** * {@inheritdoc} */ public function register(Container $app) { $app['paginator.default_options'] = ['page_name' => 'page', 'page_range' => 5, 'sort_field_name' => 'sort', 'sort_direction_name' => 'direction', 'filter_field_name' => 'filterField', 'filter_value_name' => 'filterValue', 'distinct' => true, 'template' => ['pagination' => 'sliding.html.twig', 'sortable' => 'sortable_link.html.twig', 'filtration' => 'filtration.html.twig']]; $app['paginator.helper.processor'] = function ($app) { return new Processor($app['url_generator'], $app['translator']); }; $app['paginator'] = function ($app) { $reflClass = new \ReflectionClass('Knp\\Bundle\\PaginatorBundle\\KnpPaginatorBundle'); $path = sprintf('%s/Resources/views/Pagination', dirname($reflClass->getFileName())); $app['twig.loader']->addLoader(new \Twig_Loader_Filesystem($path)); $paginator = new Paginator($app['dispatcher']); $paginator->setDefaultPaginatorOptions(['pageParameterName' => $app['paginator.default_options']['page_name'], 'sortFieldParameterName' => $app['paginator.default_options']['sort_field_name'], 'sortDirectionParameterName' => $app['paginator.default_options']['sort_direction_name'], 'filterFieldParameterName' => $app['paginator.default_options']['filter_field_name'], 'filterValueParameterName' => $app['paginator.default_options']['filter_value_name'], 'distinct' => $app['paginator.default_options']['distinct']]); return $paginator; }; $app['paginator.subscriber.paginate'] = function () { return new PaginationSubscriber(); }; $app['paginator.subscriber.sortable'] = function () { return new SortableSubscriber(); }; $app['paginator.subscriber.filtration'] = function () { return new FiltrationSubscriber(); }; $app['paginator.subscriber.sliding_pagination'] = function ($app) { $templateOptions = $app['paginator.default_options']['template']; $options = ['defaultPaginationTemplate' => $templateOptions['pagination'], 'defaultSortableTemplate' => $templateOptions['sortable'], 'defaultFiltrationTemplate' => $templateOptions['filtration'], 'defaultPageRange' => $app['paginator.default_options']['page_range']]; return new SlidingPaginationSubscriber($options); }; $app->extend('twig', function (\Twig_Environment $twig, $app) { $twig->addExtension(new PaginationExtension($app['paginator.helper.processor'])); return $twig; }); }
/** * @test */ function shouldCustomizeParameterNames() { $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new MockPaginationSubscriber()); // pagination view $dispatcher->addSubscriber(new ArraySubscriber()); $p = new Paginator($dispatcher); $items = array('first', 'second'); $view = $p->paginate($items, 1, 10); // test default names first $this->assertEquals('page', $view->getPaginatorOption('pageParameterName')); $this->assertEquals('sort', $view->getPaginatorOption('sortFieldParameterName')); $this->assertEquals('direction', $view->getPaginatorOption('sortDirectionParameterName')); $this->assertTrue($view->getPaginatorOption('distinct')); $this->assertNull($view->getPaginatorOption('sortFieldWhitelist')); // now customize $options = array('pageParameterName' => 'p', 'sortFieldParameterName' => 's', 'sortDirectionParameterName' => 'd', 'distinct' => false, 'sortFieldWhitelist' => array('a.f', 'a.d')); $view = $p->paginate($items, 1, 10, $options); $this->assertEquals('p', $view->getPaginatorOption('pageParameterName')); $this->assertEquals('s', $view->getPaginatorOption('sortFieldParameterName')); $this->assertEquals('d', $view->getPaginatorOption('sortDirectionParameterName')); $this->assertFalse($view->getPaginatorOption('distinct')); $this->assertEquals(array('a.f', 'a.d'), $view->getPaginatorOption('sortFieldWhitelist')); // change default paginator options $p->setDefaultPaginatorOptions(array('pageParameterName' => 'pg', 'sortFieldParameterName' => 'srt', 'sortDirectionParameterName' => 'dir')); $view = $p->paginate($items, 1, 10); $this->assertEquals('pg', $view->getPaginatorOption('pageParameterName')); $this->assertEquals('srt', $view->getPaginatorOption('sortFieldParameterName')); $this->assertEquals('dir', $view->getPaginatorOption('sortDirectionParameterName')); $this->assertTrue($view->getPaginatorOption('distinct')); }
/** * @test */ function shouldSupportPaginateStrategySubscriber() { $query = $this->getMockSqliteEntityManager()->createQuery('SELECT a FROM Test\\Fixture\\Entity\\Article a'); $p = new Paginator(); $view = $p->paginate($query, 1, 10); $this->assertTrue($view instanceof PaginationInterface); }
/** * @test */ function shouldSupportPaginateStrategySubscriber() { $items = new ArrayCollection(array('first', 'second')); $p = new Paginator(); $view = $p->paginate($items, 1, 10); $this->assertTrue($view instanceof PaginationInterface); }
public function findAllPaginate($pagina, $limit) { $dql = "SELECT r FROM EMLRecetaBundle:Receta r ORDER BY r.id DESC"; $recetas = $this->_em->createQuery($dql); $pagination = $this->paginator->paginate($recetas, $pagina, $limit); return $pagination; }
/** * @test * @expectedException RuntimeException */ function shouldFailToPaginateUnsupportedValue() { $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new PaginationSubscriber()); $p = new Paginator($dispatcher); $view = $p->paginate(null, 1, 10); }
/** * @test */ function shouldSortOnAnyField() { $_GET['sort'] = '"title\''; $_GET['direction'] = 'asc'; $query = $this->getMockDocumentManager()->createQueryBuilder('Test\\Fixture\\Document\\Article')->getQuery(); $p = new Paginator(); $view = $p->paginate($query, 1, 10); }
/** * @test */ function shouldPaginateArrayObject() { $items = array('first', 'second'); $array = new \ArrayObject($items); $p = new Paginator(); $view = $p->paginate($array, 1, 10); $this->assertTrue($view instanceof PaginationInterface); }
/** * @Route("/", bind="example_list") * @return string */ public function listAction(Request $request) { /** @var EntityRepository $repo */ $repo = $this->doctrine->getManager()->getRepository(get_class(new Example())); $qb = $repo->createQueryBuilder('e'); $examples = $this->paginator->paginate($qb, $request->query->get('page', 1), 10); return $this->twig->render('@VendorSkeleton/Example/list.html.twig', array('examples' => $examples)); }
/** * $params = [ * service => String, service name that created queue item * from => DateTime, stating time to search items for * to => DateTime, ending time to search items for * user => User, user entity who created this queue item * ] * * @param Paginator $paginator * @param [] $params * @param integer $activePage * @param integer $itemsPerPage * * @return type */ public function findByParamsWithPagination(Paginator $paginator, $params, $orderBy = [], $activePage = 1, $itemsPerPage = 10) { $qb = $this->_em->createQueryBuilder(); $qb->select('q'); $qb->from($this->_em->getRepository('CoreBundle:Queue')->getClassName(), 'q'); $qb->where('1 = 1'); if (isset($params['service'])) { $qb->andWhere('q.service = :service'); $qb->setParameter('service', $params['service']); } $ids = null; // Такой вот некрасивый код, чтобы фильтровать Queue по дате. // Одним запросом DQL мы это сделать не можем, т.к. связи между Queue и // QueueLog нет, а скатившись на уровень Plain SQL нам придется отказаться // от пагинации. if (isset($params['from']) || isset($params['to']) || isset($params['user'])) { $dateFrom = isset($params['from']) ? $params['from'] : null; $dateTo = isset($params['to']) ? $params['to'] : null; $user = isset($params['user']) ? $params['user'] : null; $qbql = $this->_em->createQueryBuilder(); $qbql->select('ql.queue'); $qbql->from($this->_em->getRepository('CoreBundle:QueueLog')->getClassName(), 'ql'); $qbql->where('1 = 1'); if (isset($params['service'])) { $qbql->andWhere('ql.service = :service'); $qbql->setParameter('service', $params['service']); } if (!empty($user)) { $qbql->andWhere('ql.userId = :user'); $qbql->setParameter('user', $user); } if (!empty($dateFrom)) { $qbql->andWhere('ql.createdAt >= :from'); $qbql->setParameter('from', $dateFrom); } if (!empty($dateTo)) { $qbql->andWhere('ql.createdAt < :to'); $qbql->setParameter('to', $dateTo); } $result = $qbql->getQuery()->getResult(); foreach ($result as $item) { $ids[] = $item->getId(); } //$ids = array_map('current', $result); } if (is_array($ids)) { $qb->andWhere('q.id IN (:ids)'); $qb->setParameter('ids', $ids); } foreach ($orderBy as $sort => $order) { if (in_array($sort, ['id', 'status'])) { $qb->addOrderBy('q.' . $sort, $order); } } $pagination = $paginator->paginate($qb, $activePage, $itemsPerPage); return $pagination; }
/** * @test * @expectedException RuntimeException * @expectedExceptionMessage One of listeners must count and slice given target */ function testArrayShouldNotBeHandled() { $array = array('results' => array(0 => array('city' => 'Lyon', 'market' => 'E'), 1 => array('city' => 'Paris', 'market' => 'G')), 'nbTotalResults' => 2); $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new SolariumQuerySubscriber()); $dispatcher->addSubscriber(new MockPaginationSubscriber()); $p = new Paginator($dispatcher); $p->paginate($array, 1, 10); }
/** * @test */ function shouldPaginate() { $this->populate(); $query = $this->dm->createQueryBuilder('Test\\Fixture\\Document\\Image')->getQuery(); $p = new Paginator(); $view = $p->paginate($query, 1, 10); $cursor = $query->execute(); $this->assertEquals(4, count($view->getItems())); }
/** * @test * @expectedException RuntimeException * @expectedExceptionMessage One of listeners must count and slice given target */ function testArrayShouldNotBeHandled() { $array = array(1 => 'foo', 2 => 'bar'); $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new SolariumQuerySubscriber()); $dispatcher->addSubscriber(new MockPaginationSubscriber()); $p = new Paginator($dispatcher); $p->paginate($array, 1, 10); }
/** * @Route() * @Method("GET") * @Template(":Todo/Search:index.html.twig") * * @param Request $request */ public function indexAction(Request $request) { $search = new TodoList(); $form = $this->formFactory->create('todo_list', $search); $form->handleRequest($request); /** @var SlidingPagination $pagination */ $pagination = $this->paginator->paginate($this->todoRepository->getPaginateQuery($search), (int) $request->get('page', 1), 10, ['defaultSortFieldName' => 'a.id', 'defaultSortDirection' => 'desc']); return ['pagination' => $pagination]; }
public function paginate($data, $currentPage = 1, $limitPerPage = 10, $options = array()) { $paginator = new KnpPaginator(); if ($currentPage == null) { $currentPage = 1; } $pagination = $paginator->paginate($data, $currentPage, $limitPerPage, $options); return $pagination; }
public function searchAction() { $phrase = $this->request->get('search_type[phrase]', false, true); if (empty($phrase)) { return $this->render('ValantirForumBundle:Search:search-result.html.twig', array('phrase' => $phrase)); } $searchQuery = $this->getTopicManager()->findWith($phrase); $pagination = $this->paginator->paginate($searchQuery, $this->request->get('page', 1), 10, array('wrap-queries' => true)); return $this->render('ValantirForumBundle:Search:search-result.html.twig', array('topics' => $pagination, 'phrase' => $phrase)); }
/** * @test */ function shouldBeHandledByQueryHintByPassingCount() { $p = new Paginator(); $em = $this->getMockSqliteEntityManager(); $count = $em->createQuery('SELECT COUNT(c) FROM Test\\Fixture\\Entity\\Composite c')->getSingleScalarResult(); $query = $em->createQuery('SELECT c FROM Test\\Fixture\\Entity\\Composite c')->setHint('knp_paginator.count', $count); $view = $p->paginate($query); $items = $view->getItems(); $this->assertEquals(0, count($items)); }
/** * {@inheritdoc} */ public function paginate($target, $page = 1, $limit = 10) { if (null === $this->paginator) { throw new \LogicException(sprintf('Knp\\Component\\Pager\\Paginator not injected in constructor of %s', __CLASS__)); } $this->page = $page; $this->pager = $this->paginator->paginate($target, $page, $limit, array('distinct' => true)); $this->data = $this->pager->getPaginationData(); return $this; }
/** * @test */ function shouldBeHandledByQueryHintByPassingCount() { $p = new Paginator(); $em = $this->getMockSqliteEntityManager(); $count = $em->createQuery('SELECT COUNT(c) FROM Test\\Fixture\\Entity\\Composite c')->getSingleScalarResult(); $query = $em->createQuery('SELECT c FROM Test\\Fixture\\Entity\\Composite c')->setHint('knp_paginator.count', $count); $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, false); $view = $p->paginate($query, 1, 10, array('wrap-queries' => true)); $items = $view->getItems(); $this->assertEquals(0, count($items)); }
/** * @test */ function shouldGiveCustomParametersToPaginationView() { $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new CustomParameterSubscriber()); $dispatcher->addSubscriber(new MockPaginationSubscriber()); // pagination view $p = new Paginator($dispatcher); $items = array('first', 'second'); $view = $p->paginate($items, 1, 10); $this->assertEquals('val', $view->getCustomParameter('test')); $this->assertNull($view->getCustomParameter('nonExisting')); }
/** * Paginate the lists. * * @param ThreadListEvent $event */ public function onPageList(ThreadListEvent $event) { $statement = $event->getStatement(); if (!$statement->supportPagination()) { return; } $page = $event->getRequest()->get($this->pageParameterName); if (!$page || !is_numeric($page)) { $page = 1; } $pagination = $this->paginator->paginate($statement->getPaginationResource(), $page, 20); $event->setList($pagination); }
/** * @test */ function shouldSupportPaginateStrategySubscriber() { $this->populate(); $qb = $this->getMockDocumentManager()->createQueryBuilder('Test\\Fixture\\Document\\Article'); $p = new Paginator(); $pagination = $p->paginate($qb, 1, 2); $this->assertEquals(1, $pagination->getCurrentPageNumber()); $this->assertEquals(2, $pagination->getItemNumberPerPage()); $this->assertEquals(4, $pagination->getTotalItemCount()); $items = array_values($pagination->getItems()); $this->assertEquals(2, count($items)); $this->assertEquals('summer', $items[0]->getTitle()); $this->assertEquals('winter', $items[1]->getTitle()); }
public function testSerialize() { $factory = new KnpPaginatorFactory(); $paginator = new Paginator(); $paginate = $paginator->paginate(array('mela', 'meli', 'melo'), 1, 10); $collection = $factory->createRepresentation($paginate, new Route('my_route')); $this->assertJsonStringEqualsJsonString(<<<JSON { "page": 1, "limit": 10, "pages": 1, "total": 3, "_links": { "self": { "href": "my_route?page=1&limit=10" }, "first": { "href": "my_route?page=1&limit=10" }, "last": { "href": "my_route?page=1&limit=10" } }, "_embedded": { "items": [ "mela", "meli", "melo" ] } } JSON , $this->json($this->hateoas->serialize($collection, 'json'))); $this->assertXmlStringEqualsXmlString(<<<XML <?xml version="1.0" encoding="UTF-8"?> <collection page="1" limit="10" pages="1" total="3"> <entry rel="items"> <entry><![CDATA[mela]]></entry> <entry><![CDATA[meli]]></entry> <entry><![CDATA[melo]]></entry> </entry> <link rel="self" href="my_route?page=1&limit=10"/> <link rel="first" href="my_route?page=1&limit=10"/> <link rel="last" href="my_route?page=1&limit=10"/> </collection> XML , $this->hateoas->serialize($collection, 'xml')); }
/** * @test */ function shouldSortWithoutSpecificWhitelist() { $this->populate(); $_GET['sort'] = 'title'; $_GET['direction'] = 'asc'; $query = $this->dm->createQueryBuilder('Test\\Fixture\\Document\\Article')->getQuery(); $p = new Paginator(); $view = $p->paginate($query, 1, 10); $items = array_values($view->getItems()); $this->assertEquals('autumn', $items[0]->getTitle()); $_GET['sort'] = 'id'; $view = $p->paginate($query, 1, 10); $items = array_values($view->getItems()); $this->assertEquals('summer', $items[0]->getTitle()); }
/** * @test */ function shouldSortWithoutSpecificWhitelist() { $this->populate(); $_GET['sort'] = 'a.title'; $_GET['direction'] = 'asc'; $query = $this->em->createQuery('SELECT a FROM Test\\Fixture\\Entity\\Article a'); $p = new Paginator(); $view = $p->paginate($query, 1, 10); $items = $view->getItems(); $this->assertEquals('autumn', $items[0]->getTitle()); $_GET['sort'] = 'a.id'; $view = $p->paginate($query, 1, 10); $items = $view->getItems(); $this->assertEquals('summer', $items[0]->getTitle()); }
/** * @param Album $album * @param int $page Page number * * @return \Knp\Component\Pager\Pagination\PaginationInterface */ public function getItems(Album $album, $page) { $em = $this->getEntityManager(); $qb = $em->createQueryBuilder(); $qb->select('i')->from('ImageBundle:Image', 'i')->where('i.album=:album')->setParameter('album', $album); $query = $qb->getQuery(); return $this->paginator->paginate($query, $page, 12); }