/** * @param mixed $primary * * @return Main\DB\Result|Entity\DeleteResult */ public static function delete($primary) { global $USER_FIELD_MANAGER; // get old data $hlblock = static::getByPrimary($primary)->fetch(); // get file fields $file_fields = array(); $fields = $USER_FIELD_MANAGER->getUserFields('HLBLOCK_' . $hlblock['ID']); foreach ($fields as $name => $field) { if ($field['USER_TYPE']['BASE_TYPE'] === 'file') { $file_fields[] = $name; } } // delete files if (!empty($file_fields)) { $oldEntity = static::compileEntity($hlblock); $query = new Entity\Query($oldEntity); // select file ids $query->setSelect($file_fields); // if they are not empty $filter = array('LOGIC' => 'OR'); foreach ($file_fields as $file_field) { $filter['!' . $file_field] = false; } $query->setFilter($filter); // go $result = $query->exec(); while ($row = $result->fetch()) { foreach ($file_fields as $file_field) { if (!empty($row[$file_field])) { if (is_array($row[$file_field])) { foreach ($row[$file_field] as $value) { \CFile::delete($value); } } else { \CFile::delete($row[$file_field]); } } } } } $connection = Application::getConnection(); foreach ($fields as $field) { // delete from uf registry if ($field['USER_TYPE']['BASE_TYPE'] === 'enum') { $enumField = new \CUserFieldEnum(); $enumField->DeleteFieldEnum($field['ID']); } $connection->query("DELETE FROM b_user_field_lang WHERE USER_FIELD_ID = " . $field['ID']); $connection->query("DELETE FROM b_user_field WHERE ID = " . $field['ID']); // if multiple - drop utm table if ($field['MULTIPLE'] == 'Y') { $utmTableName = static::getMultipleValueTableName($hlblock, $field); $connection->dropTable($utmTableName); } } // clear uf cache global $CACHE_MANAGER; if (CACHED_b_user_field !== false) { $CACHE_MANAGER->cleanDir("b_user_field"); } // remove row $result = parent::delete($primary); // drop hl table $connection->dropTable($hlblock['TABLE_NAME']); return $result; }
/** * Функция удаляет пользовательское свойство и все его значения. * * <p>Сначала удаляются метаданные свойства.</p> * <p>Затем из таблички вида <b>b_utm_[ENTITY_ID]</b> удаляются все значения множественных свойств.</p> * <p>После чего у таблички вида <b>b_uts_[ENTITY_ID]</b> дропается колонка.</p> * <p>И если это было "последнее" свойство для сущности, то дропаются сами таблички хранившие значения.</p> * @param array $ID идентификатор свойства * @return CDBResult - результат выполнения последнего запроса функции. */ function Delete($ID) { global $DB, $CACHE_MANAGER, $USER_FIELD_MANAGER, $APPLICATION; $ID = intval($ID); $rs = $this->GetList(array(), array("ID"=>$ID)); if($arField = $rs->Fetch()) { /** * events * PROVIDE_STORAGE - use own uf subsystem to store data (uts/utm tables) */ $commonEventResult = array('PROVIDE_STORAGE' => true); foreach (GetModuleEvents("main", "OnBeforeUserTypeDelete", true) as $arEvent) { $eventResult = ExecuteModuleEventEx($arEvent, array(&$arField)); if ($eventResult ===false) { if($e = $APPLICATION->GetException()) { return false; } $aMsg = array(); $aMsg[] = array( "id"=>"FIELD_NAME", "text"=>GetMessage("USER_TYPE_DELETE_ERROR", array( "#FIELD_NAME#"=>htmlspecialcharsbx($arField["FIELD_NAME"]), "#ENTITY_ID#"=>htmlspecialcharsbx($arField["ENTITY_ID"]), )) ); $e = new CAdminException($aMsg); $APPLICATION->ThrowException($e); return false; } elseif (is_array($eventResult)) { $commonEventResult = array_merge($commonEventResult, $eventResult); } } if(is_object($USER_FIELD_MANAGER)) $USER_FIELD_MANAGER->CleanCache(); $arType = $USER_FIELD_MANAGER->GetUserType($arField["USER_TYPE_ID"]); //We need special handling of file type properties if($arType) { if($arType["BASE_TYPE"]=="file" && $commonEventResult['PROVIDE_STORAGE']) { // only if we store values if($arField["MULTIPLE"] == "Y") $strSql = "SELECT VALUE_INT VALUE FROM b_utm_".strtolower($arField["ENTITY_ID"])." WHERE FIELD_ID=".$arField["ID"]; else $strSql = "SELECT ".$arField["FIELD_NAME"]." VALUE FROM b_uts_".strtolower($arField["ENTITY_ID"]); $rsFile = $DB->Query($strSql, false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); while($arFile = $rsFile->Fetch()) { CFile::Delete($arFile["VALUE"]); } } elseif($arType["BASE_TYPE"]=="enum") { $obEnum = new CUserFieldEnum; $obEnum->DeleteFieldEnum($arField["ID"]); } } if(CACHED_b_user_field!==false) $CACHE_MANAGER->CleanDir("b_user_field"); $rs = $DB->Query("DELETE FROM b_user_field_lang WHERE USER_FIELD_ID = ".$ID, false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); if($rs) $rs = $DB->Query("DELETE FROM b_user_field WHERE ID = ".$ID, false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); if($rs && $commonEventResult['PROVIDE_STORAGE']) { // only if we store values $rs = $this->GetList(array(), array("ENTITY_ID" => $arField["ENTITY_ID"])); if($rs->Fetch()) // more than one { foreach($this->DropColumnSQL("b_uts_".strtolower($arField["ENTITY_ID"]), array($arField["FIELD_NAME"])) as $strSql) $DB->Query($strSql, false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); $rs = $DB->Query("DELETE FROM b_utm_".strtolower($arField["ENTITY_ID"])." WHERE FIELD_ID = '".$ID."'", false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); } else { $DB->Query("DROP SEQUENCE SQ_B_UTM_".$arField["ENTITY_ID"], true); $DB->Query("DROP TABLE b_uts_".strtolower($arField["ENTITY_ID"]), false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); $rs = $DB->Query("DROP TABLE b_utm_".strtolower($arField["ENTITY_ID"]), false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); } } } return $rs; }
/** * Функция удаляет пользовательское свойство и все его значения. * * <p>Сначала удаляются метаданные свойства.</p> * <p>Затем из таблички вида <b>b_utm_[ENTITY_ID]</b> удаляются все значения множественных свойств.</p> * <p>После чего у таблички вида <b>b_uts_[ENTITY_ID]</b> дропается колонка.</p> * <p>И если это было "последнее" свойство для сущности, то дропаются сами таблички хранившие значения.</p> * @param array $ID идентификатор свойства * @return CDBResult - результат выполнения последнего запроса функции. */ function Delete($ID) { global $DB, $CACHE_MANAGER, $USER_FIELD_MANAGER; $ID = intval($ID); $rs = $this->GetList(array(), array("ID"=>$ID)); if($arField = $rs->Fetch()) { if(is_object($USER_FIELD_MANAGER)) $USER_FIELD_MANAGER->CleanCache(); $arType = $USER_FIELD_MANAGER->GetUserType($arField["USER_TYPE_ID"]); //We need special handling of file type properties if($arType) { if($arType["BASE_TYPE"]=="file") { if($arField["MULTIPLE"] == "Y") $strSql = "SELECT VALUE_INT VALUE FROM b_utm_".strtolower($arField["ENTITY_ID"])." WHERE FIELD_ID=".$arField["ID"]; else $strSql = "SELECT ".$arField["FIELD_NAME"]." VALUE FROM b_uts_".strtolower($arField["ENTITY_ID"]); $rsFile = $DB->Query($strSql, false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); while($arFile = $rsFile->Fetch()) { CFile::Delete($arFile["VALUE"]); } } elseif($arType["BASE_TYPE"]=="enum") { $obEnum = new CUserFieldEnum; $obEnum->DeleteFieldEnum($arField["ID"]); } } if(CACHED_b_user_field!==false) $CACHE_MANAGER->CleanDir("b_user_field"); $rs = $DB->Query("DELETE FROM b_user_field_lang WHERE USER_FIELD_ID = ".$ID, false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); if($rs) $rs = $DB->Query("DELETE FROM b_user_field WHERE ID = ".$ID, false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); if($rs) { $rs = $this->GetList(array(), array("ENTITY_ID" => $arField["ENTITY_ID"])); if($rs->Fetch()) // more than one { foreach($this->DropColumnSQL("b_uts_".strtolower($arField["ENTITY_ID"]), array($arField["FIELD_NAME"])) as $strSql) $DB->Query($strSql, false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); $rs = $DB->Query("DELETE FROM b_utm_".strtolower($arField["ENTITY_ID"])." WHERE FIELD_ID = '".$ID."'", false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); } else { $rs = $DB->Query("DROP SEQUENCE SQ_B_UTM_".$arField["ENTITY_ID"], true); $rs = $DB->Query("DROP TABLE b_uts_".strtolower($arField["ENTITY_ID"]), false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); $rs = $DB->Query("DROP TABLE b_utm_".strtolower($arField["ENTITY_ID"]), false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); } } } return $rs; }