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.
 
 
 
 
 
 

168 lines
6.7 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$
function wikiplugin_addrelation_info()
{
return [
'name' => tra('Add Relation'),
'description' => tra('Provide a button to toggle a pre-specified relation.'),
'filter' => 'int',
'format' => 'html',
'validate' => 'all',
'prefs' => ['wikiplugin_addrelation'],
'introduced' => 8,
'iconname' => 'link-external',
'documentation' => 'PluginAddRelation',
'params' => [
'qualifier' => [
'required' => true,
'name' => tra('Qualifier'),
'description' => tra('Relation qualifier. Usually a three-part string separated by two periods.'),
'filter' => 'attribute_type',
'default' => [],
'since' => '8.0',
],
'source_object' => [
'required' => false,
'name' => tra('Source Object'),
'description' => tr('Object identifier as %0type:itemId%1 to start the relation from, will use the current
object if left blank.', '<code>', '</code>'),
'filter' => 'text',
'default' => null,
'since' => '8.0',
'profile_reference' => 'type_colon_object',
],
'target_object' => [
'required' => false,
'name' => tra('Target Object'),
'description' => tr('Object identifier as %0type:itemId%1 to end the relation to, will use the current
object if left blank.', '<code>', '</code>'),
'filter' => 'text',
'default' => null,
'since' => '8.0',
'profile_reference' => 'type_colon_object',
],
'label_add' => [
'required' => false,
'name' => tra('Button Text for Add'),
'description' => tra('Text to show on the button to add relation'),
'filter' => 'text',
'since' => '8.0',
'default' => tra('Add Relation'),
],
'label_added' => [
'required' => false,
'name' => tra('Button Text for Already Added State'),
'description' => tra('Text to show on the button when relation is already added'),
'filter' => 'text',
'since' => '8.0',
'default' => tra('Relation Added'),
],
'label_remove' => [
'required' => false,
'name' => tra('Mouseover Button Text for Remove'),
'description' => tra('Text to show on the button to remove relation'),
'filter' => 'text',
'since' => '8.0',
'default' => tra('Remove Relation'),
],
'button_id' => [
'required' => false,
'name' => tra('Button ID'),
'description' => tra('A unique ID to distinguish the button from others on the page if there is more than one'),
'filter' => 'text',
'since' => '8.0',
'default' => '0',
],
'button_class' => [
'required' => false,
'name' => tra('Set Button Class'),
'description' => tra('Class or classes for the Button'),
'filter' => 'text',
'since' => '8.0',
'default' => 'btn btn-primary',
],
],
];
}
function wikiplugin_addrelation($data, $params)
{
global $user;
if (isset($params['source_object']) && false !== strpos($params['source_object'], ':')) {
list($source_object['type'], $source_object['object']) = explode(':', $params['source_object'], 2);
} else {
$source_object = current_object();
}
if (isset($params['target_object']) && false !== strpos($params['target_object'], ':')) {
list($target_object['type'], $target_object['object']) = explode(':', $params['target_object'], 2);
} else {
$target_object = current_object();
}
if ($source_object == $target_object) {
return tra('Source and target object cannot be the same');
}
if (! isset($params['qualifier'])) {
return WikiParser_PluginOutput::argumentError(['qualifier']);
} else {
$qualifier = $params['qualifier'];
}
if (! empty($params['label_add'])) {
$labeladd = $params['label_add'];
} else {
$labeladd = tra('Add Relation');
}
if (! empty($params['label_remove'])) {
$labelremove = $params['label_remove'];
} else {
$labelremove = tra('Remove Relation');
}
if (! empty($params['label_added'])) {
$labeladded = $params['label_added'];
} else {
$labeladded = tra('Relation Added');
}
if (! empty($params['button_id'])) {
$id = 'wp_addrelation_' . $params['button_id'];
} else {
$id = 'wp_addrelation_0';
}
if (! empty($params['button_class'])) {
$button_class = $params['button_class'];
} else {
$button_class = "btn btn-primary";
}
$relationlib = TikiLib::lib('relation');
if (isset($_POST[$id])) {
if ($_POST[$id] == 'y') {
$relationlib->add_relation($qualifier, $source_object['type'], $source_object['object'], $target_object['type'], $target_object['object']);
} elseif ($_POST[$id] == 'n') {
if ($relation_id = $relationlib->get_relation_id($qualifier, $source_object['type'], $source_object['object'], $target_object['type'], $target_object['object'])) {
$relationlib->remove_relation($relation_id);
}
}
}
$relationsfromsource = $relationlib->get_relations_from($source_object['type'], $source_object['object'], $qualifier);
$relationexists = false;
foreach ($relationsfromsource as $r) {
if ($r['itemId'] == $target_object['object'] && $r['type'] == $target_object['type']) {
$relationexists = true;
break;
}
}
$smarty = TikiLib::lib('smarty');
$smarty->assign('wp_addrelation_id', $id);
$smarty->assign('wp_addrelation_action', $relationexists ? 'n' : 'y');
$smarty->assign('label_add', $labeladd);
$smarty->assign('label_added', $labeladded);
$smarty->assign('label_remove', $labelremove);
$smarty->assign('button_class', $button_class);
return $smarty->fetch('wiki-plugins/wikiplugin_addrelation.tpl');
}