/** * Fills descendants simple rights by simple rights of object. * @internal * @param int $objectId Id of object. */ public static function fillDescendants($objectId) { $tableName = static::getTableName(); $pathTableName = ObjectPathTable::getTableName(); $connection = Application::getConnection(); $objectId = (int) $objectId; $connection->queryExecute("\n\t\t\tINSERT INTO {$tableName} (OBJECT_ID, ACCESS_CODE)\n\t\t\tSELECT path.OBJECT_ID, sright.ACCESS_CODE FROM {$pathTableName} path\n\t\t\t\tINNER JOIN {$tableName} sright ON sright.OBJECT_ID = path.PARENT_ID\n\t\t\tWHERE path.PARENT_ID = {$objectId}\n\t\t"); }
public static function checkFields(Result $result, $primary, array $data) { if ($result instanceof DeleteResult) { if (!ObjectPathTable::isLeaf($primary)) { $result->addError(new EntityError(Loc::getMessage("DISK_OBJECT_ENTITY_ERROR_DELETE_NODE"))); } } parent::checkFields($result, $primary, $data); }
/** * Move object from node to another node. * Use this method instead update. * @param $primary * @param $newParentId * @return \Bitrix\Main\Entity\UpdateResult */ public static function move($primary, $newParentId) { $newParentId = (int) $newParentId; // check primary static::normalizePrimary($primary); static::validatePrimary($primary); $data = array('PARENT_ID' => $newParentId); $entity = static::getEntity(); $result = new UpdateResult(); $event = new Event($entity, self::EVENT_ON_BEFORE_MOVE, array("id" => $primary, "fields" => $data)); $event->send(); $event->getErrors($result); $data = $event->mergeFields($data); // check data // static::checkFields($result, $primary, $data); if (!$result->isSuccess(true)) { return $result; } $event = new Event($entity, self::EVENT_ON_MOVE, array("id" => $primary, "fields" => $data)); $event->send(); ObjectPathTable::moveTo($primary['ID'], $newParentId); // save data $connection = Main\Application::getConnection(); $helper = $connection->getSqlHelper(); $tableName = static::getEntity()->getDBTableName(); $update = $helper->prepareUpdate($tableName, array('PARENT_ID' => $newParentId)); $id = array(); foreach ($primary as $k => $v) { $id[] = $helper->prepareAssignment($tableName, $k, $v); } $where = implode(' AND ', $id); $sql = "UPDATE " . $tableName . " SET " . $update[0] . " WHERE " . $where; $connection->queryExecute($sql, $update[1]); $result = new UpdateResult(); $result->setAffectedRowsCount($connection); $result->setData(array('PARENT_ID' => $newParentId)); $event = new Event($entity, self::EVENT_ON_AFTER_MOVE, array("id" => $primary, "fields" => $data)); $event->send(); return $result; }
private function deleteSimpleFromSelfAndChildren() { $connection = Application::getInstance()->getConnection(); $objectId = (int) $this->object->getId(); $simpleTable = SimpleRightTable::getTableName(); if ($this->object instanceof File) { $sql = "DELETE FROM {$simpleTable} WHERE OBJECT_ID = {$objectId}"; } else { $pathTable = ObjectPathTable::getTableName(); if ($connection instanceof MysqlCommonConnection || $connection instanceof MssqlConnection) { $sql = "DELETE sr FROM {$simpleTable} sr\n\t\t\t\t\t\t\tJOIN {$pathTable} path ON path.OBJECT_ID = sr.OBJECT_ID\n\t\t\t\t\t\tWHERE path.PARENT_ID = {$objectId}\n\t\t\t\t"; } elseif ($connection instanceof OracleConnection) { $sql = "DELETE FROM {$simpleTable}\n\t\t\t\t\t\tWHERE ID IN (\n\t\t\t\t\t\t\tSELECT sr.ID FROM {$simpleTable} sr\n\t\t\t\t\t\t\t\tJOIN {$pathTable} path ON path.OBJECT_ID = sr.OBJECT_ID\n\t\t\t\t\t\t\tWHERE path.PARENT_ID = {$objectId}\n\t\t\t\t\t\t)\n\t\t\t\t"; } } $connection->queryExecute($sql); }