tra('List Pages'), 'documentation' => 'PluginListpages', 'description' => tra('List pages based on various criteria'), 'prefs' => ['wikiplugin_listpages', 'feature_listPages'], 'iconname' => 'copy', 'introduced' => 2, 'params' => [ 'offset' => [ 'required' => false, 'name' => tra('Result Offset'), 'description' => tra('Result number at which the listing should start.'), 'since' => '2.0', 'filter' => 'digits', 'default' => 0, ], 'max' => [ 'required' => false, 'name' => tra('Max'), 'description' => tra('Limit number of items displayed in the list. Default is to display all.'), 'since' => '2.0', 'filter' => 'int', 'default' => -1, ], 'initial' => [ 'required' => false, 'name' => tra('Initial'), 'description' => tra('Initial page to show'), 'since' => '2.0', 'default' => '', ], 'showNameOnly' => [ 'required' => false, 'name' => tra('Show Name Only'), 'description' => tra('Show only the page names'), 'since' => '2.0', 'filter' => 'alpha', 'default' => '', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ] ], 'showNameAndDescriptionOnly' => [ 'required' => false, 'name' => tra('Show Name And Description Only'), 'description' => tra('Show only the page names and descriptions'), 'since' => '24.0', 'filter' => 'alpha', 'default' => '', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ] ], 'categId' => [ 'required' => false, 'name' => tra('Category Filter'), 'description' => tra('Filter categories by Id numbers. Use different separators to filter as follows:') . '
' . ': - ' . tr('Page is in any of the specified categories. Example:') . ' 1:2:3
' . '+ - ' . tr('Page must be in all of the specified categories. Example:') . ' 1+2+3
' . '- - ' . tr('Page is in the first specified category and not in any of the others. Example:') . ' 1-2-3
', 'since' => '2.0', 'filter' => 'text', 'accepted' => tra('Valid category ID or list separated by :, + or -'), 'default' => '', 'profile_reference' => 'category', ], 'structHead' => [ 'required' => false, 'name' => tra('Structure Head'), 'description' => tra('Filter by structure head'), 'since' => '2.0', 'filter' => 'alpha', 'default' => '', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ] ], 'showPageAlias' => [ 'required' => false, 'name' => tra('Show Page Alias'), 'description' => tra('Show page alias in the list'), 'since' => '2.0', 'filter' => 'alpha', 'default' => '', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ] ], 'includetag' => [ 'required' => false, 'name' => tra('Include Tag'), 'description' => tr('Only pages with specific tag (separate tags using %0)', ';'), 'since' => '10.3', 'advanced' => true, ], 'excludetag' => [ 'required' => false, 'name' => tra('Exclude Tag'), 'description' => tr('Only pages with specific tag excluded (separate tags using %0)', ';'), 'since' => '10.3', 'advanced' => true, ], 'showNumberOfPages' => [ 'required' => false, 'name' => tra('Show Number of Pages'), 'description' => tra('Show the number of pages matching criteria'), 'since' => '10.3', 'filter' => 'alpha', 'default' => 'n', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ], 'advanced' => true, ], 'find' => [ 'required' => false, 'name' => tra('Find'), 'description' => tra('Only pages with names similar to the text entered for this parameter will be listed'), 'since' => '2.0', ], 'lang' => [ 'required' => false, 'name' => tra('Language'), 'description' => tra('Two-letter language code to filter pages listed.'), 'since' => '3.0', 'filter' => 'alpha', ], 'langOrphan' => [ 'required' => false, 'name' => tra('Orphan Language'), 'description' => tra('Two-letter language code to filter pages listed. Only pages not available in the provided language will be listed.'), 'since' => '3.0', 'filter' => 'alpha', ], 'translations' => [ 'required' => false, 'name' => tra('Load Translations'), 'description' => tra('User- or pipe-separated list of two-letter language codes for additional languages to display. If the language parameter is not defined, the first element of this list will be used as the primary filter.'), 'since' => '3.0', ], 'translationOrphan' => [ 'required' => false, 'name' => tra('No translation'), 'description' => tra('User- or pipe-separated list of two-letter language codes for additional languages to display. List pages with no language or with a missing translation in one of the language'), 'since' => '7.0', ], 'exact_match' => [ 'required' => false, 'name' => tra('Exact Match'), 'description' => tra('Page name and text entered for the filter parameter must match exactly to be listed'), 'since' => '2.0', 'filter' => 'alpha', 'default' => '', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ] ], 'only_orphan_pages' => [ 'required' => false, 'name' => tra('Only Orphan Pages'), 'description' => tra('Only list orphan pages'), 'since' => '2.0', 'filter' => 'alpha', 'default' => '', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ] ], 'for_list_pages' => [ 'required' => false, 'name' => tra('For List Pages'), 'description' => '', 'since' => '2.0', 'filter' => 'alpha', 'default' => 'y', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ] ], 'sort' => [ 'required' => false, 'name' => tra('Sort'), 'description' => tra('Sort ascending or descending on any field in the tiki_pages table. Syntax is field name followed by _asc or _desc. Two examples:') . ' lastModif_desc pageName_asc', 'since' => '2.0', 'filter' => 'text', 'default' => 'pageName_asc', ], 'start' => [ 'required' => false, 'name' => tra('Start'), 'description' => tra('When only a portion of the page should be included, specify the marker from which inclusion should start.'), 'since' => '5.0', 'default' => '', ], 'end' => [ 'required' => false, 'name' => tra('Stop'), 'description' => tra('When only a portion of the page should be included, specify the marker at which inclusion should end.'), 'since' => '5.0', 'default' => '', ], 'length' => [ 'required' => false, 'name' => tra('Length'), 'description' => tra('Number of characters to display'), 'since' => '5.0', 'filter' => 'int', 'default' => '', ], 'showCheckbox' => [ 'required' => false, 'name' => tra('Checkboxes'), 'description' => 'Option to show checkboxes', 'since' => '7.0', 'filter' => 'alpha', 'default' => 'y', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ] ], 'offset_arg' => [ 'required' => false, 'name' => tra('Offset Argument'), 'description' => 'Argument, id of the plugin (if more than one on the page), for pagination', 'since' => '15.3', 'advanced' => true ], 'pagination' => [ 'required' => false, 'name' => tra('Pagination'), 'description' => 'Turn on pagination', 'since' => '15.3', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ] ], 'exclude_pages' => [ 'required' => false, 'name' => tra('Exclude Page(s)'), 'description' => tr('Wiki page names to be excluded from list'), 'since' => '19.0', 'filter' => 'pagename', 'default' => '', 'separator' => '|', 'profile_reference' => 'wiki_page', ], ] ]; } function wikiplugin_listpages($data, $params) { global $prefs, $tiki_p_view; $tikilib = TikiLib::lib('tiki'); $smarty = TikiLib::lib('smarty'); if (isset($prefs)) { // Handle 1.10.x prefs $feature_listPages = $prefs['feature_listPages']; $feature_wiki = $prefs['feature_wiki']; } else { // Handle 1.9.x prefs global $feature_listPages, $feature_wiki; } if ($feature_wiki != 'y' || $feature_listPages != 'y' || $tiki_p_view != 'y') { // the feature is disabled or the user can't read wiki pages return ''; } $default = [ 'offset' => 0, 'max' => -1, 'sort' => 'pageName_asc', 'find' => '', 'start' => '', 'end' => '', 'length' => -1, 'translations' => null, 'translationOrphan' => null, 'showCheckbox' => 'y', 'showNumberOfPages' => 'n', 'for_list_pages' => 'y', 'pagination' => 'n', 'exclude_pages' => '', ]; $params = array_merge($default, $params); extract($params, EXTR_SKIP); $filter = []; if (! isset($initial)) { if (isset($_REQUEST['initial'])) { $initial = $_REQUEST['initial']; } else { $initial = ''; } } if (! empty($categId)) { if (strstr($categId, ':')) { $filter['categId'] = explode(':', $categId); } elseif (strstr($categId, '+')) { $filter['andCategId'] = explode('+', $categId); } elseif (strstr($categId, '-')) { $categories = explode('-', $categId); $filter['categId'] = array_shift($categories); $filter['notCategId'] = $categories; } else { $filter['categId'] = $categId; } } if (! empty($structHead) && $structHead == 'y') { $filter['structHead'] = $structHead; } if (! empty($translations) && $prefs['feature_multilingual'] == 'y') { $multilinguallib = TikiLib::lib('multilingual'); if ($translations == 'user') { $translations = $multilinguallib->preferredLangs(); } else { $translations = explode('|', $translations); } } if (! empty($translationOrphan)) { $filter['translationOrphan'] = explode('|', $translationOrphan); } if (! empty($langOrphan)) { $filter['langOrphan'] = $langOrphan; } if (! empty($lang)) { $filter['lang'] = $lang; } elseif (is_array($translations)) { $lang = $filter['lang'] = reset($translations); } if (! empty($lang)) { $filter['lang'] = $lang; } elseif (is_array($translations)) { $lang = $filter['lang'] = reset($translations); } if ($pagination == 'y') { if (! empty($offset_arg) && ! empty($_REQUEST[$offset_arg])) { $offset_pagination = $_REQUEST[$offset_arg]; } else { $offset_pagination = 0; } } if (! empty($_REQUEST['sort_mode'])) { $sort = $_REQUEST['sort_mode']; } $exact_match = ( isset($exact_match) && $exact_match == 'y' ); $only_name = ( isset($showNameOnly) && $showNameOnly == 'y' ); $only_orphan_pages = ( isset($only_orphan_pages) && $only_orphan_pages == 'y' ); $for_list_pages = ( isset($for_list_pages) && $for_list_pages == 'y' ); $only_cant = false; $listpages = $tikilib->list_pages($offset, $max, $sort, $find, $initial, $exact_match, $only_name, $for_list_pages, $only_orphan_pages, $filter, $only_cant, '', $exclude_pages); if (! empty($includetag) || ! empty($excludetag)) { if (preg_match('/;/', $includetag)) { $aIncludetag = explode(';', $includetag); } else { $aIncludetag[] = $includetag; } if (preg_match('/;/', $excludetag)) { $aExcludetag = explode(';', $excludetag); } else { $aExcludetag[] = $excludetag; } $freetaglib = TikiLib::lib('freetag'); $i = 0; foreach ($listpages['data'] as $page) { $bToRemove = true; $aListTags = $freetaglib->get_tags_on_object($page['pageName'], 'wiki page'); if (! empty($aListTags['cant'])) { foreach ($aListTags['data'] as $aListTag) { if (in_array($aListTag['tag'], $aExcludetag) && ! empty($aExcludetag[0])) { unset($listpages['data'][$i]); break; } if (in_array($aListTag['tag'], $aIncludetag) === true && ! empty($aIncludetag[0])) { $bToRemove = false; } } } elseif (! empty($aIncludetag[0])) { unset($listpages['data'][$i]); } if ($bToRemove && ! empty($aIncludetag[0])) { unset($listpages['data'][$i]); } $i++; } $listpages['data'] = array_merge($listpages['data']); unset($aIncludetag); unset($aExcludetag); } if (is_array($translations)) { $used = []; foreach ($listpages['data'] as &$page) { $pages = $multilinguallib->getTranslations('wiki page', $page['page_id']); $page['translations'] = []; foreach ($pages as $trad) { if ($trad['lang'] != $lang && in_array($trad['lang'], $translations)) { $page['translations'][ $trad['lang'] ] = $trad['objName']; $used[$trad['lang']] = $trad['langName']; } } } $smarty->assign('wplp_used', $used); } // Count how many pages are left after tag filtering $listpages['cant'] = count($listpages['data']); $smarty->assign_by_ref('checkboxes_on', $showCheckbox); $smarty->assign_by_ref('showNumberOfPages', $showNumberOfPages); if (! empty($showPageAlias) && $showPageAlias == 'y') { $smarty->assign_by_ref('showPageAlias', $showPageAlias); } if (! empty($start) || ! empty($end) || $length > 0) { foreach ($listpages['data'] as $i => $page) { $listpages['data'][$i]['snippet'] = $tikilib->get_snippet($page['data'], $page['outputType'], ! empty($page['is_html']), '', $length, $start, $end); } } if (isset($_REQUEST["page"])) { $smarty->assign("redirectTo", $_REQUEST["page"]); } // Count how many pages are left after sorting $smarty->assign("cant", $listpages['cant']); // The following two are for tiki-listpages_content.tpl (pagination) $smarty->assign("pluginlistpages", 'y'); $smarty->assign("pagination", $pagination); if ($pagination == 'y') { // Show only x=$MaxRecords number of page entries on this page. for ($x = $offset_pagination; $x < ($offset_pagination + $GLOBALS['maxRecords']) && $x < count($listpages['data']); $x++) { $listpages_for_use[] = $listpages['data'][$x]; } $smarty->assign_by_ref('listpages', $listpages_for_use); $smarty->assign("offset", $offset_pagination); $smarty->assign("offset_arg", $offset_arg); } else { $smarty->assign_by_ref('listpages', $listpages['data']); } // Display an error message if the $showNameAndDescriptionOnly and $showNameOnly options are all entered at the same time if (isset($showNameAndDescriptionOnly) && $showNameAndDescriptionOnly == 'y' && isset($showNameOnly) && $showNameOnly == 'y'){ $smarty->assign('msg', tra("You cannot specify the showNameOnly and showNameAndDescriptionOnly options simultaneously, You must choose one of them.")); $smarty->display("error.tpl"); die; } if (isset($showNameOnly) && $showNameOnly == 'y') { $ret = $smarty->fetch('wiki-plugins/wikiplugin_listpagenames.tpl'); } elseif(isset($showNameAndDescriptionOnly) && $showNameAndDescriptionOnly == 'y'){ $ret = $smarty->fetch('wiki-plugins/wikiplugin_listpage_namesanddescription.tpl'); } else { $ret = $smarty->fetch('tiki-listpages_content.tpl'); } return '~np~' . $ret . '~/np~'; }