You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

502 lines
12 KiB

<?php
/**
* @package tikiwiki
*/
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
require_once 'tiki-setup.php';
$categlib = TikiLib::lib('categ');
$access->check_feature('feature_print_indexed');
$inputConfiguration = [
['staticKeyFilters' => [
'list' => 'alpha',
'comments' => 'alpha',
] ],
['staticKeyFiltersForArrays' => [
'languages' => 'alpha',
'categId' => 'digits',
] ],
[ 'catchAllUnset' => null ],
];
if (! isset($_GET['list']) || ! in_array($_GET['list'], ['categorylist', 'glossary'])) {
$access->display_error('tiki-print_indexed.php', tra('Missing object list type argument'));
}
// Classes to be extracted at some later point {{{
/**
*
*/
class ObjectList // {{{
{
private $lastIndex = 0;
private $customIndexes = [];
private $renderers = [];
/**
* @param $indexKey
*/
function addCustomIndex($indexKey)
{
$this->customIndexes[ $indexKey ] = [];
}
/**
* @param $type
* @param $object
* @param $options
*/
function add($type, $object, $options)
{
if (! isset($dataIndex[$type])) {
$this->dataIndex[$type] = [];
}
switch ($type) {
case 'wiki page':
if (array_key_exists('languages', $options)) {
$renderer = new ObjectRenderer_MultilingualWiki($type, $object, $options);
} else {
$renderer = new ObjectRenderer_Wiki($type, $object, $options);
}
break;
default:
$renderer = new ObjectRenderer_TrackerItem($type, $object, $options);
break;
}
if ($renderer && $renderer->isValid()) {
$index = ++$this->lastIndex;
$this->renderers[$index] = $renderer;
foreach ($this->customIndexes as $key => & $data) {
if ($prop = $renderer->getIndexValue($key)) {
$prop = strtolower($prop);
if (isset($data[$prop])) {
$data[$prop][] = $index;
} else {
$data[$prop] = [ $index ];
}
}
}
}
}
function finalize()
{
foreach ($this->customIndexes as & $data) {
ksort($data);
}
}
/**
* @param $smarty
* @param $key
* @param $options
*/
function render($smarty, $key, $options)
{
if (is_null($key)) {
foreach ($this->renderers as $index => $renderer) {
$smarty->assign('index', $index);
$renderer->render($smarty, $options);
}
} else {
foreach ($this->customIndexes[$key] as $indexes) {
foreach ($indexes as $index) {
$renderer = $this->renderers[$index];
$smarty->assign('index', $index);
$renderer->render($smarty, $options);
}
}
}
}
} // }}}
/**
*
*/
abstract class ObjectRenderer // {{{
{
protected $objectType;
protected $objectId;
/**
* @param $objectType
* @param $objectId
*/
function __construct($objectType, $objectId)
{
$this->objectType = $objectType;
$this->objectId = $objectId;
}
/**
* @param $smarty
* @param $options
*/
function render($smarty, $options)
{
$options['decorator_template'] = 'print/print-decorator_' . $options['decorator'] . '.tpl';
$smarty->assign('body', $this->_render($smarty, $options));
$smarty->display($options['decorator_template']);
}
/**
* @return bool
*/
function isValid()
{
return true;
}
/**
* @param $smarty
* @param $template
* @return mixed
*/
abstract function _render($smarty, $template);
/**
* @param $key
* @return mixed
*/
abstract function getIndexValue($key);
} // }}}
/**
*
*/
class ObjectRenderer_TrackerItem extends ObjectRenderer // {{{
{
private static $trackers = [];
private $valid = false;
private $tracker;
private $info;
/**
* @param $type
* @param $object
* @param array $options
*/
function __construct($type, $object, $options = [])
{
parent::__construct($type, $object, $options);
$trklib = TikiLib::lib('trk');
$info = $trklib->get_tracker_item($object);
$trackerId = $info['trackerId'];
if (! isset(self::$trackers[$trackerId])) {
if (self::$trackers[$trackerId] = $trklib->get_tracker($trackerId)) {
$fields = $trklib->list_tracker_fields($trackerId);
self::$trackers[$trackerId]['fields'] = $fields['data'];
} else {
$this->valid = false;
return;
}
}
$this->tracker = self::$trackers[ $info['trackerId'] ];
$this->info = $info;
$this->valid = ($type == $this->tracker['name']);
foreach ($this->tracker['fields'] as & $field) {
$field['value'] = $this->info[ $field['fieldId'] ];
}
}
/**
* @return bool
*/
function isValid()
{
return $this->valid;
}
/**
* @param $smarty
* @param $options
* @return mixed
*/
function _render($smarty, $options)
{
$smarty->assign('title', $this->getTitle());
$smarty->assign('tracker', $this->tracker);
$smarty->assign('item', $this->info);
$options['display_template'] = 'print/print-' . $options['display'] . '_trackeritem.tpl';
return $smarty->fetch($options['display_template']);
}
/**
* @param $key
* @return mixed
*/
function getIndexValue($key)
{
switch ($key) {
case 'title':
return $this->getTitle();
}
}
/**
* @return mixed
*/
function getTitle()
{
foreach ($this->tracker['fields'] as $field) {
if ($field['isMain'] == 'y') {
return $field['value'];
}
}
}
} // }}}
/**
*
*/
class ObjectRenderer_Wiki extends ObjectRenderer // {{{
{
private $info;
/**
* @param $objectType
* @param $objectId
*/
function __construct($objectType, $objectId)
{
parent::__construct($objectType, $objectId);
global $tikilib;
$info = $tikilib->get_page_info($objectId);
$info['parsed'] = TikiLib::lib('parser')->parse_data(
$info['data'],
[
'is_html' => $info['is_html'],
'print' => 'y',
]
);
$this->info = $info;
}
/**
* @param $smarty
* @param $options
* @return mixed
*/
function _render($smarty, $options)
{
$options['display_template'] = 'print/print-' . $options['display'] . '_wiki.tpl';
$smarty->assign('info', $this->info);
return $smarty->fetch($options['display_template']);
}
/**
* @param $key
* @return mixed
*/
function getIndexValue($key)
{
switch ($key) {
case 'title':
return $this->info['pageName'];
}
}
} // }}}
/**
*
*/
class ObjectRenderer_MultilingualWiki extends ObjectRenderer // {{{
{
private $renderers = [];
/**
* @param $type
* @param $object
* @param array $options
*/
function __construct($type, $object, $options = [])
{
parent::__construct($type, $object, $options);
$multilinguallib = TikiLib::lib('multilingual');
$tikilib = TikiLib::lib('tiki');
$languages = $options['languages'];
$this->renderers = array_fill_keys($languages, null);
if ($trads = $multilinguallib->getTrads($type, $tikilib->get_page_id_from_name($object))) {
foreach ($trads as $trad) {
if (in_array($trad['lang'], $languages)) {
$this->renderers[ $trad['lang'] ] = new ObjectRenderer_Wiki($type, $tikilib->get_page_name_from_id($trad['objId']), $options);
}
}
} else {
$this->renderers[ reset($languages) ] = new ObjectRenderer_Wiki($type, $object, $options);
}
}
/**
* @param $smarty
* @param $options
* @return string
*/
function _render($smarty, $options)
{
$out = '';
$languages = array_keys($this->renderers);
if (isset($options['languages'])) {
$languages = $options['languages'];
}
foreach ($languages as $lang) {
if ($this->renderers[$lang]) {
$out .= $this->renderers[$lang]->_render($smarty, $options);
}
}
return $out;
}
/**
* @param $key
* @return mixed
*/
function getIndexValue($key)
{
if (strpos($key, 'lang_') === 0) {
list( $key, $lang ) = explode('_', substr($key, 5), 2);
if (isset($this->renderers[$lang]) && $this->renderers[$lang]) {
return $this->renderers[$lang]->getIndexValue($key);
}
return;
}
return reset($this->renderers)->getIndexValue($key);
}
} // }}}
// End of classes }}}
$objectList = new ObjectList();
$objectList->addCustomIndex('title');
$indexPages = [];
switch ($_GET['list']) {
case 'categorylist':
$access->check_feature('feature_categories');
if (isset($_GET['categId'])) {
$categId = (int) $_GET['categId'];
$objects = $categlib->list_category_objects($categId, 0, -1, 'name_asc', '', '', true, false);
$indexPages[] = [
'key' => 'title',
'indextitle' => tra('Index'),
'options' => [
'decorator' => 'indexrow',
'display' => 'title',
],
];
foreach ($objects['data'] as $index => $values) {
$type = $values['type'];
$item = $values['itemId'];
$objectList->add($type, $item, []);
}
}
break;
case 'glossary':
if (isset($_REQUEST['languages'])) {
$languages = (array)$_REQUEST['languages'];
} else {
$languages = [$prefs['language']];
}
$filterLang = reset($languages);
foreach ($languages as $num => $code) {
$key = 'lang_title_' . $code;
if ($num > 0) {
$objectList->addCustomIndex($key);
} else {
$key = 'title';
}
$indexPages[] = [
'key' => $key,
'indextitle' => tr('Index (%0)', $code),
'options' => [
'decorator' => 'indexrow',
'display' => 'title',
'languages' => [$code],
],
];
}
$filter = [ 'lang' => $filterLang ];
if (isset($_GET['categId'])) {
$access->check_feature('feature_categories');
$filter['categId'] = $_GET['categId'];
}
$pages = $tikilib->list_pages(0, -1, 'pageName_asc', '', '', true, true, false, false, $filter);
foreach ($pages['data'] as $info) {
$objectList->add('wiki page', $info['pageName'], ['languages' => $languages]);
}
break;
}
$objectList->finalize();
$smarty->display('header.tpl');
$smarty->display('print/print-page_header.tpl');
foreach ($indexPages as $page) {
$smarty->assign('indextitle', $page['indextitle']);
$smarty->display('print/print-index_header.tpl');
$objectList->render($smarty, $page['key'], $page['options']);
$smarty->display('print/print-index_footer.tpl');
}
// Display all data
$objectList->render(
$smarty,
null,
[
'decorator' => 'indexed',
'display' => 'object',
'comments' => $_REQUEST['comments'] == 'y',
]
);
$smarty->display('print/print-page_footer.tpl');
$smarty->display('footer.tpl');