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.
 
 
 
 
 
 

381 lines
15 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$
$auto_query_args = ['page_ref_id', 'offset', 'find_objects'];
require_once('tiki-setup.php');
$structlib = TikiLib::lib('struct');
$access->check_feature(['feature_wiki','feature_wiki_structure']);
if (! isset($_REQUEST["page_ref_id"])) {
$smarty->assign('msg', tra("No structure indicated"));
$smarty->display("error.tpl");
die;
}
$page_info = $structlib->s_get_page_info($_REQUEST["page_ref_id"]);
$access->check_permission('tiki_p_view', tra('View this wiki page'), 'wiki page', $page_info['pageName']);
if (isset($_REQUEST['move_to'])) {
check_ticket('edit-structure');
$structlib->move_to_structure($_REQUEST['page_ref_id'], $_REQUEST['structure_id'], $_REQUEST['begin']);
}
$structure_info = $structlib->s_get_structure_info($_REQUEST["page_ref_id"]);
$smarty->assign('page_ref_id', $_REQUEST["page_ref_id"]);
$smarty->assign('structure_id', $structure_info["page_ref_id"]);
$smarty->assign('structure_name', $structure_info["pageName"]);
$perms = Perms::get((['type' => 'wiki page', 'object' => $structure_info["pageName"]]));
$tikilib->get_perm_object($structure_info["pageName"], 'wiki page', $page_info); // global perms still needed for logic in categorize.tpl
if (! $perms->view) {
$smarty->assign('errortype', 401);
$smarty->assign('msg', tra('You do not have permission to view this page.'));
$smarty->display("error.tpl");
die;
}
if ($perms->edit_structures) {
if ($prefs['lock_wiki_structures'] === 'y') {
$lockedby = TikiLib::lib('attribute')->get_attribute('wiki structure', $structure_info['pageName'], 'tiki.object.lock');
if ($lockedby && $lockedby === $user && $perms->lock_structures || ! $lockedby || $perms->admin_structures) {
$editable = 'y';
} else {
$editable = 'n';
}
} else {
$editable = 'y';
}
} else {
$editable = 'n';
}
$smarty->assign('editable', $editable);
$alert_categorized = [];
$alert_in_st = [];
$alert_to_remove_cats = [];
$alert_to_remove_extra_cats = [];
// needed here for filtering later in the search results
$subtree = $structlib->get_subtree($structure_info["page_ref_id"]);
// start security hardened section
if ($editable === 'y') {
$smarty->assign('remove', 'n');
if (isset($_REQUEST["remove"])) {
check_ticket('edit-structure');
$smarty->assign('remove', 'y');
$remove_info = $structlib->s_get_page_info($_REQUEST["remove"]);
$structs = $structlib->get_page_structures($remove_info['pageName'], $structure);
//If page is member of more than one structure, do not give option to remove page
$single_struct = (count($structs) == 1);
if ($single_struct && $perms->remove) {
$smarty->assign('page_removable', 'y');
} else {
$smarty->assign('page_removable', 'n');
}
$smarty->assign('removepage', $_REQUEST["remove"]);
$smarty->assign('removePageName', $remove_info["pageName"]);
}
if (isset($_REQUEST["rremove"])) {
$access->check_authenticity();
$structlib->s_remove_page($_REQUEST["rremove"], false, empty($_REQUEST['page']) ? '' : $_REQUEST['page']);
$_REQUEST["page_ref_id"] = $page_info["parent_id"];
}
# TODO : Case where the index page of the structure is removed seems to be unexpected, leaving a corrupted structure
if (isset($_REQUEST["sremove"])) {
$access->check_authenticity();
$page = $page_info["pageName"];
$delete = $tikilib->user_has_perm_on_object($user, $page_info['pageName'], 'wiki page', 'tiki_p_remove');
$structlib->s_remove_page($_REQUEST["sremove"], $delete, empty($_REQUEST['page']) ? '' : $_REQUEST['page']);
$_REQUEST["page_ref_id"] = $page_info["parent_id"];
}
if ($prefs['feature_user_watches'] == 'y' && $tiki_p_watch_structure == 'y' && $user && ! empty($_REQUEST['watch_object']) && ! empty($_REQUEST['watch_action'])) {
check_ticket('edit-structure');
if ($_REQUEST['watch_action'] == 'add' && ! empty($_REQUEST['page'])) {
$tikilib->add_user_watch($user, 'structure_changed', $_REQUEST['watch_object'], 'structure', $page, "tiki-index.php?page_ref_id=" . $_REQUEST['watch_object']);
} elseif ($_REQUEST['watch_action'] == 'remove') {
$tikilib->remove_user_watch($user, 'structure_changed', $_REQUEST['watch_object'], 'structure');
}
}
if (! isset($structure_info) or ! isset($page_info)) {
$smarty->assign('msg', tra("Invalid structure_id or page_ref_id"));
$smarty->display("error.tpl");
die;
}
$smarty->assign('alert_exists', 'n');
if (isset($_REQUEST["create"])) {
check_ticket('edit-structure');
if (isset($_REQUEST["pageAlias"])) {
$structlib->set_page_alias($_REQUEST["page_ref_id"], $_REQUEST["pageAlias"]);
}
$after = null;
if (isset($_REQUEST['after_ref_id'])) {
$after = $_REQUEST['after_ref_id'];
}
if (! (empty($_REQUEST['name']))) {
if ($tikilib->page_exists($_REQUEST["name"])) {
$smarty->assign('alert_exists', 'y');
}
$structlib->s_create_page($_REQUEST['page_ref_id'], $after, $_REQUEST['name'], '', $structure_info['page_ref_id']);
$userlib->copy_object_permissions($page_info["pageName"], $_REQUEST["name"], 'wiki page');
} elseif (! empty($_REQUEST['name2'])) {
foreach ($_REQUEST['name2'] as $name) {
$new_page_ref_id = $structlib->s_create_page($_REQUEST['page_ref_id'], $after, $name, '', $structure_info['page_ref_id']);
$after = $new_page_ref_id;
}
}
if ($prefs['feature_wiki_categorize_structure'] == 'y') {
$categlib = TikiLib::lib('categ');
$pages_added = [];
if (! (empty($_REQUEST['name']))) {
$pages_added[] = $_REQUEST['name'];
} elseif (! empty($_REQUEST['name2'])) {
foreach ($_REQUEST['name2'] as $name) {
$pages_added[] = $name;
}
}
$cat_type = 'wiki page';
foreach ($pages_added as $name) {
$structlib->categorizeNewStructurePage($name, $structure_info);
}
}
}
if (isset($_REQUEST["move_node"])) {
if ($_REQUEST["move_node"] == '1') {
$structlib->promote_node($_REQUEST["page_ref_id"]);
} elseif ($_REQUEST["move_node"] == '2') {
$structlib->move_before_previous_node($_REQUEST["page_ref_id"]);
} elseif ($_REQUEST["move_node"] == '3') {
$structlib->move_after_next_node($_REQUEST["page_ref_id"]);
} elseif ($_REQUEST["move_node"] == '4') {
$structlib->demote_node($_REQUEST["page_ref_id"]);
}
}
if (isset($_REQUEST["find_objects"])) {
$find_objects = $_REQUEST["find_objects"];
} else {
$find_objects = '';
}
$smarty->assign('find_objects', $find_objects);
$filter = [];
if (! empty($_REQUEST['categId'])) {
$filter['categId'] = $_REQUEST['categId'];
$smarty->assign('find_categId', $_REQUEST['categId']);
} else {
$smarty->assign('find_categId', '');
}
if (! isset($_REQUEST["offset"])) {
$offset = 0;
} else {
$offset = $_REQUEST["offset"];
}
$smarty->assign_by_ref('offset', $offset);
// Get all wiki pages for the dropdown menu
$listpages = $tikilib->list_pages(
$offset,
$prefs['maxRecords'],
'pageName_asc',
$find_objects,
'',
false,
true,
false,
false,
$filter
);
if ($prefs['page_n_times_in_a_structure'] === 'n') {
// pages can appear only once in a structure so filter them out
$listpages['data'] = array_filter($listpages['data'], function ($item) use ($subtree) {
foreach ($subtree as $sub) {
if ($item['pageName'] === $sub['pageName']) {
return false;
}
}
return true;
});
}
$smarty->assign_by_ref('listpages', $listpages);
} // end of security hardening
$page_info = $structlib->s_get_page_info($_REQUEST["page_ref_id"]);
$smarty->assign('pageName', $page_info["pageName"]);
$smarty->assign('pageAlias', $page_info["page_alias"]);
$smarty->assign('topPageAlias', $structure_info["page_alias"]);
$subpages = $structlib->s_get_pages($_REQUEST["page_ref_id"]);
$max = count($subpages);
$smarty->assign_by_ref('subpages', $subpages);
if ($max != 0) {
$last_child = $subpages[$max - 1];
$smarty->assign('insert_after', $last_child["page_ref_id"]);
}
$structures = $structlib->list_structures(0, -1, 'pageName_asc');
$structures_filtered = array_filter($structures['data'], function ($struct) {
return $struct['editable'] === 'y';
});
$smarty->assign_by_ref('structures', $structures_filtered);
foreach ($subtree as $i => $s) { // dammed recursivite - acn not do a left join
if ($tikilib->user_watches($user, 'structure_changed', $s['page_ref_id'], 'structure')) {
$subtree[$i]['event'] = true;
}
}
$smarty->assign('subtree', $subtree);
if ($tikilib->user_watches($user, 'structure_changed', $structure_info['page_ref_id'], 'structure')) {
$page_info['watching'] = true;
}
$smarty->assign('page_info', $page_info);
// Re-categorize
if ($editable === 'y') {
$all_editable = 'y';
foreach ($subtree as $k => $st) {
if ($st['editable'] != 'y' && $k > 0) {
$all_editable = 'n';
break;
}
}
} else {
$all_editable = 'n';
}
$smarty->assign('all_editable', $all_editable);
if (isset($_REQUEST["recategorize"]) && $prefs['feature_wiki_categorize_structure'] == 'y' && $all_editable == 'y') {
$cat_name = $structure_info["pageName"];
$cat_objid = $cat_name;
$cat_href = "tiki-index.php?page=" . urlencode($cat_name);
$cat_desc = '';
$cat_type = 'wiki page';
include_once("categorize.php");
$categories = []; // needed to prevent double entering (the first time when page is being categorized in categorize.php)
//include_once("categorize_list.php"); // needs to be up here to avoid picking up selection of cats from other existing sub-pages
//get array of pages in structure
$othobjid = $structlib->s_get_structure_pages($structure_info["page_ref_id"]);
foreach ($othobjid as $othobjs) {
if ($othobjs["parent_id"] > 0) {
// check for page being in other structure.
$strucs = $structlib->get_page_structures($othobjs["pageName"]);
if (count($strucs) > 1) {
$alert_in_st[] = $othobjs["pageName"];
}
$cat_objid = $othobjs["pageName"];
$cat_name = $cat_objid;
$cat_href = "tiki-index.php?page=" . urlencode($cat_objid);
$catObjectId = $categlib->is_categorized($cat_type, $cat_objid);
if (! $catObjectId) {
// page that is added is not categorized -> categorize it if necessary
if (isset($_REQUEST["cat_categorize"]) && $_REQUEST["cat_categorize"] == 'on' && isset($_REQUEST["cat_categories"])) {
$catObjectId = $categlib->add_categorized_object($cat_type, $cat_objid, $cat_desc, $cat_name, $cat_href);
foreach ($_REQUEST["cat_categories"] as $cat_acat) {
$categlib->categorize($catObjectId, $cat_acat);
}
}
} else {
// page that is added is categorized
if (! isset($_REQUEST["cat_categories"]) || ! isset($_REQUEST["cat_categorize"]) || isset($_REQUEST["cat_categorize"]) && $_REQUEST["cat_categorize"] != 'on') {
if ($_REQUEST["cat_override"] == "on") {
$categlib->uncategorize_object($cat_type, $cat_objid);
} else {
$alert_to_remove_cats[] = $cat_name;
}
} else {
if ($_REQUEST["cat_override"] == "on") {
$categlib->uncategorize_object($cat_type, $cat_objid);
foreach ($_REQUEST["cat_categories"] as $cat_acat) {
$catObjectId = $categlib->is_categorized($cat_type, $cat_objid);
if (! $catObjectId) {
// The object is not categorized
$catObjectId = $categlib->add_categorized_object($cat_type, $cat_objid, $cat_desc, $cat_name, $cat_href);
}
$categlib->categorize($catObjectId, $cat_acat);
}
} else {
$cats = $categlib->get_object_categories($cat_type, $cat_objid);
$numberofcats = count($cats);
foreach ($_REQUEST["cat_categories"] as $cat_acat) {
if (! in_array($cat_acat, $cats, true)) {
$categlib->categorize($catObjectId, $cat_acat);
$numberofcats += 1;
}
}
if ($numberofcats > count($_REQUEST["cat_categories"])) {
$alert_to_remove_extra_cats[] = $cat_name;
}
}
}
}
}
}
}
$smarty->assign('alert_in_st', $alert_in_st);
$smarty->assign('alert_categorized', $alert_categorized);
$smarty->assign('alert_to_remove_cats', $alert_to_remove_cats);
$smarty->assign('alert_to_remove_extra_cats', $alert_to_remove_extra_cats);
if ($prefs['feature_wiki_categorize_structure'] == 'y' && $all_editable == 'y') {
$cat_name = $structure_info["pageName"];
$cat_objid = $cat_name;
$cat_href = "tiki-index.php?page=" . urlencode($cat_name);
$cat_desc = '';
$cat_type = 'wiki page';
include_once("categorize_list.php");
} elseif ($prefs['feature_categories'] == 'y') {
$categlib = TikiLib::lib('categ');
$categories = $categlib->getCategories();
$smarty->assign_by_ref('categories', $categories);
}
ask_ticket('edit-structure');
include_once('tiki-section_options.php');
if ($prefs['feature_jquery_ui'] === 'y') {
$headerlib->add_jsfile('lib/structures/tiki-edit_structure.js');
$headerlib->add_jsfile('vendor_bundled/vendor/jquery-plugins/nestedsortable/jquery.ui.nestedSortable.js');
$structlib = TikiLib::lib('struct');
$structure_id = $structure_info['structure_id'];
if (! $structure_id) {
$structure_id = $structure_info['page_ref_id'];
}
$smarty->assign('nodelist', $structlib->get_toc($structure_id, 'asc', false, false, '', 'admin', $page_info['page_ref_id'], 0, 0, 'struct', ''));
// $page_ref_id,$order='asc',$showdesc=false,$numbering=true,$numberPrefix='',$type='plain',$page='',$maxdepth=0,$mindepth=0, $structurePageName=''
$smarty->assign('structure_id', $structure_id);
}
// disallow robots to index page:
$smarty->assign('metatag_robots', 'NOINDEX, NOFOLLOW');
// Display the template
$smarty->assign('mid', 'tiki-edit_structure.tpl');
$smarty->display("tiki.tpl");