171 lines
5.3 KiB
Text
171 lines
5.3 KiB
Text
|
<?php namespace ProcessWire;
|
||
|
|
||
|
/**
|
||
|
* ProcessWire MarkupPageArray module
|
||
|
*
|
||
|
* Adds convenience methods to all PageArray instances for markup generation
|
||
|
*
|
||
|
* It adds PageArray::render() which generates a basic unordered list of linked pages.
|
||
|
* It can be called from any PageArray:
|
||
|
*
|
||
|
* $items = $pages->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<ul class='PageArray'>{out}\n</ul>",
|
||
|
|
||
|
// markup for list item. note {title} may be any valid page field, or you may use multiple fields
|
||
|
'itemMarkup' => "\n\t<li><a href='{url}'>{title}</a></li>",
|
||
|
|
||
|
// 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);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|