info = $info; $this->user = $user; $this->page = $info['pageName']; $this->content_to_render = $content_to_render; } public function applyPermissions() { $userlib = TikiLib::lib('user'); $permNames = $userlib->get_permission_names_for('wiki'); $objectperms = Perms::get([ 'type' => 'wiki page', 'object' => $this->page ]); foreach ($permNames as $name) { $this->setGlobal($name, $objectperms->$name ? 'y' : 'n'); } $this->canView = $objectperms->view; $this->smartyassign('page_user', $this->info['user']); return $objectperms; } public function restoreAll() { global $prefs; $smarty = TikiLib::lib('smarty'); foreach ($this->toRestore as $name => $value) { $GLOBALS[$name] = $value; } foreach ($this->prefRestore as $name => $value) { $prefs[$name] = $value; } foreach ($this->smartyRestore as $name => $value) { $smarty->assign($name, $value); } } public function runSetups() { foreach ($this->prep as $method) { $this->$method(); } } public function setPageNumber($number) { $this->pageNumber = (int) $number; } public function setSortMode($mode) { $this->sortMode = $mode; } public function setShowAttachments($val) { $this->showAttachments = $val; } public function setStructureInfo($info) { $this->structureInfo = $info; } private function setupStructure() { if (! $this->structureInfo) { return; } global $structure, $structure_path; $structlib = TikiLib::lib('struct'); $tikilib = TikiLib::lib('tiki'); $structure = 'y'; $this->smartyassign('structure', $structure); $this->smartyassign('page_info', $this->structureInfo); $navigation_info = $structlib->get_navigation_info($this->structureInfo['page_ref_id']); $this->smartyassign('next_info', $navigation_info['next']); $this->smartyassign('prev_info', $navigation_info['prev']); $this->smartyassign('parent_info', $navigation_info['parent']); $this->smartyassign('home_info', $navigation_info['home']); $structure_path = $structlib->get_structure_path($this->structureInfo['page_ref_id']); $this->smartyassign('structure_path', $structure_path); // Need to have showstructs when in more than one struct - for usability reasons $structs = $structlib->get_page_structures($this->page); $structs_with_perm = []; foreach ($structs as $t_structs) { if ($tikilib->user_has_perm_on_object($this->user, $t_structs['pageName'], 'wiki page', 'tiki_p_view')) { $structs_with_perm[] = $t_structs; } } if ($tikilib->user_has_perm_on_object($this->user, $navigation_info['home']['pageName'], 'wiki page', 'tiki_p_edit', 'tiki_p_edit_structures')) { $this->smartyassign('struct_editable', 'a'); # a stands for both perms: tiki_p_edit and tiki_p_edit_structures } elseif ($tikilib->user_has_perm_on_object($this->user, $navigation_info['home']['pageName'], 'wiki page', 'tiki_p_edit_structures')) { $this->smartyassign('struct_editable', 'y'); # y stands for only tiki_p_edit_structures perm (but not tiki_p_edit) } else { $this->smartyassign('struct_editable', 'n'); } // To show position if (count($structure_path) > 1) { $cur_pos = ''; for ($i = 1, $count_str_path = count($structure_path); $i < $count_str_path; $i++) { $cur_pos .= $structure_path[$i]["pos"] . "." ; } $cur_pos = substr($cur_pos, 0, strlen($cur_pos) - 1); } else { $cur_pos = tra("Top"); } $this->smartyassign('cur_pos', $cur_pos); $this->smartyassign('showstructs', $structs_with_perm); $this->smartyassign('page_ref_id', $this->structureInfo['page_ref_id']); } private function setupContributors() { global $prefs; $wikilib = TikiLib::lib('wiki'); if ($prefs['wiki_authors_style'] != 'classic') { $contributors = $wikilib->get_contributors($this->page, $this->info['user']); $this->smartyassign('contributors', $contributors); } } private function setupCreator() { $wikilib = TikiLib::lib('wiki'); if (isset($this->info['creator'])) { $creator = $this->info['creator']; } else { $creator = $wikilib->get_creator($this->page); } $this->smartyassign('creator', $creator); } private function setupMultilingual() { global $prefs; if ($prefs['feature_multilingual'] != 'y') { return; } $tikilib = TikiLib::lib('tiki'); $multilinguallib = TikiLib::lib('multilingual'); if (! empty($this->info['lang'])) { $this->trads = $multilinguallib->getTranslations('wiki page', $this->info['page_id'], $this->page, $this->info['lang']); $this->smartyassign('trads', $this->trads); $this->smartyassign('translationsCount', count($this->trads)); $pageLang = $this->info['lang']; $this->smartyassign('pageLang', $pageLang); } if ($prefs['feature_machine_translation'] == 'y' && $prefs['lang_machine_translate_wiki'] == 'y' && ! empty($this->info['lang'])) { $provider = new Multilingual_MachineTranslation(); $langsCandidatesForMachineTranslation = $provider->getAvailableLanguages($this->trads); $this->smartyassign('langsCandidatesForMachineTranslation', $langsCandidatesForMachineTranslation); } $bits = $multilinguallib->getMissingTranslationBits('wiki page', $this->info['page_id'], 'critical', true); $alertData = []; foreach ($bits as $translationBit) { $alertData[] = $multilinguallib->getTranslationsWithBit($translationBit, $this->info['page_id']); } $this->smartyassign('translation_alert', $alertData); } private function setupBacklinks() { global $prefs, $tiki_p_view_backlink; $wikilib = TikiLib::lib('wiki'); if ($prefs['feature_backlinks'] == 'y' && $tiki_p_view_backlink == 'y') { $backlinks = $wikilib->get_backlinks($this->page); $this->smartyassign('backlinks', $backlinks); } } private function setupActions() { global $prefs, $tiki_p_edit, $tiki_p_remove, $tiki_p_admin_wiki; $wikilib = TikiLib::lib('wiki'); // Verify lock status if ($prefs['feature_wiki_usrlock'] == 'y') { if ($wikilib->is_locked($this->page, $this->info)) { $this->smartyassign('lock', true); } else { $this->smartyassign('lock', false); } } $this->smartyassign('editable', $wikilib->is_editable($this->page, $this->user, $this->info)); // If not locked and last version is user version then can undo $this->smartyassign('canundo', $this->canUndo() ? 'y' : 'n'); if (! isset($this->info['is_html'])) { $this->info['is_html'] = false; } $this->setupComments(); } private function setupSlideshow() { global $prefs; if ($prefs['wiki_uses_slides'] != 'y') { $this->smartyassign('show_slideshow', 'n'); return; } //Let us check if slides exist in the wiki page $slides = preg_split('/-=[^=]+=-|![^=]+|!![^=]+!!![^=]+/', $this->info['data']); if (count($slides) > 1) { $this->smartyassign('show_slideshow', 'y'); } else { $slides = explode('...page...', $this->info['data']); $this->smartyassign('show_slideshow', ( count($slides) > 1 ) ? 'y' : 'n'); } } private function setupPage() { global $prefs, $user; $wikilib = TikiLib::lib('wiki'); $tikilib = TikiLib::lib('tiki'); $this->smartyassign('page', $this->page); $this->smartyassign('show_page', 'y'); $this->smartyassign('print_page', 'n'); $this->smartyassign('beingEdited', 'n'); $this->smartyassign('categorypath', $prefs['feature_categorypath']); $this->smartyassign('categoryobjects', $prefs['feature_categoryobjects']); $this->smartyassign('feature_wiki_pageid', $prefs['feature_wiki_pageid']); $this->smartyassign('page_id', $this->info['page_id']); // Get the authors style for this page $wiki_authors_style = ( $prefs['wiki_authors_style_by_page'] == 'y' && $this->info['wiki_authors_style'] != '' ) ? $this->info['wiki_authors_style'] : $prefs['wiki_authors_style']; $this->smartyassign('wiki_authors_style', $wiki_authors_style); $this->smartyassign('revision_approval_info', null); $this->smartyassign('cached_page', 'n'); if ($prefs['flaggedrev_approval'] == 'y') { $flaggedrevisionlib = TikiLib::lib('flaggedrevision'); if ($flaggedrevisionlib->page_requires_approval($this->page)) { $this->smartyassign('revision_approval', true); if ($version_info = $flaggedrevisionlib->get_version_with($this->page, 'moderation', 'OK')) { $this->smartyassign('revision_approved', $version_info['version']); $revision_displayed = $this->info['version']; if ($this->content_to_render === null) { $this->content_to_render = $version_info['data']; $revision_displayed = $version_info['version']; } $this->smartyassign('revision_displayed', $revision_displayed); $this->smartyassign('revision_displayed_author', $this->info['user']); if ($revision_displayed == $version_info['version']) { $approval = $flaggedrevisionlib->find_approval_information($this->page, $revision_displayed); $this->smartyassign('revision_approval_info', $approval); } } else { $this->smartyassign('revision_approved', null); if ($this->content_to_render === null) { $this->smartyassign('revision_displayed', null); $this->content_to_render = '^' . tra('There are no approved versions of this page.', $this->info['lang']) . '^'; } else { $this->smartyassign('revision_displayed', $this->info['version']); } } } } if ($this->content_to_render === null) { $page = $this->page; $pdata = new Tiki_Render_Lazy( function () use ($page) { $wikilib = TikiLib::lib('wiki'); $smarty = TikiLib::lib('smarty'); $parsed = $wikilib->get_parse($page, $canBeRefreshed); if ($canBeRefreshed) { $smarty->assign('cached_page', 'y'); } return $parsed; } ); } else { $parse_options = [ 'is_html' => $this->info['is_html'], 'language' => $this->info['lang'], ]; $content = $this->content_to_render; if ($this->raw) { $pdata = new Tiki_Render_Lazy( function () use ($content) { $parserlib = TikiLib::lib('parser'); return $parserlib->parse_data_raw($content); } ); } else { $pdata = new Tiki_Render_Lazy( function () use ($content, $parse_options) { return TikiLib::lib('parser')->parse_data($content, $parse_options); } ); } } if ($prefs['wiki_pagination'] == 'y') { $pages = $wikilib->get_number_of_pages($pdata); $pdata = $wikilib->get_page($pdata, $this->pageNumber); $this->smartyassign('pages', $pages); if ($pages > $this->pageNumber) { $this->smartyassign('next_page', $this->pageNumber + 1); } else { $this->smartyassign('next_page', $this->pageNumber); } if ($this->pageNumber > 1) { $this->smartyassign('prev_page', $this->pageNumber - 1); } else { $this->smartyassign('prev_page', 1); } $this->smartyassign('first_page', 1); $this->smartyassign('last_page', $pages); $this->smartyassign('pagenum', $this->pageNumber); } else { $this->smartyassign('pages', 1); $this->smartyassign('next_page', 1); $this->smartyassign('prev_page', 1); $this->smartyassign('first_page', 1); $this->smartyassign('last_page', 1); $this->smartyassign('pagenum', 1); } $this->smartyassign('lastVersion', $this->info["version"]); if (isset($this->info['last_version'])) { $this->smartyassign('versioned', true); } $this->smartyassign('lastModif', $this->info["lastModif"]); if (empty($this->info['user'])) { $this->info['user'] = tra('Anonymous'); } $this->smartyassign('lastUser', $this->info['user']); $this->smartyassign('description', $this->info['description']); $this->smartyassign('parsed', $pdata); if (! empty($this->info['keywords'])) { $this->smartyassign('metatag_local_keywords', $this->info['keywords']); } } private function setupAttachments() { global $prefs; $wikilib = TikiLib::lib('wiki'); if ($prefs['feature_wiki_attachments'] != 'y' || $prefs['feature_use_fgal_for_wiki_attachments'] == 'y') { return; } // If anything below here is changed, please change lib/wiki-plugins/wikiplugin_attach.php as well. $this->smartyassign('sort_mode', $this->sortMode); if ($this->showAttachments !== false) { $this->smartyassign('atts_show', $this->showAttachments); } $atts = $wikilib->list_wiki_attachments($this->page, 0, -1, $this->sortMode, ''); $this->smartyassign('atts', $atts["data"]); $this->smartyassign('atts_count', count($atts['data'])); } private function setupFootnotes() { global $prefs; $wikilib = TikiLib::lib('wiki'); $this->smartyassign('footnote', ''); $this->smartyassign('has_footnote', 'n'); if ($prefs['feature_wiki_footnotes'] == 'y') { if ($this->user) { $footnote = $wikilib->get_footnote($this->user, $this->page); $this->smartyassign('footnote', TikiLib::lib('parser')->parse_data($footnote)); if ($footnote) { $this->smartyassign('has_footnote', 'y'); } } } $this->smartyassign('wiki_extras', 'y'); } private function setupWatch() { global $prefs; $tikilib = TikiLib::lib('tiki'); $categlib = TikiLib::lib('categ'); $userlib = TikiLib::lib('user'); if ($prefs['feature_user_watches'] != 'y') { return; } $this->smartyassign('user_watching_page', 'n'); $this->smartyassign('user_watching_structure', 'n'); if ($this->user) { if ($tikilib->user_watches($this->user, 'wiki_page_changed', $this->page, 'wiki page')) { $this->smartyassign('user_watching_page', 'y'); } if (isset($this->structureInfo) && $tikilib->user_watches($this->user, 'structure_changed', $this->structureInfo['page_ref_id'], 'structure')) { $this->smartyassign('user_watching_structure', 'y'); } } // Check, if the user is watching this page by a category. if ($prefs['feature_categories'] == 'y') { $watching_categories_temp = $categlib->get_watching_categories($this->page, "wiki page", $this->user); $this->smartyassign('category_watched', 'n'); if (count($watching_categories_temp) > 0) { $this->smartyassign('category_watched', 'y'); $watching_categories = []; foreach ($watching_categories_temp as $wct) { $watching_categories[] = ["categId" => $wct,"name" => $categlib->get_category_name($wct)]; } $this->smartyassign('watching_categories', $watching_categories); } } } private function setupCategories() { global $prefs; $categlib = TikiLib::lib('categ'); $cats = []; if ($prefs['feature_categories'] == 'y' && $categlib->is_categorized('wiki page', $this->page)) { $this->smartyassign('is_categorized', 'y'); if ($prefs['feature_categoryobjects'] == 'y' || $prefs['feature_categorypath'] == 'y') { $cats = $categlib->get_object_categories('wiki page', $this->page); } if ($prefs['category_morelikethis_algorithm'] != '') { $freetaglib = TikiLib::lib('freetag'); $category_related_objects = $freetaglib->get_similar('wiki page', $this->page, empty($prefs['category_morelikethis_mincommon_max']) ? $prefs['maxRecords'] : $prefs['category_morelikethis_mincommon_max'], null, 'category'); $this->smartyassign('category_related_objects', $category_related_objects); } if ($prefs['feature_categorypath'] == 'y') { $display_catpath = $categlib->get_categorypath($cats); $this->smartyassign('display_catpath', $display_catpath); } // Display current category objects or not (like {category()}) if ($prefs['feature_categoryobjects'] == 'y') { $display_catobjects = $categlib->get_categoryobjects($cats); $this->smartyassign('display_catobjects', $display_catobjects); } } else { $this->smartyassign('is_categorized', 'n'); } } private function setupPoll() { global $prefs, $tiki_p_wiki_view_ratings; $polllib = TikiLib::lib('poll'); $tikilib = TikiLib::lib('tiki'); if ($prefs['feature_polls'] != 'y' || $prefs['feature_wiki_ratings'] != 'y' || $tiki_p_wiki_view_ratings != 'y') { return; } if (! isset($polllib) || ! is_object($polllib)) { include("lib/polls/polllib_shared.php"); } $ratings = $polllib->get_ratings('wiki page', $this->page, $this->user); $this->smartyassign('ratings', $ratings); } private function setupBreadcrumbs() { global $prefs, $crumbs; if ($this->structureInfo && $this->structureInfo['page_alias'] != '') { $crumbpage = $this->structureInfo['page_alias']; } else { $crumbpage = $this->page; } //global $description; $crumbsLocal[] = new Breadcrumb( isset($this->info['prettyName']) ? $this->info['prettyName'] : $crumbpage, $this->info['description'], TikiLib::lib('wiki')->sefurl($this->page), '', '' ); $crumbs = array_merge($crumbs, $crumbsLocal); $headtitle = breadcrumb_buildHeadTitle($prefs['site_title_breadcrumb'] == 'invertfull' ? array_reverse($crumbsLocal) : $crumbsLocal); $this->smartyassign('headtitle', $headtitle); $this->smartyassign('trail', $crumbs); } private function setGlobal($name, $value) { if ((empty($GLOBALS[$name]) || $GLOBALS[$name] != $value) && ! array_key_exists($name, $this->toRestore)) { $this->toRestore[$name] = $value; } $GLOBALS[$name] = $value; $this->smartyassign($name, $value); } private function setPref($name, $value) { global $prefs; if ($value != $prefs[$name] && ! array_key_exists($name, $this->prefRestore)) { $this->prefRestore[$name] = $value; } $prefs[$name] = $value; } private function smartyassign($name, $value) { $smarty = TikiLib::lib('smarty'); if (! array_key_exists($name, $this->smartyRestore)) { $this->smartyRestore[$name] = $smarty->getTemplateVars($name); } $smarty->assign($name, $value); } public function canUndo() { if ($this->canUndo !== null) { return $this->canUndo; } global $tiki_p_admin_wiki, $tiki_p_remove, $tiki_p_edit; if ($this->info['flag'] != 'L' && (( $tiki_p_edit == 'y' && $this->info['user'] == $this->user ) || $tiki_p_remove == 'y')) { $this->canUndo = true; } if ($tiki_p_admin_wiki == 'y') { $this->canUndo = true; } return $this->canUndo; } public function setInfos($infos) { $this->info = $infos; } public function setInfo($name, $value) { $this->info[$name] = $value; } public function forceLatest() { $this->content_to_render = $this->info['data']; } public function useRaw() { $this->raw = true; } private function setupComments() { $count_comments = TikiLib::lib('comments')->count_comments('wiki page:' . $this->page, 'n'); $this->smartyassign('count_comments', $count_comments); } }