CommonDBTM::canUnrecurs PHP Method

canUnrecurs() public method

May be overloaded if needed
public canUnrecurs ( ) : booleen
return booleen
    function canUnrecurs()
    {
        global $DB, $CFG_GLPI;
        $ID = $this->fields['id'];
        if ($ID < 0 || !$this->fields['is_recursive']) {
            return true;
        }
        $entities = getAncestorsOf('glpi_entities', $this->fields['entities_id']);
        $entities[] = $this->fields['entities_id'];
        $RELATION = getDbRelations();
        if ($this instanceof CommonTreeDropdown) {
            $f = getForeignKeyFieldForTable($this->getTable());
            if (countElementsInTable($this->getTable(), [$f => $ID, 'NOT' => ['entities_id' => $entities]]) > 0) {
                return false;
            }
        }
        if (isset($RELATION[$this->getTable()])) {
            foreach ($RELATION[$this->getTable()] as $tablename => $field) {
                if ($tablename[0] != '_') {
                    $itemtype = getItemTypeForTable($tablename);
                    $item = new $itemtype();
                    if ($item->isEntityAssign()) {
                        // 1->N Relation
                        if (is_array($field)) {
                            foreach ($field as $f) {
                                if (countElementsInTable($tablename, [$f => $ID, 'NOT' => ['entities_id' => $entities]]) > 0) {
                                    return false;
                                }
                            }
                        } else {
                            if (countElementsInTable($tablename, [$field => $ID, 'NOT' => ['entities_id' => $entities]]) > 0) {
                                return false;
                            }
                        }
                    } else {
                        foreach ($RELATION as $othertable => $rel) {
                            // Search for a N->N Relation with devices
                            if ($othertable == "_virtual_device" && isset($rel[$tablename])) {
                                $devfield = $rel[$tablename][0];
                                // items_id...
                                $typefield = $rel[$tablename][1];
                                // itemtype...
                                $sql = "SELECT DISTINCT `{$typefield}` AS itemtype\n                                FROM `{$tablename}`\n                                WHERE `{$field}`='{$ID}'";
                                $res = $DB->query($sql);
                                // Search linked device of each type
                                if ($res) {
                                    while ($data = $DB->fetch_assoc($res)) {
                                        $itemtype = $data["itemtype"];
                                        $itemtable = getTableForItemType($itemtype);
                                        $item = new $itemtype();
                                        if ($item->isEntityAssign()) {
                                            if (countElementsInTable(array($tablename, $itemtable), ["{$tablename}.{$field}" => $ID, "{$tablename}.{$typefield}" => $itemtype, 'FKEY' => [$tablename => $devfield, $itemtable => 'id'], 'NOT' => [$itemtable . '.entities_id' => $entities]]) > '0') {
                                                return false;
                                            }
                                        }
                                    }
                                }
                            } else {
                                if ($othertable != $this->getTable() && isset($rel[$tablename])) {
                                    // Search for another N->N Relation
                                    $itemtype = getItemTypeForTable($othertable);
                                    $item = new $itemtype();
                                    if ($item->isEntityAssign()) {
                                        if (is_array($rel[$tablename])) {
                                            foreach ($rel[$tablename] as $otherfield) {
                                                if (countElementsInTable(array($tablename, $othertable), ["{$tablename}.{$field}" => $ID, 'FKEY' => [$tablename => $otherfield, $othertable => 'id'], 'NOT' => [$othertable . '.entities_id' => $entities]]) > '0') {
                                                    return false;
                                                }
                                            }
                                        } else {
                                            $otherfield = $rel[$tablename];
                                            if (countElementsInTable(array($tablename, $othertable), ["{$tablename}.{$field}" => $ID, 'FKEY' => [$tablename => $otherfield, $othertable => 'id'], 'NOT' => [$othertable . '.entities_id' => $entities]]) > '0') {
                                                return false;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        // Doc links to this item
        if ($this->getType() > 0 && countElementsInTable(array('glpi_documents_items', 'glpi_documents'), ['glpi_documents_items.items_id' => $ID, 'glpi_documents_items.itemtype' => $this->getType(), 'FKEY' => ['glpi_documents_items' => 'documents_id', 'glpi_documents' => 'id'], 'NOT' => ['glpi_documents.entities_id' => $entities]]) > '0') {
            return false;
        }
        // TODO : do we need to check all relations in $RELATION["_virtual_device"] for this item
        return true;
    }

Usage Example

Exemplo n.º 1
0
 /**
  * Can I change recusvive flag to false
  * check if there is "linked" object in another entity
  *
  * Overloaded from CommonDBTM
  *
  * @return booleen
  **/
 function canUnrecurs()
 {
     global $DB, $CFG_GLPI;
     $ID = $this->fields['id'];
     if ($ID < 0 || !$this->fields['is_recursive']) {
         return true;
     }
     if (!parent::canUnrecurs()) {
         return false;
     }
     $entities = "(" . $this->fields['entities_id'];
     foreach (getAncestorsOf("glpi_entities", $this->fields['entities_id']) as $papa) {
         $entities .= ",{$papa}";
     }
     $entities .= ")";
     // RELATION : printers -> _port -> _wire -> _port -> device
     // Evaluate connection in the 2 ways
     for ($tabend = array("networkports_id_1" => "networkports_id_2", "networkports_id_2" => "networkports_id_1"); list($enda, $endb) = each($tabend);) {
         $sql = "SELECT `itemtype`,\n                        GROUP_CONCAT(DISTINCT `items_id`) AS ids\n                 FROM `glpi_networkports_networkports`,\n                      `glpi_networkports`\n                 WHERE `glpi_networkports_networkports`.`{$endb}` = `glpi_networkports`.`id`\n                       AND `glpi_networkports_networkports`.`{$enda}`\n                            IN (SELECT `id`\n                                FROM `glpi_networkports`\n                                WHERE `itemtype` = '" . $this->getType() . "'\n                                      AND `items_id` = '{$ID}')\n                 GROUP BY `itemtype`";
         $res = $DB->query($sql);
         if ($res) {
             while ($data = $DB->fetch_assoc($res)) {
                 $itemtable = getTableForItemType($data["itemtype"]);
                 if ($item = getItemForItemtype($data["itemtype"])) {
                     // For each itemtype which are entity dependant
                     if ($item->isEntityAssign()) {
                         if (countElementsInTable($itemtable, "`id` IN (" . $data["ids"] . ")\n                                              AND `entities_id` NOT IN {$entities}") > 0) {
                             return false;
                         }
                     }
                 }
             }
         }
     }
     return true;
 }
CommonDBTM