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.
 
 
 
 
 
 

207 lines
9.5 KiB

<?php
// (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$
/**
* @return array
*/
function module_change_category_info()
{
return [
'name' => tra('Change Category'),
'description' => tra('Enables to categorize an object.') . " " . tra('Some combinations of Multiple categories, Detailed, Unassign and Assign may challenge intuition or be simply broken.'),
'prefs' => ['feature_categories', 'feature_wiki'],
'documentation' => 'Module change_category',
'params' => [
'id' => [
'name' => tra('Category identifier'),
'description' => tra('Changes the root of the displayed categories from default "TOP" to the category with the given identifier.') . " " . tra('Note that the root category is not displayed.') . " " . tra('Example value: 13.') . " " . tra('Defaults to 0 (root).'),
'filter' => 'int',
'profile_reference' => 'category',
],
'notop' => [
'name' => tra('No top'),
'description' => tra('In non-detailed view, disallow uncategorizing. Example value: 1.') . " " . tra('Not set by default.'),
],
'path' => [
'name' => tra('Display path'),
'description' => tra('Unless set to "n", display relative category paths in the category tree rather than category names.') . " " . tra('Paths are relative to the root category, which is not displayed.') . " " . tra('Example value:') . ' "n". ' . tra('Not set by default.'),
],
'multiple' => [
'name' => tra('Multiple categories'),
'description' => tra('If set to "n", only allows categorizing in one category (from those displayed).') . " " . tra('Not set by default.'),
],
'categorize' => [
'name' => tra('Categorize'),
'description' => tra('String to display on the button to submit new categories, when multiple categories is enabled. Default value: Categorize.'),
],
'shy' => [
'name' => tra('Shy'),
'description' => tra('If set to "y", the module is not shown on pages which are not already categorized.') . " " . tra('Not set by default.'),
],
'detail' => [
'name' => tra('Detailed'),
'description' => tra('If set to "y", shows a list of categories in which the object is. If deletion is not disabled, it is done with the list.') . " " . tra('Not set by default.'),
],
'del' => [
'name' => tra('Unassign'),
'description' => tra('If set to "n", the detailed list of categories will not offer to unassign a category.') . " " . tra('Not set by default.'),
'depends' => 'detail'
],
'add' => [
'name' => tra('Assign'),
'description' => tra('If set to "y", allow to assign new categories.') . " " . tra('Example values: y, n.') . " " . tra('Default value: y.'),
],
'group' => [
'name' => tra('Group filter'),
'description' => tra('Very particular filter option. If set to "y", only categories with a name matching one of the user\'s groups are shown, and descendants of these matching categories.') . " " . tra('Example values: y, n.') . " " . tra('Default value: n.'),
],
'imgUrlNotIn' => [
'name' => tra('Image URL not in category'),
'description' => tra('Very particular parameter. If both this and "Image URL in category" are set and the root category contains a single child category, the module only displays an image with this URL if the object is not in the category.') . ' ' . tra('Example value:') . ' http://www.example.org/img/redcross.png.',
],
'imgUrlIn' => [
'name' => tra('Image URL in category'),
'description' => tra('Very particular parameter. If both this and "Image URL not in category" are set and the root category contains a single child category, the module only displays an image with this URL if the object is in the category.') . ' ' . tra('Example value:') . ' http://www.example.org/img/bigplus.png.',
],
],
];
}
/**
* @param $mod_reference
* @param $module_params
*/
function module_change_category($mod_reference, $module_params)
{
global $prefs;
$smarty = TikiLib::lib('tiki');
$smarty = TikiLib::lib('smarty');
$modlib = TikiLib::lib('mod');
$smarty->assign('showmodule', false);
$object = current_object();
if ($object || $modlib->is_admin_mode(true)) {
$categlib = TikiLib::lib('categ');
if (! empty($module_params['id'])) {
$id = $module_params['id'];
$cat_parent = $categlib->get_category_name($id);
} else {
$id = 0;
$cat_parent = '';
}
if (! empty($module_params['shy']) && ! $modlib->is_admin_mode(true)) {
$shy = $module_params['shy'] === 'y';
} else {
$shy = false;
}
$detailed = isset($module_params['detail']) ? $module_params['detail'] : "n";
$smarty->assign('detailed', $detailed);
$add = isset($module_params['add']) ? $module_params['add'] : "y";
$smarty->assign('add', $add);
$multiple = isset($module_params['multiple']) ? $module_params['multiple'] : "y";
$smarty->assign('multiple', $multiple);
$cat_type = $object['type'];
$cat_objid = $object['object'];
$categories = $categlib->getCategories($id ? ['identifier' => $id, 'type' => 'descendants'] : null);
if (! empty($module_params['group']) && $module_params['group'] == 'y') {
global $user;
$userlib = TikiLib::lib('user');
if (! $user) {
return;
}
$userGroups = $userlib->get_user_groups_inclusion($user);
foreach ($categories as $i => $cat) {
if (isset($userGroups[$cat['name']])) {
continue;
}
$ok = false;
foreach ($cat['tepath'] as $c) {
if (isset($userGroups[$c])) {
$ok = true;
break;
}
}
if (! $ok) {
unset($categories[$i]);
}
}
}
$managedCategories = array_keys($categories);
if (isset($_REQUEST['remove']) && (! isset($module_params['del']) || $module_params['del'] != 'n')) {
$originalCategories = $categlib->get_object_categories($cat_type, $cat_objid);
// Check if the object is in the category to prevent infinite redirection.
if (in_array($_REQUEST['remove'], $originalCategories) && in_array($_REQUEST['remove'], $managedCategories)) {
$selectedCategories = [];
$managedCategories = array_intersect([(int) $_REQUEST['remove']], $managedCategories);
}
} elseif (isset($_REQUEST["modcatid"]) and $_REQUEST["modcatid"] == $id) {
if (! isset($_REQUEST['modcatchange'])) {
$selectedCategories = [];
} elseif (is_array($_REQUEST['modcatchange'])) {
$selectedCategories = $_REQUEST['modcatchange'];
} else {
$selectedCategories = [$_REQUEST['modcatchange']];
}
foreach ($selectedCategories as &$selectedCategory) {
$selectedCategory = (int) $selectedCategory;
}
if ($detailed != 'n') {
$managedCategories = array_intersect($selectedCategories, $managedCategories);
}
}
if (isset($selectedCategories)) {
$objectperms = Perms::get(['type' => $cat_type, 'object' => $cat_objid]);
if ($objectperms->modify_object_categories) {
$categlib->update_object_categories($selectedCategories, $cat_objid, $cat_type, null, null, null, $managedCategories);
}
header('Location: ' . $_SERVER['REQUEST_URI']);
die;
}
$objectCategories = $categlib->get_object_categories($cat_type, $cat_objid);
$isInAllManagedCategories = true;
foreach ($categories as &$category) {
if (in_array($category['categId'], $objectCategories)) {
$category['incat'] = 'y';
$shy = false;
} else {
$category['incat'] = 'n';
$isInAllManagedCategories = false;
}
}
if (count($categories) != 1) {
unset($module_params['imgUrlNotIn']);
unset($module_params['imgUrlIn']);
}
$smarty->assign('isInAllManagedCategories', $isInAllManagedCategories);
$smarty->assign('showmodule', ! $shy);
$objectlib = TikiLib::lib('object');
$title = $objectlib->get_title($cat_type, $cat_objid);
if (empty($cat_parent)) {
$smarty->assign('tpl_module_title', sprintf(tra('Categorize %s'), htmlspecialchars($title)));
} else {
$smarty->assign('tpl_module_title', sprintf(tra('Categorize %s in %s'), htmlspecialchars($title), htmlspecialchars($cat_parent)));
}
$smarty->assign('modcatlist', $categories);
$smarty->assign('modcatid', $id);
}
}