find("id>0, limit=10"); // replace id>0 with your selector * echo $items->render(); // renders a basic list of linked pages * * It will also generate pagination if the selector had a limit placed on it (i.e. "limit=10"), * and there are more pages left to render, and the page's template supports page numbers. * * Also adds a PaginatedArray::renderPager() method, which is convenient when you are generating your * own page list markup, but just want to use the automatic pagination generator. * * * ProcessWire 3.x, Copyright 2018 by Ryan Cramer * https://processwire.com * * */ class MarkupPageArray extends WireData implements Module { public static function getModuleInfo() { return array( 'title' => 'PageArray Markup', 'summary' => 'Adds renderPager() method to all PaginatedArray types, for easy pagination output. Plus a render() method to PageArray instances.', 'version' => 100, 'permanent' => false, 'singular' => true, 'autoload' => true, ); } public function init() { $this->addHook("PageArray::render", $this, "renderPageArray"); $this->addHook("PaginatedArray::renderPager", $this, "renderPager"); } /** * Render markup for a PageArray * * Can be accessed as $mypages->render() where '$mypages' is any instance of a PageArray. * * Be sure to see the $defaultOptions in the method if you want to change it's behavior or output. * * @param HookEvent $event * * #param array $options Optional list of options to modify the behavior and output. * #return string * */ public function renderPageArray(HookEvent $event) { /** @var PaginatedArray $pageArray */ $pageArray = $event->object; $arguments = $event->arguments; $options = array(); if(!count($pageArray)) { $event->return = ''; return; } $defaultOptions = array( // markup for the list container, specify {out} where generated items should go 'listMarkup' => "\n", // markup for list item. note {title} may be any valid page field, or you may use multiple fields 'itemMarkup' => "\n\t
  • {title}
  • ", // options to send to the pager (optional). See MarkupPagerNav::$options 'pagerOptions' => array(), // show pagination links at the top (when applicable)? 'pagerTop' => false, // show pagination links at the bottom (when applicable)? 'pagerBottom' => true, // getVars for pager, but preferably use $input->whitelist instead! 'getVars' => array(), // number of links to use for pagination, typically 10. 'numPageLinks' => 10, // base URL for pagination 'baseUrl' => '', ); if(isset($arguments[0]) && is_array($arguments[0])) $options = $arguments[0]; $options = array_merge($defaultOptions, $options); $out = ''; $fields = array(); if(preg_match_all('/\{[-_a-z0-9|]+\}/i', $options['itemMarkup'], $matches)) { $fields = $matches[0]; } foreach($pageArray as $page) { if($page instanceof Page && !$page->viewable()) continue; $values = array(); foreach($fields as $field) { $values[$field] = $page->get(trim($field, '{}')); } $out .= str_replace($fields, $values, $options['itemMarkup']); } $out = str_replace('{out}', $out, $options['listMarkup']); if(($options['pagerTop'] || $options['pagerBottom']) && $pageArray->getTotal() > count($pageArray)) { /** @var MarkupPagerNav $pager */ $pager = $this->modules->get('MarkupPagerNav'); $pagerOptions = $options['pagerOptions']; if(!empty($options['baseUrl'])) $pager->setBaseUrl($options['baseUrl']); else $pager->setBaseUrl($this->page->url); if(empty($options['getVars'])) $pagerOptions['getVars'] = $options['getVars']; if(empty($options['numPageLinks'])) $pagerOptions['numPageLinks'] = $options['numPageLinks']; $pagerOut = $pager->render($pageArray, $pagerOptions); if($options['pagerTop']) $out = $pagerOut . $out; if($options['pagerBottom']) $out .= $pagerOut; } $event->return = $out; } /** * Render pagination markup for a PageArray * * i.e. echo $mypages->renderPager(), where '$mypages' is a PageArray instance * * @param HookEvent $event * * #param array $options Optional options to provide to MarkupPagerNav - see MarkupPagerNav::$options * #return string * */ public function renderPager(HookEvent $event) { /** @var PaginatedArray $pageArray */ $pageArray = $event->object; if(!$pageArray->getLimit()) return; $arguments = $event->arguments; $options = array(); if(isset($arguments[0]) && is_array($arguments[0])) $options = $arguments[0]; /** @var MarkupPagerNav $pager */ $pager = $this->modules->get('MarkupPagerNav'); if(empty($options['baseUrl'])) { $baseUrl = $this->wire('page')->url; $urlSegmentStr = $this->wire('input')->urlSegmentStr; if(strlen($urlSegmentStr)) $baseUrl = rtrim($baseUrl, '/') . "/$urlSegmentStr/"; $pager->setBaseUrl($baseUrl); } $event->return = $pager->render($pageArray, $options); } }