PageRenderTime 22ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/wiki-plugins/wikiplugin_trackeritemcopy.php

https://gitlab.com/ElvisAns/tiki
PHP | 283 lines | 243 code | 30 blank | 10 comment | 38 complexity | ad97aabd0f984a1a4a65344baa61e1a8 MD5 | raw file
  1. <?php
  2. // (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
  3. //
  4. // All Rights Reserved. See copyright.txt for details and a complete list of authors.
  5. // Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
  6. // $Id$
  7. function wikiplugin_trackeritemcopy_info()
  8. {
  9. return [
  10. 'name' => tra('Copy Tracker Item'),
  11. 'documentation' => tra('PluginTrackerItemCopy'),
  12. 'description' => tra('Copy a tracker item'),
  13. 'prefs' => ['wikiplugin_trackeritemcopy', 'feature_trackers'],
  14. 'validate' => 'all',
  15. 'filter' => 'wikicontent',
  16. 'iconname' => 'copy',
  17. 'introduced' => 7,
  18. 'tags' => [ 'experimental' ],
  19. 'params' => [
  20. 'trackerId' => [
  21. 'required' => true,
  22. 'name' => tra('Tracker ID'),
  23. 'description' => tr(
  24. 'Tracker from which to copy item, joined tracker ids separated by %0:%1',
  25. '<code>',
  26. '</code>'
  27. ),
  28. 'since' => '7.0',
  29. 'filter' => 'text',
  30. 'default' => '',
  31. 'separator' => [':'],
  32. 'profile_reference' => 'tracker',
  33. ],
  34. 'linkFieldIds' => [
  35. 'required' => true,
  36. 'name' => tra('Link Field IDs'),
  37. 'description' => tr('Fields links that are related to this tracker that you would like to join on,
  38. separated by %0:%1', '<code>', '</code>'),
  39. 'since' => '8.0',
  40. 'filter' => 'text',
  41. 'default' => '',
  42. 'separator' => [':'],
  43. 'profile_reference' => 'tracker_field',
  44. ],
  45. 'copyFieldIds' => [
  46. 'required' => true,
  47. 'name' => tra('Copy Field IDs'),
  48. 'description' => tr('Field IDs to copy old value of, separated by %0:%1, joined fields separated by
  49. %0|%1', '<code>', '</code>'),
  50. 'since' => '7.0',
  51. 'filter' => 'text',
  52. 'default' => '',
  53. 'separator' => ['|', ':'],
  54. 'profile_reference' => 'tracker_field',
  55. ],
  56. 'updateFieldIds' => [
  57. 'required' => false,
  58. 'name' => tra('Update Field IDs'),
  59. 'description' => tr('Field IDs to update with new values specified, separated by %0:%1, joined fields
  60. separated by %0|%1', '<code>', '</code>'),
  61. 'since' => '7.0',
  62. 'filter' => 'text',
  63. 'default' => '',
  64. 'separator' => ['|', ':'],
  65. 'profile_reference' => 'tracker_field',
  66. ],
  67. 'updateFieldValues' => [
  68. 'required' => false,
  69. 'name' => tra('New Values'),
  70. 'description' => tr('New values to replace for the field IDs specified, separated by %0:%1, joined
  71. fields separated by %0|%1. %0randomstring%1 will generate random string; and %0f_xx%1 to use value of
  72. field xx of itemId', '<code>', '</code>'),
  73. 'since' => '7.0',
  74. 'filter' => 'text',
  75. 'default' => '',
  76. 'separator' => ['|', ':'],
  77. 'profile_reference' => 'tracker_field',
  78. ],
  79. 'itemId' => [
  80. 'required' => false,
  81. 'name' => tra('Item ID'),
  82. 'description' => tra('ID of item to make copy of, otherwise input is asked for'),
  83. 'since' => '7.0',
  84. 'filter' => 'text',
  85. 'default' => '',
  86. 'profile_reference' => 'tracker_item',
  87. ],
  88. 'copies_on_load' => [
  89. 'required' => false,
  90. 'name' => tra('Make this number of copies on load'),
  91. 'description' => tra('Set the number of copies to make on load of plugin automatically'),
  92. 'since' => '7.0',
  93. 'filter' => 'int',
  94. 'default' => ''
  95. ],
  96. 'return_array' => [
  97. 'required' => false,
  98. 'name' => tra('Returns array non-interactively'),
  99. 'advanced' => true,
  100. 'description' => tr('If Yes (%0y%1), returns array of new information instead of displaying results
  101. to screen, used in non-interactive mode', '<code>', '</code>'),
  102. 'since' => '7.0',
  103. 'filter' => 'text',
  104. 'default' => '',
  105. ],
  106. ],
  107. ];
  108. }
  109. function wikiplugin_trackeritemcopy($data, $params)
  110. {
  111. $trklib = TikiLib::lib("trk");
  112. $smarty = TikiLib::lib('smarty');
  113. if (! isset($params["trackerId"]) || ! isset($params["copyFieldIds"])) {
  114. return tra('Missing mandatory parameters');
  115. } else {
  116. $trackerId = $params["trackerId"];
  117. if (is_array($trackerId) == false) {
  118. $trackerId = [$trackerId];
  119. }
  120. $copyFieldIds = $params["copyFieldIds"];
  121. }
  122. $smarty->assign('itemIdSet', 'n');
  123. $itemId = 0;
  124. if (isset($params["itemId"])) {
  125. $itemId = $params["itemId"];
  126. $smarty->assign('itemIdSet', 'y');
  127. } elseif (isset($_POST["itemIdToCopy"])) {
  128. $itemId = $_POST["itemIdToCopy"];
  129. }
  130. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  131. $items_copy = function ($trackerId, $updateFieldIds, $updateFieldValues, $copyFieldIds, $itemIds, $linkFieldId, $itemLinkId, $copies) {
  132. $trklib = TikiLib::lib('trk');
  133. if (is_array($itemIds) == false) {
  134. $itemIds = [$itemIds];
  135. }
  136. foreach ($itemIds as $itemId) {
  137. $tracker_fields_info = $trklib->list_tracker_fields($trackerId);
  138. $fieldTypes = [];
  139. $fieldOptionsArray = [];
  140. foreach ($tracker_fields_info['data'] as $t) {
  141. $fieldTypes[$t['fieldId']] = $t['type'];
  142. $fieldOptionsArray[$t['fieldId']] = $t['options_array'];
  143. }
  144. $ins_fields["data"] = [];
  145. if (isset($linkFieldId) && isset($itemLinkId)) {
  146. $updateFieldIds[] = $linkFieldId;
  147. $updateFieldValues[] = $itemLinkId;
  148. }
  149. //print_r(array($trackerId, $updateFieldIds, $updateFieldValues, $copyFieldIds, $itemIds, $linkFieldId, $itemLinkId, $copies));
  150. for ($i = 0, $count_updateFieldIds = count($updateFieldIds); $i < $count_updateFieldIds; $i++) {
  151. $ins_fields["data"][] = [
  152. 'options_array' => $fieldOptionsArray[$updateFieldIds[$i]],
  153. 'type' => $fieldTypes[$updateFieldIds[$i]],
  154. 'fieldId' => $updateFieldIds[$i],
  155. 'value' => $updateFieldValues[$i]
  156. ];
  157. }
  158. // CUSTOM: this part is totally custom to store admin notes (how to generalize?)
  159. if (! empty($_POST['admin_notes_for_copy'])) {
  160. $ins_fields["data"][] = [
  161. 'type' => 'a',
  162. 'fieldId' => 118,
  163. 'value' => $_POST['admin_notes_for_copy']
  164. ];
  165. }
  166. // end totally CUSTOM part
  167. $newitems = [];
  168. for ($i = 0; $i < $copies; $i++) {
  169. // Check for -randomstring- and f_xx
  170. $ins_fields_final["data"] = [];
  171. foreach ($ins_fields["data"] as $h) {
  172. if ($h["value"] == '-randomstring-') {
  173. $h["value"] = $trklib->genPass();
  174. } elseif (substr($h["value"], 0, 2) == 'f_') {
  175. $sourceFieldId = (int) trim(substr($h["value"], 2));
  176. $h["value"] = $trklib->get_item_value($trackerId, $itemId, $sourceFieldId);
  177. }
  178. $ins_fields_final["data"][] = $h;
  179. }
  180. $newitemsdata[] = $ins_fields_final["data"];
  181. $newitems[] = $trklib->replace_item($trackerId, 0, $ins_fields_final);
  182. }
  183. foreach ($newitems as $n) {
  184. $trklib->copy_item($itemId, $n, null, $copyFieldIds);
  185. $newitemslist .= ' ' . $n;
  186. }
  187. }
  188. return [
  189. "items" => $newitems,
  190. "data" => $newitemsdata,
  191. "list" => $newitemslist
  192. ];
  193. };
  194. $return_array = [];
  195. $itemIds = [];
  196. foreach ($trackerId as $key => $trackerIdLeft) {
  197. //ensure that the fields are set and usable
  198. if (isset($params["updateFieldIds"]) || isset($params["updateFieldValues"])) {
  199. $updateFieldIds = $params["updateFieldIds"];
  200. $updateFieldValues = $params["updateFieldValues"];
  201. foreach ($updateFieldIds as $key => $updateFieldId) {
  202. if (count($updateFieldIds[$key]) != count($updateFieldValues[$key])) {
  203. return tra('Number of update fields do not match new values');
  204. }
  205. }
  206. $copyFieldIds[$key] = array_diff($copyFieldIds[$key], $updateFieldIds);
  207. }
  208. if ($_SERVER['REQUEST_METHOD'] == 'POST' && $itemId && isset($_POST['copytrackeritem']) && isset($_POST['numberofcopies'])) {
  209. $copies = (int) $_POST['numberofcopies'];
  210. } elseif (isset($params['copies_on_load'])) {
  211. $copies = (int) $params['copies_on_load'];
  212. } else {
  213. $copies = 0;
  214. }
  215. if ($copies > 0) {
  216. if ($key > 0) {
  217. $qry = Tracker_Query::tracker($trackerIdLeft)
  218. ->fields($params["linkFieldIds"][0])
  219. ->equals([$itemId]);
  220. $itemIds = [];
  221. foreach ($qry as $linkedItemIds => $item) {
  222. $itemIds[] = $linkedItemIds;
  223. }
  224. }
  225. $return_array[] = $items_copy(
  226. $trackerId[$key],
  227. $updateFieldIds[$key],
  228. $updateFieldValues[$key],
  229. $copyFieldIds[$key],
  230. (
  231. $key == 0 ? $itemId : $itemIds
  232. ),
  233. (
  234. $key == 0 ? null : $params["linkFieldIds"][$key - 1]
  235. ),
  236. (
  237. $key == 0 ? null : $return_array[0]['items'][0]
  238. ),
  239. $copies
  240. );
  241. }
  242. }
  243. $smarty->assign('newitemslist', $return_array['list']);
  244. if ($params['return_array'] == 'y') {
  245. if (count($return_array) == 1) { //backward compatible
  246. return $return_array[0];
  247. } else {
  248. return $return_array;
  249. }
  250. }
  251. }
  252. return $smarty->fetch('wiki-plugins/wikiplugin_trackeritemcopy.tpl');
  253. }