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.
 
 
 
 
 
 

577 lines
20 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$
$section = 'wiki page';
$section_class = 'tiki_wiki_page manage'; // This will be body class instead of $section
require_once('tiki-setup.php');
$auto_query_args = [
'initial',
'maxRecords',
'sort_mode',
'find',
'lang',
'langOrphan',
'findfilter_orphan',
'categId',
'category',
'page_orphans',
'structure_orphans',
'exact_match',
'hits_link_to_all_languages',
'create_new_pages_using_template_name'
];
if ($prefs['gmap_page_list'] == 'y') {
$smarty->assign('gmapbuttons', true);
} else {
$smarty->assign('gmapbuttons', false);
}
if (
isset($_REQUEST['mapview'])
&& $_REQUEST['mapview'] == 'y'
&& ! isset($_REQUEST['searchmap'])
&& ! isset($_REQUEST['searchlist'])
|| isset($_REQUEST['searchmap'])
&& ! isset($_REQUEST['searchlist'])
) {
$smarty->assign('mapview', true);
}
if (
isset($_REQUEST['mapview'])
&& $_REQUEST['mapview'] == 'n'
&& ! isset($_REQUEST['searchmap'])
&& ! isset($_REQUEST['searchlist'])
|| isset($_REQUEST['searchlist'])
&& ! isset($_REQUEST['searchmap'])
) {
$smarty->assign('mapview', false);
}
if ($prefs['feature_multilingual'] == 'y' && isset($_REQUEST['lang']) && isset($_REQUEST['term_srch'])) {
$multilinguallib = TikiLib::lib('multilingual');
if (isset($_REQUEST['term_srch'])) {
$multilinguallib->storeCurrentTermSearchLanguageInSession($_REQUEST['lang']);
}
$smarty->assign('template_name', $_REQUEST['create_new_pages_using_template_name']);
}
if (isset($_REQUEST['hits_link_to_all_languages']) && $_REQUEST['hits_link_to_all_languages'] == 'On') {
$all_langs = 'y';
} else {
$all_langs = '';
}
$smarty->assign('all_langs', $all_langs);
$access->check_feature(['feature_wiki', 'feature_listPages']);
//add tablesorter sorting and filtering
$ts = Table_Check::setVars('listpages', true);
if ($ts['ajax']) {
if (! empty($_REQUEST['categPath_ts']) || ! empty($_REQUEST['categ_ts'])) {
if (! empty($_REQUEST['categPath_ts'])) {
$req = $_REQUEST['categPath_ts'];
} else {
$req = $_REQUEST['categ_ts'];
}
$pos = strrpos($req, '::');
if ($pos !== false) {
$catname = substr($req, $pos + 2);
} else {
$catname = $req;
}
$categlib = TikiLib::lib('categ');
$_REQUEST['categId'] = $categlib->get_category_id($catname);
}
}
// disallow robots to index page
$smarty->assign('metatag_robots', 'NOINDEX, NOFOLLOW');
if (! empty($multiprint_pages)) {
$smarty->assign('print_page', 'y');
$smarty->assign_by_ref('pages', $multiprint_pages);
// Display the template
$smarty->display('tiki-print_multi_pages.tpl');
} else {
// This script can receive the threshold
// for the information as the number of
// days to get in the log 1,3,4,etc
// it will default to 1 recovering information for today
if (isset($_REQUEST['maxRecords'])) {
$maxRecords = $_REQUEST['maxRecords'];
} else {
$maxRecords = $maxRecords;
}
if (! isset($_REQUEST['sort_mode'])) {
$sort_mode = $prefs['wiki_list_sortorder'] . '_' . $prefs['wiki_list_sortdirection'];
} else {
$sort_mode = $_REQUEST['sort_mode'];
}
$smarty->assign_by_ref('sort_mode', $sort_mode);
// If offset is set use it if not then use offset =0
// use the maxRecords php variable to set the limit
// if sortMode is not set then use lastModif_desc
if (! isset($_REQUEST['offset'])) {
$offset = 0;
} else {
$offset = $_REQUEST['offset'];
}
$smarty->assign_by_ref('offset', $offset);
if (! empty($_REQUEST['find'])) {
$find = strip_tags($_REQUEST['find']);
} else {
if (! empty($_REQUEST['q'])) {
$find = strip_tags($_REQUEST['q']);
} else {
$find = '';
}
}
$smarty->assign('find', $find);
$filter = [];
if ($prefs['feature_multilingual'] == 'y') {
$smarty->assign('find_lang', '');
if (((! isset($_REQUEST['lang']) ) || (isset($_REQUEST['lang']) && $_REQUEST['lang'] != ''))) {
$filter = setLangFilter($filter);
}
$smarty->assign('find_langOrphan', '');
if (! empty($_REQUEST['langOrphan'])) {
$filter['langOrphan'] = $_REQUEST['langOrphan'];
$smarty->assign('find_langOrphan', $_REQUEST['langOrphan']);
}
}
if ($prefs['feature_categories'] == 'y') {
if (! empty($_REQUEST['cat_categories'])) {
$filter['categId'] = $_REQUEST['cat_categories'];
if (count($_REQUEST['cat_categories']) > 1) {
unset($_REQUEST['categId']);
} else {
$_REQUEST['categId'] = $_REQUEST['cat_categories'][0];
}
} else {
$_REQUEST['cat_categories'] = [];
}
$selectedCategories = $_REQUEST['cat_categories'];
$smarty->assign('findSelectedCategoriesNumber', count($_REQUEST['cat_categories']));
if (! empty($_REQUEST['category'])) {
$categlib = TikiLib::lib('categ');
$filter['categId'] = $categlib->get_category_id($_REQUEST['category']);
$smarty->assign('find_categId', $filter['categId']);
$selectedCategories = [(int) $filter['categId']];
} elseif (! empty($_REQUEST['categId'])) {
$filter['categId'] = $_REQUEST['categId'];
$smarty->assign('find_categId', $_REQUEST['categId']);
$selectedCategories = [(int) $filter['categId']];
} else {
$smarty->assign('find_categId', '');
}
}
if (
(! empty($_REQUEST['page_orphans']) && $_REQUEST['page_orphans'] == 'y')
|| (isset($_REQUEST['findfilter_orphan']) && $_REQUEST['findfilter_orphan'] == 'page_orphans')
) {
$listpages_orphans = true;
}
if ($prefs['feature_listorphanPages'] == 'y') {
if (
(! empty($_REQUEST['page_orphans']) && $_REQUEST['page_orphans'] == 'y')
|| (isset($_REQUEST['findfilter_orphan']) && $_REQUEST['findfilter_orphan'] == 'page_orphans')
) {
$filter_values['orphan'] = 'page_orphans';
}
$filters['orphan']['page_orphans'] = tra('Orphan pages');
}
if ($prefs['feature_wiki_structure'] == 'y') {
if (
(! empty($_REQUEST['structure_orphans']) && $_REQUEST['structure_orphans'] == 'y')
|| (isset($_REQUEST['findfilter_orphan']) && $_REQUEST['findfilter_orphan'] == 'structure_orphans')
) {
$filter['structure_orphans'] = true;
}
if ($prefs['feature_listorphanStructure'] == 'y') {
if (
(! empty($_REQUEST['structure_orphans']) && $_REQUEST['structure_orphans'] == 'y')
|| (isset($_REQUEST['findfilter_orphan']) && $_REQUEST['findfilter_orphan'] == 'structure_orphans')
) {
$filter_values['orphan'] = 'structure_orphans';
}
$filters['orphan']['structure_orphans'] = tra('Pages not in a structure');
}
}
if (! empty($filters)) {
$filter_names['orphan'] = tra('Type');
$smarty->assign_by_ref('filters', $filters);
$smarty->assign_by_ref('filter_names', $filter_names);
$smarty->assign_by_ref('filter_values', $filter_values);
}
if (isset($_REQUEST['initial'])) {
$initial = $_REQUEST['initial'];
} else {
$initial = '';
}
$smarty->assign('initial', $initial);
// What a checked checkbox returns is browser dependant. Don't test on the value, just presence
if (isset($_REQUEST['exact_match'])) {
$exact_match = true;
$smarty->assign('exact_match', 'y');
} else {
$exact_match = false;
$smarty->assign('exact_match', 'n');
}
// Get a list of last changes to the Wiki database
// $listpages_orphans must not be initialized here because it can already have received a value from another script
if (! isset($listpages_orphans)) {
$listpages_orphans = false;
}
$listpages = $tikilib->list_pages(
$offset,
$maxRecords,
$sort_mode,
$find,
$initial,
$exact_match,
false,
true,
$listpages_orphans,
$filter
);
possibly_look_for_page_aliases($find);
// Only show the 'Actions' column if the user can do at least one action on one of the listed pages
$show_actions = 'n';
$actions_perms = ['tiki_p_edit', 'tiki_p_wiki_view_history', 'tiki_p_assign_perm_wiki_page', 'tiki_p_remove'];
foreach ($actions_perms as $p) {
foreach ($listpages['data'] as $i) {
if ($i['perms'][$p] == 'y') {
$show_actions = 'y';
break 2;
}
}
}
$smarty->assign('show_actions', $show_actions);
// If there're more records then assign next_offset
$cant_pages = ceil($listpages['cant'] / $maxRecords);
$smarty->assign_by_ref('cant_pages', $cant_pages);
$smarty->assign('actual_page', 1 + ($offset / $maxRecords));
if ($listpages['cant'] > ($offset + $maxRecords)) {
$smarty->assign('next_offset', $offset + $maxRecords);
} else {
$smarty->assign('next_offset', -1);
}
// If offset is > 0 then prev_offset
if ($offset > 0) {
$smarty->assign('prev_offset', $offset - $maxRecords);
} else {
$smarty->assign('prev_offset', -1);
}
if ($prefs['feature_categories'] == 'y') {
$categlib = TikiLib::lib('categ');
$categories = $categlib->getCategories();
$smarty->assign('notable', 'y');
$smarty->assign('cat_tree', $categlib->generate_cat_tree($categories, true, $selectedCategories));
$smarty->assign_by_ref('categories', $categories);
}
if ($prefs['feature_multilingual'] == 'y') {
$languages = [];
$langLib = TikiLib::lib('language');
$languages = $langLib->list_languages(false, 'y');
$smarty->assign_by_ref('languages', $languages);
}
if ($prefs['gmap_page_list'] == 'y') {
// Generate Google map plugin data
global $gmapobjectarray;
$gmapobjectarray = [];
foreach ($listpages['data'] as $p) {
$gmapobjectarray[] = ['type' => 'wiki page',
'id' => $p['pageName'],
'title' => $p['pageName'],
'href' => 'tiki-index.php?page=' . urlencode($p['pageName']),
];
}
}
foreach ($listpages['data'] as & $p) {
if ($userlib->object_has_one_permission($p['pageName'], 'wiki page')) {
$p['perms_active'] = 'y';
} else {
$p['perms_active'] = 'n';
}
}
$smarty->assign_by_ref('listpages', $listpages['data']);
$smarty->assign_by_ref('cant', $listpages['cant']);
ask_ticket('list-pages');
include_once('tiki-section_options.php');
// Exact match and single result, go to page directly
if (count($listpages['data']) == 1 && ! $ts['ajax']) {
$result = reset($listpages['data']);
if (TikiLib::strtolower($find) == TikiLib::strtolower($result['pageName'])) {
$wikilib = TikiLib::lib('wiki');
header('Location: ' . $wikilib->sefurl($result['pageName'], '', $all_langs));
exit;
}
}
if ($ts['enabled'] && ! $ts['ajax']) {
//create dropdown lists for category name and path filters
$cnames = [];
$cpaths = [];
if (isset($categories) && count($categories) > 0) {
foreach ($categories as $c) {
$cnames[] = $c['name'];
$cpaths[] = $c['categpath'];
}
}
//set language dropdown showing only languages that pages are actually in
if (isset($languages) && count($languages) > 0) {
$pagelangs = array_unique($tikilib->table('tiki_pages')->fetchColumn('lang', []));
$pagelangs = array_flip($pagelangs);
$langLib = TikiLib::lib('language');
$langLib->getLanguages();
$temp_langs = array_intersect_key($langmapping, $pagelangs);
if (count($temp_langs) > 0) {
foreach ($temp_langs as $short => $long) {
$ts_langs[$short . '|' . $long[0]] = $long[0];
}
} else {
$ts_langs = [];
}
} else {
$ts_langs = [];
}
//workaround to set initial sort order until this can be done in tablesorter using sortList with selectors
$cols = [
//pref => sort_mode
'id' => 'page_id',
'name' => 'pageName',
'hits' => 'hits',
'lastmodif' => 'lastModif',
'comment' => 'comment',
'creator' => 'creator',
'user' => 'user',
'lastver' => 'version',
'status' => 'flag',
'versions' => 'version',
'links' => 'links',
'backlinks' => 'backlinks',
'size' => 'page_size',
];
///replicate column filtering from tiki-listpages_content.tpl for the relevant columns
foreach ($cols as $pref => $fieldname) {
$prefstr = 'wiki_list_' . $pref;
if ($prefs[$prefstr] !== 'y') {
unset($cols[$pref]);
}
}
$cols = array_values($cols);
///add checkbox column
$remperm = Perms::get()->remove;
if ($remperm || $prefs['feature_wiki_multiprint'] === 'y') {
array_unshift($cols, 'checkbox');
}
if (strpos($sort_mode, '_desc') !== false) {
$pos = strlen($sort_mode) - 5;
$sortdir = 1;
} elseif (strpos($sort_mode, '_asc') !== false) {
$pos = strlen($sort_mode) - 4;
$sortdir = 0;
}
///set sort column
$sort = substr($sort_mode, 0, $pos);
$sortcol = array_search($sort, $cols);
$settings = [
'id' => $ts['tableid'],
'total' => $listpages['cant'],
'vars' => [
'show_actions' => $show_actions,
],
'columns' => [
'#language' => [
'filter' => [
'options' => $ts_langs,
],
],
'#categories' => [
'filter' => [
'options' => $cnames,
],
],
'#catpaths' => [
'filter' => [
'options' => $cpaths,
],
],
],
];
if ($sortcol !== false) {
$settings['sorts']['sortlist']['col'] = $sortcol;
$settings['sorts']['sortlist']['dir'] = $sortdir;
}
Table_Factory::build('TikiListpages', $settings);
}
if ($access->is_serializable_request()) {
if (isset($_REQUEST['listonly']) && ($prefs['feature_jquery'] == 'y' && $prefs['feature_jquery_autocomplete'] == 'y')) {
$pages = [];
foreach ($listpages['data'] as $page) {
if (isset($_REQUEST['nonamespace'])) {
$pages[] = TikiLib::lib('wiki')->get_without_namespace($page['pageName']);
} else {
$pages[] = $page['pageName'];
}
}
if (isset($_REQUEST['exclude_page'])) {
$exclude = $_REQUEST['exclude_page'];
$exclude = explode(",", $exclude);
foreach ($exclude as $excl) {
if (($key = array_search($excl, $pages)) !== false) {
unset($pages[$key]);
}
}
}
$access->output_serialized($pages);
} else {
$pages = [];
$wikilib = TikiLib::lib('wiki');
foreach ($listpages['data'] as $page) {
$pages[] = [
'page_id' => $page['page_id'],
'page_name' => $page['pageName'],
'url' => $wikilib->sefurl($page['pageName']), 'version' => $page['version'],
'description' => $page['description'],
'last_modif' => date('Y-m-d H:i:s', $page['lastModif']),
'last_author' => $page['user'],
'creator' => $page['creator'],
'creation_date' => date('Y-m-d H:i:s', $page['created']),
'lang' => $page['lang'],
];
}
require_once 'lib/ointegratelib.php';
$response = OIntegrate_Response::create(['list' => $pages], '1.0');
$response->addTemplate('smarty', 'tikiwiki', 'templates/smarty-tikiwiki-1.0-shortlist.txt');
$response->schemaDocumentation = 'http://dev.tiki.org/WebserviceListpages';
$response->send();
}
} else {
// Display the template
if ($ts['ajax']) {
$smarty->display($listpages_orphans ? 'tiki-orphan_pages.tpl' : 'tiki-listpages.tpl');
} else {
$smarty->assign('mid', ($listpages_orphans ? 'tiki-orphan_pages.tpl' : 'tiki-listpages.tpl'));
$smarty->display('tiki.tpl');
}
}
}
/**
* @param $filter
* @return mixed
*/
function setLangFilter($filter)
{
global $prefs;
$multilinguallib = TikiLib::lib('multilingual');
$smarty = TikiLib::lib('smarty');
$lang = $multilinguallib->currentPageSearchLanguage();
if (isset($_REQUEST['listonly']) && $prefs['feature_jquery_autocomplete'] == 'y' && strlen($lang) > 2) {
$lang = substr($lang, 0, 2); // for autocomplete - use only language filter, not culture as well
}
// Without this condition, default listing is empty and language filter shows any language
if ($lang == 'en-us') {
$lang = 'en';
}
$filter['lang'] = $lang;
$smarty->assign('find_lang', $lang);
return $filter;
}
/**
* @param $query
*/
function possibly_look_for_page_aliases($query)
{
global $prefs;
$smarty = TikiLib::lib('smarty');
$lang = null;
if (isset($_REQUEST['lang'])) {
$lang = $_REQUEST['lang'];
}
if ($prefs['feature_wiki_pagealias'] == 'y' && $query) {
$semanticlib = TikiLib::lib('semantic');
$aliases = $semanticlib->getAliasContaining($query, false, $lang);
if (! empty($aliases)) {
foreach ($aliases as &$alias) {
$alias['parsedAlias'] = TikiLib::lib('slugmanager')->generate($prefs['wiki_url_scheme'], $alias['toPage'], $prefs['url_only_ascii'] === 'y', true);
}
}
$smarty->assign('aliases', $aliases);
} else {
$smarty->assign('aliases', null);
}
if (! empty($aliases) > 0) {
$smarty->assign('aliases_were_found', 'y');
} else {
$smarty->assign('aliases_were_found', 'n');
}
$alias_found = 'n';
if (! empty($aliases)) {
foreach ($aliases as $an_alias_info) {
if ($an_alias_info['toPage'] == $query) {
$alias_found = 'y';
}
}
}
$smarty->assign('alias_found', $alias_found);
set_category_for_new_page_creation();
}
function set_category_for_new_page_creation()
{
global $prefs;
$smarty = TikiLib::lib('smarty');
$create_page_with_categId = '';
if (isset($_REQUEST['create_page_with_search_category'])) {
if ($prefs['feature_categories'] == 'y' && ! empty($_REQUEST['categId'])) {
$create_page_with_categId = $_REQUEST['categId'];
}
}
$smarty->assign('create_page_with_categId', $create_page_with_categId);
}