1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: 666: 667: 668: 669: 670: 671: 672: 673: 674: 675: 676: 677: 678: 679: 680: 681: 682: 683: 684: 685: 686: 687: 688: 689: 690: 691: 692: 693: 694: 695: 696: 697: 698: 699: 700: 701: 702: 703: 704: 705: 706: 707: 708: 709: 710: 711: 712: 713: 714: 715: 716: 717: 718: 719: 720: 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: 734: 735: 736: 737: 738: 739: 740: 741: 742: 743: 744: 745: 746: 747: 748: 749: 750: 751: 752: 753: 754: 755: 756: 757: 758: 759: 760: 761: 762: 763: 764: 765: 766: 767: 768: 769: 770: 771: 772: 773: 774: 775: 776: 777: 778: 779: 780: 781: 782: 783: 784: 785: 786: 787: 788: 789: 790: 791: 792: 793: 794: 795: 796: 797: 798: 799: 800: 801: 802: 803: 804: 805: 806: 807: 808: 809: 810: 811: 812: 813: 814: 815: 816: 817: 818: 819: 820: 821: 822: 823: 824: 825: 826: 827: 828: 829: 830: 831: 832: 833: 834: 835: 836: 837: 838: 839: 840: 841: 842: 843: 844: 845: 846: 847: 848: 849: 850: 851: 852: 853: 854: 855: 856: 857: 858: 859: 860: 861: 862: 863: 864: 865: 866: 867: 868: 869: 870: 871: 872: 873: 874: 875: 876: 877: 878: 879: 880: 881: 882: 883: 884: 885: 886: 887: 888: 889: 890: 891: 892: 893: 894: 895: 896: 897: 898: 899: 900: 901: 902: 903: 904: 905: 906: 907: 908: 909: 910: 911: 912: 913: 914:
<?php
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
abstract class CommonTreeDropdown extends CommonDropdown {
public $can_be_translated = false;
function getAdditionalFields() {
return [['name' => $this->getForeignKeyField(),
'label' => __('As child of'),
'type' => 'parent',
'list' => false]];
}
function defineTabs($options = []) {
$ong = [];
$this->addDefaultFormTab($ong);
$this->addStandardTab($this->getType(), $ong, $options);
if ($this->dohistory) {
$this->addStandardTab('Log', $ong, $options);
}
if (DropdownTranslation::canBeTranslated($this)) {
$this->addStandardTab('DropdownTranslation', $ong, $options);
}
return $ong;
}
function getTabNameForItem(CommonGLPI $item, $withtemplate = 0) {
if (!$withtemplate
&& ($item->getType() == $this->getType())) {
$nb = 0;
if ($_SESSION['glpishow_count_on_tabs']) {
$nb = countElementsInTable($this->getTable(),
[$this->getForeignKeyField() => $item->getID()]);
}
return self::createTabEntry($this->getTypeName(Session::getPluralNumber()), $nb);
}
return '';
}
static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0) {
if ($item instanceof CommonTreeDropdown) {
$item->showChildren();
}
return true;
}
static function getCompleteNameFromParents($parentCompleteName, $thisName) {
return addslashes($parentCompleteName). " > ".$thisName;
}
function adaptTreeFieldsFromUpdateOrAdd($input) {
$parent = clone $this;
if (!isset($input['name']) && isset($this->fields['name'])) {
$input['name'] = addslashes($this->fields['name']);
}
$input['name'] = trim($input['name']);
if (isset($input[$this->getForeignKeyField()])
&& !$this->isNewID($input[$this->getForeignKeyField()])
&& $parent->getFromDB($input[$this->getForeignKeyField()])) {
$input['level'] = $parent->fields['level']+1;
$input['completename'] = self::getCompleteNameFromParents($parent->fields['completename'],
$input['name']);
} else {
$input[$this->getForeignKeyField()] = 0;
$input['level'] = 1;
$input['completename'] = $input['name'];
}
return $input;
}
function prepareInputForAdd($input) {
return $this->adaptTreeFieldsFromUpdateOrAdd($input);
}
function pre_deleteItem() {
global $DB;
if (isset($this->input['_replace_by']) && $this->input['_replace_by']) {
$parent = $this->input['_replace_by'];
} else {
$parent = $this->fields[$this->getForeignKeyField()];
}
$this->cleanParentsSons();
$tmp = clone $this;
$result = $DB->request(
[
'SELECT' => 'id',
'FROM' => $this->getTable(),
'WHERE' => [$this->getForeignKeyField() => $this->fields['id']]
]
);
foreach ($result as $data) {
$data[$this->getForeignKeyField()] = $parent;
$tmp->update($data);
}
return true;
}
function prepareInputForUpdate($input) {
global $GLPI_CACHE;
if (isset($input[$this->getForeignKeyField()])) {
if (in_array($input[$this->getForeignKeyField()],
getSonsOf($this->getTable(), $input['id']))) {
return false;
}
if ($input[$this->getForeignKeyField()] != $this->fields[$this->getForeignKeyField()]) {
$input["ancestors_cache"] = '';
if (Toolbox::useCache()) {
$ckey = 'ancestors_cache_' . md5($this->getTable() . $this->getID());
$GLPI_CACHE->delete($ckey);
}
return $this->adaptTreeFieldsFromUpdateOrAdd($input);
}
}
if ((isset($input['name'])) && ($input['name'] != $this->fields['name'])) {
return $this->adaptTreeFieldsFromUpdateOrAdd($input);
}
return $input;
}
function regenerateTreeUnderID($ID, $updateName, $changeParent) {
global $DB, $GLPI_CACHE;
if ($changeParent && Toolbox::useCache()) {
$ckey = 'ancestors_cache_' . md5($this->getTable() . $ID);
$GLPI_CACHE->delete($ckey);
}
if (($updateName) || ($changeParent)) {
$currentNode = clone $this;
if ($currentNode->getFromDB($ID)) {
$currentNodeCompleteName = $currentNode->getField("completename");
$nextNodeLevel = ($currentNode->getField("level") + 1);
} else {
$nextNodeLevel = 1;
}
$query = [
'SELECT' => ['id', 'name'],
'FROM' => $this->getTable(),
'WHERE' => [$this->getForeignKeyField() => $ID]
];
if (Session::haveTranslations($this->getType(), 'completename')) {
DropdownTranslation::regenerateAllCompletenameTranslationsFor($this->getType(), $ID);
}
foreach ($DB->request($query) as $data) {
$update = [];
if ($updateName || $changeParent) {
if (isset($currentNodeCompleteName)) {
$update['completename'] = self::getCompleteNameFromParents(
$currentNodeCompleteName,
addslashes($data["name"])
);
} else {
$update['completename'] = addslashes($data["name"]);
}
}
if ($changeParent) {
$update['ancestors_cache'] = 'NULL';
$update['level'] = $nextNodeLevel;
}
$DB->update(
$this->getTable(),
$update,
['id' => $data['id']]
);
if (Session::haveTranslations($this->getType(), 'completename')) {
DropdownTranslation::regenerateAllCompletenameTranslationsFor($this->getType(), $data['id']);
}
$this->regenerateTreeUnderID($data["id"], $updateName, $changeParent);
}
}
}
protected function cleanParentsSons($id = null, $cache = true) {
global $DB, $GLPI_CACHE;
if ($id === null) {
$id = $this->getID();
}
$ancestors = getAncestorsOf($this->getTable(), $id);
if ($id != $this->getID()) {
$ancestors[$id] = "$id";
}
if (!count($ancestors)) {
return;
}
$DB->update(
$this->getTable(), [
'sons_cache' => 'NULL'
], [
'id' => $ancestors
]
);
if ($cache && Toolbox::useCache()) {
foreach ($ancestors as $ancestor) {
$ckey = 'sons_cache_' . md5($this->getTable() . $ancestor);
if ($GLPI_CACHE->has($ckey)) {
$sons = $GLPI_CACHE->get($ckey);
if (isset($sons[$this->getID()])) {
unset($sons[$this->getID()]);
$GLPI_CACHE->set($ckey, $sons);
}
} else {
$GLPI_CACHE->delete($ckey);
}
}
}
}
protected function addSonInParents() {
global $GLPI_CACHE;
if (Toolbox::useCache()) {
$ancestors = getAncestorsOf($this->getTable(), $this->getID());
foreach ($ancestors as $ancestor) {
$ckey = 'sons_cache_' . md5($this->getTable() . $ancestor);
if ($GLPI_CACHE->has($ckey)) {
$sons = $GLPI_CACHE->get($ckey);
if (!isset($sons[$this->getID()])) {
$sons[$this->getID()] = (string)$this->getID();
$GLPI_CACHE->set($ckey, $sons);
}
} else {
$GLPI_CACHE->delete($ckey);
}
}
}
}
function post_addItem() {
$parent = $this->fields[$this->getForeignKeyField()];
$this->cleanParentsSons(null, false);
$this->addSonInParents();
if ($parent && $this->dohistory) {
$changes = [
0,
'',
addslashes($this->getNameID()),
];
Log::history($parent, $this->getType(), $changes, $this->getType(),
Log::HISTORY_ADD_SUBITEM);
}
}
function post_updateItem($history = 1) {
$ID = $this->getID();
$changeParent = in_array($this->getForeignKeyField(), $this->updates);
$this->regenerateTreeUnderID($ID, in_array('name', $this->updates), $changeParent);
if ($changeParent) {
$oldParentID = $this->oldvalues[$this->getForeignKeyField()];
$newParentID = $this->fields[$this->getForeignKeyField()];
$oldParentNameID = '';
$newParentNameID = '';
$parent = clone $this;
if ($oldParentID > 0) {
$this->cleanParentsSons($oldParentID);
if ($history) {
if ($parent->getFromDB($oldParentID)) {
$oldParentNameID = $parent->getNameID();
}
$changes = [
'0',
addslashes($this->getNameID()),
'',
];
Log::history($oldParentID, $this->getType(), $changes, $this->getType(),
Log::HISTORY_DELETE_SUBITEM);
}
}
if ($newParentID > 0) {
$this->cleanParentsSons(null, false);
$this->addSonInParents();
if ($history) {
if ($parent->getFromDB($newParentID)) {
$newParentNameID = $parent->getNameID();
}
$changes = [
'0',
'',
addslashes($this->getNameID()),
];
Log::history($newParentID, $this->getType(), $changes, $this->getType(),
Log::HISTORY_ADD_SUBITEM);
}
}
if ($history) {
$changes = [
'0',
$oldParentNameID,
$newParentNameID,
];
Log::history($ID, $this->getType(), $changes, $this->getType(),
Log::HISTORY_UPDATE_SUBITEM);
}
getAncestorsOf(getTableForItemType($this->getType()), $ID);
}
}
function post_deleteFromDB() {
$parent = $this->fields[$this->getForeignKeyField()];
if ($parent && $this->dohistory) {
$changes = [
'0',
addslashes($this->getNameID()),
'',
];
Log::history($parent, $this->getType(), $changes, $this->getType(),
Log::HISTORY_DELETE_SUBITEM);
}
}
function getTreeLink() {
$link = '';
if ($this->fields[$this->getForeignKeyField()]) {
$papa = clone $this;
if ($papa->getFromDB($this->fields[$this->getForeignKeyField()])) {
$link = $papa->getTreeLink() . " > ";
}
}
return $link . $this->getLink();
}
function showChildren() {
global $DB;
$ID = $this->getID();
$this->check($ID, READ);
$fields = array_filter(
$this->getAdditionalFields(),
function ($field) {
return isset($field['list']) && $field['list'];
}
);
$nb = count($fields);
$entity_assign = $this->isEntityAssign();
if (static::canCreate()) {
$link = $this->getFormURL();
echo "<div class='firstbloc'>";
echo "<form action='".$link."' method='post'>";
echo "<table class='tab_cadre_fixe'>";
echo "<tr><th colspan='3'>".__('New child heading')."</th></tr>";
echo "<tr class='tab_bg_1'><td>".__('Name')."</td><td>";
Html::autocompletionTextField($this, "name", ['value' => '']);
if ($entity_assign
&& ($this->getForeignKeyField() != 'entities_id')) {
echo "<input type='hidden' name='entities_id' value='".$_SESSION['glpiactive_entity']."'>";
}
if ($entity_assign && $this->isRecursive()) {
echo "<input type='hidden' name='is_recursive' value='1'>";
}
echo "<input type='hidden' name='".$this->getForeignKeyField()."' value='$ID'></td>";
echo "<td><input type='submit' name='add' value=\""._sx('button', 'Add')."\" class='submit'>";
echo "</td></tr>\n";
echo "</table>";
Html::closeForm();
echo "</div>\n";
}
echo "<div class='spaced'>";
echo "<table class='tab_cadre_fixehov'>";
echo "<tr class='noHover'><th colspan='".($nb+3)."'>".sprintf(__('Sons of %s'),
$this->getTreeLink());
echo "</th></tr>";
$header = "<tr><th>".__('Name')."</th>";
if ($entity_assign) {
$header .= "<th>".__('Entity')."</th>";
}
foreach ($fields as $field) {
$header .= "<th>".$field['label']."</th>";
}
$header .= "<th>".__('Comments')."</th>";
$header .= "</tr>\n";
echo $header;
$fk = $this->getForeignKeyField();
$result = $DB->request(
[
'FROM' => $this->getTable(),
'WHERE' => [$fk => $ID],
'ORDER' => 'name',
]
);
$nb = 0;
foreach ($result as $data) {
$nb++;
echo "<tr class='tab_bg_1'><td>";
if ((($fk == 'entities_id') && in_array($data['id'], $_SESSION['glpiactiveentities']))
|| !$entity_assign
|| (($fk != 'entities_id') && in_array($data['entities_id'], $_SESSION['glpiactiveentities']))) {
echo "<a href='".$this->getFormURL();
echo '?id='.$data['id']."'>".$data['name']."</a>";
} else {
echo $data['name'];
}
echo "</td>";
if ($entity_assign) {
echo "<td>".Dropdown::getDropdownName("glpi_entities", $data["entities_id"])."</td>";
}
foreach ($fields as $field) {
echo "<td>";
switch ($field['type']) {
case 'UserDropdown' :
echo getUserName($data[$field['name']]);
break;
case 'bool' :
echo Dropdown::getYesNo($data[$field['name']]);
break;
case 'dropdownValue' :
echo Dropdown::getDropdownName(getTableNameForForeignKeyField($field['name']),
$data[$field['name']]);
break;
default:
echo $data[$field['name']];
}
echo "</td>";
}
echo "<td>".$data['comment']."</td>";
echo "</tr>\n";
}
if ($nb) {
echo $header;
}
echo "</table></div>\n";
}
function getSpecificMassiveActions($checkitem = null) {
$isadmin = static::canUpdate();
$actions = parent::getSpecificMassiveActions($checkitem);
if ($isadmin) {
$actions[__CLASS__.MassiveAction::CLASS_ACTION_SEPARATOR.'move_under']
= _x('button', 'Move');
}
return $actions;
}
static function showMassiveActionsSubForm(MassiveAction $ma) {
switch ($ma->getAction()) {
case 'move_under' :
$itemtype = $ma->getItemType(true);
echo __('As child of');
Dropdown::show($itemtype, ['name' => 'parent',
'comments' => 0,
'entity' => $_SESSION['glpiactive_entity'],
'entity_sons' => $_SESSION['glpiactive_entity_recursive']]);
echo "<br><br><input type='submit' name='massiveaction' class='submit' value='".
_sx('button', 'Move')."'>\n";
return true;
}
return parent::showMassiveActionsSubForm($ma);
}
static function processMassiveActionsForOneItemtype(MassiveAction $ma, CommonDBTM $item,
array $ids) {
$input = $ma->getInput();
switch ($ma->getAction()) {
case 'move_under' :
if (isset($input['parent'])) {
$fk = $item->getForeignKeyField();
$parent = clone $item;
if (!$parent->getFromDB($input['parent'])) {
$ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_KO);
$ma->addMessage($parent->getErrorMessage(ERROR_NOT_FOUND));
return;
}
foreach ($ids as $id) {
if ($item->can($id, UPDATE)) {
if (!in_array($parent->getID(), getSonsOf($item->getTable(),
$item->getID()))) {
if ($item->update(['id' => $id,
$fk => $parent->getID()])) {
$ma->itemDone($item->getType(), $id, MassiveAction::ACTION_OK);
} else {
$ma->itemDone($item->getType(), $id, MassiveAction::ACTION_KO);
$ma->addMessage($item->getErrorMessage(ERROR_ON_ACTION));
}
} else {
$ma->itemDone($item->getType(), $id, MassiveAction::ACTION_KO);
$ma->addMessage($item->getErrorMessage(ERROR_COMPAT));
}
} else {
$ma->itemDone($item->getType(), $id, MassiveAction::ACTION_NORIGHT);
$ma->addMessage($item->getErrorMessage(ERROR_RIGHT));
}
}
} else {
$ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_KO);
$ma->addMessage($parent->getErrorMessage(ERROR_COMPAT));
}
return;
}
parent::processMassiveActionsForOneItemtype($ma, $item, $ids);
}
function rawSearchOptions() {
$tab = [];
$tab[] = [
'id' => 'common',
'name' => __('Characteristics')
];
$tab[] = [
'id' => '1',
'table' => $this->getTable(),
'field' => 'completename',
'name' => __('Complete name'),
'datatype' => 'itemlink',
'massiveaction' => false
];
$tab[] = [
'id' => '2',
'table' => $this->getTable(),
'field' => 'id',
'name' => __('ID'),
'massiveaction' => false,
'datatype' => 'number'
];
$tab[] = [
'id' => '14',
'table' => $this->getTable(),
'field' => 'name',
'name' => __('Name'),
'datatype' => 'itemlink',
'autocomplete' => true,
];
$tab[] = [
'id' => '13',
'table' => $this->getTable(),
'field' => 'completename',
'name' => __('Father'),
'datatype' => 'dropdown',
'massiveaction' => false,
'joinparams' => ['condition' => "AND 1=1"]
];
$tab[] = [
'id' => '16',
'table' => $this->getTable(),
'field' => 'comment',
'name' => __('Comments'),
'datatype' => 'text'
];
if ($this->isEntityAssign()) {
$tab[] = [
'id' => '80',
'table' => 'glpi_entities',
'field' => 'completename',
'name' => __('Entity'),
'massiveaction' => false,
'datatype' => 'dropdown'
];
}
if ($this->maybeRecursive()) {
$tab[] = [
'id' => '86',
'table' => $this->getTable(),
'field' => 'is_recursive',
'name' => __('Child entities'),
'datatype' => 'bool'
];
}
if ($this->isField('date_mod')) {
$tab[] = [
'id' => '19',
'table' => $this->getTable(),
'field' => 'date_mod',
'name' => __('Last update'),
'datatype' => 'datetime',
'massiveaction' => false
];
}
if ($this->isField('date_creation')) {
$tab[] = [
'id' => '121',
'table' => $this->getTable(),
'field' => 'date_creation',
'name' => __('Creation date'),
'datatype' => 'datetime',
'massiveaction' => false
];
}
$tab = array_merge($tab, ObjectLock::rawSearchOptionsToAdd(get_class($this)));
return $tab;
}
function haveChildren() {
$fk = $this->getForeignKeyField();
$id = $this->fields['id'];
return (countElementsInTable($this->getTable(), [$fk => $id]) > 0);
}
static function cleanTreeText($value) {
$tmp = explode('>', $value);
foreach ($tmp as $k => $v) {
$v = trim($v);
if (empty($v)) {
unset($tmp[$k]);
} else {
$tmp[$k] = $v;
}
}
return implode(' > ', $tmp);
}
function findID(array &$input) {
global $DB;
if (isset($input['completename'])) {
$input['completename'] = self::cleanTreeText($input['completename']);
}
if (isset($input['completename']) && !empty($input['completename'])) {
$criteria = [
'SELECT' => 'id',
'FROM' => $this->getTable(),
'WHERE' => [
'completename' => $input['completename']
]
];
if ($this->isEntityAssign()) {
$criteria['WHERE'] = $criteria['WHERE'] + getEntitiesRestrictCriteria(
$this->getTable(),
'',
$input['entities_id'],
$this->maybeRecursive()
);
}
$iterator = $DB->request($criteria);
if (count($iterator)) {
$result = $iterator->next();
return $result['id'];
}
} else if (isset($input['name']) && !empty($input['name'])) {
$fk = $this->getForeignKeyField();
$criteria = [
'SELECT' => 'id',
'FROM' => $this->getTable(),
'WHERE' => [
'name' => $input['name'],
$fk => (isset($input[$fk]) ? $input[$fk] : 0)
]
];
if ($this->isEntityAssign()) {
$criteria['WHERE'] = $criteria['WHERE'] + getEntitiesRestrictCriteria(
$this->getTable(),
'',
$input['entities_id'],
$this->maybeRecursive()
);
}
$iterator = $DB->request($criteria);
if (count($iterator)) {
$result = $iterator->next();
return $result['id'];
}
}
return -1;
}
function import(array $input) {
if (isset($input['name'])) {
return parent::import($input);
}
if (!isset($input['completename']) || empty($input['completename'])) {
return -1;
}
$names = explode('>', $input['completename']);
$fk = $this->getForeignKeyField();
$i = count($names);
$parent = 0;
foreach ($names as $name) {
$i--;
$name = trim($name);
if (empty($name)) {
continue;
}
$tmp = [
'name' => $name,
$fk => $parent,
];
if (isset($input['is_recursive'])) {
$tmp['is_recursive'] = $input['is_recursive'];
}
if (isset($input['entities_id'])) {
$tmp['entities_id'] = $input['entities_id'];
}
if (!$i) {
foreach ($input as $key => $val) {
if ($key != 'completename') {
$tmp[$key] = $val;
}
}
}
$parent = parent::import($tmp);
}
return $parent;
}
}