Beispiel #1
0
 public static function Delete($ID)
 {
     global $DB, $APPLICATION, $USER;
     $USER_ID = is_object($USER) ? intval($USER->GetID()) : 0;
     $ID = IntVal($ID);
     $APPLICATION->ResetException();
     foreach (GetModuleEvents("iblock", "OnBeforeIBlockElementDelete", true) as $arEvent) {
         if (ExecuteModuleEventEx($arEvent, array($ID)) === false) {
             $err = GetMessage("MAIN_BEFORE_DEL_ERR") . ' ' . $arEvent['TO_NAME'];
             $err_id = false;
             if ($ex = $APPLICATION->GetException()) {
                 $err .= ': ' . $ex->GetString();
                 $err_id = $ex->GetID();
             }
             $APPLICATION->throwException($err, $err_id);
             return false;
         }
     }
     $arSql = array("ID='" . $ID . "'", "WF_PARENT_ELEMENT_ID='" . $ID . "'");
     foreach ($arSql as $strWhere) {
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tID\n\t\t\t\t\t,IBLOCK_ID\n\t\t\t\t\t,WF_PARENT_ELEMENT_ID\n\t\t\t\t\t,WF_STATUS_ID\n\t\t\t\t\t,PREVIEW_PICTURE\n\t\t\t\t\t,DETAIL_PICTURE\n\t\t\t\t\t,XML_ID as EXTERNAL_ID\n\t\t\t\t\t,CODE\n\t\t\t\t\t,NAME\n\t\t\t\tFROM b_iblock_element\n\t\t\t\tWHERE " . $strWhere . "\n\t\t\t\tORDER BY ID DESC\n\t\t\t";
         $z = $DB->Query($strSql);
         while ($zr = $z->Fetch()) {
             $elementId = (int) $zr["ID"];
             $VERSION = CIBlockElement::GetIBVersion($zr["IBLOCK_ID"]);
             $db_res = CIBlockElement::GetProperty($zr["IBLOCK_ID"], $zr["ID"], "sort", "asc", array("PROPERTY_TYPE" => "F"));
             $arIBlockFields = CIBLock::GetArrayByID($zr["IBLOCK_ID"], "FIELDS");
             if (IntVal($zr["WF_PARENT_ELEMENT_ID"]) <= 0 && $arIBlockFields["LOG_ELEMENT_DELETE"]["IS_REQUIRED"] == "Y") {
                 $arEvents = GetModuleEvents("main", "OnBeforeEventLog", true);
                 if (empty($arEvents) || ExecuteModuleEventEx($arEvents[0], array($USER_ID)) === false) {
                     $rsElement = CIBlockElement::GetList(array(), array("=ID" => $ID), false, false, array("LIST_PAGE_URL", "NAME", "CODE"));
                     $arElement = $rsElement->GetNext();
                     $arIblock = CIBlock::GetArrayByID($zr['IBLOCK_ID']);
                     $res_log = array("ID" => $ID, "CODE" => $arElement["CODE"], "NAME" => $arElement["NAME"], "ELEMENT_NAME" => $arIblock["ELEMENT_NAME"], "USER_ID" => $USER_ID, "IBLOCK_PAGE_URL" => $arElement["LIST_PAGE_URL"]);
                     CEventLog::Log("IBLOCK", "IBLOCK_ELEMENT_DELETE", "iblock", $zr["IBLOCK_ID"], serialize($res_log));
                 }
             }
             $piId = \Bitrix\Iblock\PropertyIndex\Manager::resolveElement($zr["IBLOCK_ID"], $zr["ID"]);
             foreach (GetModuleEvents("iblock", "OnIBlockElementDelete", true) as $arEvent) {
                 ExecuteModuleEventEx($arEvent, array($elementId, $zr));
             }
             while ($res = $db_res->Fetch()) {
                 CIBlockElement::DeleteFile($res["VALUE"], $zr["ID"], "PROPERTY", $zr["WF_PARENT_ELEMENT_ID"], $zr["IBLOCK_ID"]);
             }
             if ($VERSION == 2) {
                 if (!$DB->Query("DELETE FROM b_iblock_element_prop_m" . $zr["IBLOCK_ID"] . " WHERE IBLOCK_ELEMENT_ID = " . $elementId)) {
                     return false;
                 }
                 if (!$DB->Query("DELETE FROM b_iblock_element_prop_s" . $zr["IBLOCK_ID"] . " WHERE IBLOCK_ELEMENT_ID = " . $elementId)) {
                     return false;
                 }
             } else {
                 if (!$DB->Query("DELETE FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID = " . $elementId)) {
                     return false;
                 }
             }
             static $arDelCache = array();
             if (!is_set($arDelCache, $zr["IBLOCK_ID"])) {
                 $arDelCache[$zr["IBLOCK_ID"]] = false;
                 $db_ps = $DB->Query("SELECT ID,IBLOCK_ID,VERSION,MULTIPLE FROM b_iblock_property WHERE PROPERTY_TYPE='E' AND (LINK_IBLOCK_ID=" . $zr["IBLOCK_ID"] . " OR LINK_IBLOCK_ID=0 OR LINK_IBLOCK_ID IS NULL)");
                 while ($ar_ps = $db_ps->Fetch()) {
                     if ($ar_ps["VERSION"] == 2) {
                         if ($ar_ps["MULTIPLE"] == "Y") {
                             $strTable = "b_iblock_element_prop_m" . $ar_ps["IBLOCK_ID"];
                         } else {
                             $strTable = "b_iblock_element_prop_s" . $ar_ps["IBLOCK_ID"];
                         }
                     } else {
                         $strTable = "b_iblock_element_property";
                     }
                     $arDelCache[$zr["IBLOCK_ID"]][$strTable][] = $ar_ps["ID"];
                 }
             }
             if ($arDelCache[$zr["IBLOCK_ID"]]) {
                 foreach ($arDelCache[$zr["IBLOCK_ID"]] as $strTable => $arProps) {
                     if (strncmp("b_iblock_element_prop_s", $strTable, 23) == 0) {
                         $tableFields = $DB->GetTableFields($strTable);
                         foreach ($arProps as $prop_id) {
                             $strSql = "UPDATE " . $strTable . " SET PROPERTY_" . $prop_id . "=null";
                             if (isset($tableFields["DESCRIPTION_" . $prop_id])) {
                                 $strSql .= ",DESCRIPTION_" . $prop_id . "=null";
                             }
                             $strSql .= " WHERE PROPERTY_" . $prop_id . "=" . $zr["ID"];
                             if (!$DB->Query($strSql)) {
                                 return false;
                             }
                         }
                     } elseif (strncmp("b_iblock_element_prop_m", $strTable, 23) == 0) {
                         $tableFields = $DB->GetTableFields(str_replace("prop_m", "prop_s", $strTable));
                         $strSql = "SELECT IBLOCK_PROPERTY_ID, IBLOCK_ELEMENT_ID FROM " . $strTable . " WHERE IBLOCK_PROPERTY_ID IN (" . implode(", ", $arProps) . ") AND VALUE_NUM=" . $zr["ID"];
                         $rs = $DB->Query($strSql);
                         while ($ar = $rs->Fetch()) {
                             $strSql = "\n\t\t\t\t\t\t\t\t\tUPDATE " . str_replace("prop_m", "prop_s", $strTable) . "\n\t\t\t\t\t\t\t\t\tSET PROPERTY_" . $ar["IBLOCK_PROPERTY_ID"] . "=null\n\t\t\t\t\t\t\t\t\t" . (isset($tableFields["DESCRIPTION_" . $ar["IBLOCK_PROPERTY_ID"]]) ? ",DESCRIPTION_" . $ar["IBLOCK_PROPERTY_ID"] . "=null" : "") . "\n\t\t\t\t\t\t\t\t\tWHERE IBLOCK_ELEMENT_ID = " . $ar["IBLOCK_ELEMENT_ID"] . "\n\t\t\t\t\t\t\t\t";
                             if (!$DB->Query($strSql)) {
                                 return false;
                             }
                         }
                         $strSql = "DELETE FROM " . $strTable . " WHERE IBLOCK_PROPERTY_ID IN (" . implode(", ", $arProps) . ") AND VALUE_NUM=" . $zr["ID"];
                         if (!$DB->Query($strSql)) {
                             return false;
                         }
                     } else {
                         $strSql = "DELETE FROM " . $strTable . " WHERE IBLOCK_PROPERTY_ID IN (" . implode(", ", $arProps) . ") AND VALUE_NUM=" . $zr["ID"];
                         if (!$DB->Query($strSql)) {
                             return false;
                         }
                     }
                 }
             }
             if (!$DB->Query("DELETE FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID = " . $elementId)) {
                 return false;
             }
             $obIBlockElementRights = new CIBlockElementRights($zr["IBLOCK_ID"], $zr["ID"]);
             $obIBlockElementRights->DeleteAllRights();
             $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($zr["IBLOCK_ID"], $zr["ID"]);
             $ipropTemplates->delete();
             if (IntVal($zr["WF_PARENT_ELEMENT_ID"]) <= 0 && $zr["WF_STATUS_ID"] == 1 && CModule::IncludeModule("search")) {
                 CSearch::DeleteIndex("iblock", $elementId);
             }
             CIBlockElement::DeleteFile($zr["PREVIEW_PICTURE"], $zr["ID"], "PREVIEW", $zr["WF_PARENT_ELEMENT_ID"], $zr["IBLOCK_ID"]);
             CIBlockElement::DeleteFile($zr["DETAIL_PICTURE"], $zr["ID"], "DETAIL", $zr["WF_PARENT_ELEMENT_ID"], $zr["IBLOCK_ID"]);
             if (CModule::IncludeModule("workflow")) {
                 $DB->Query("DELETE FROM b_workflow_move WHERE IBLOCK_ELEMENT_ID=" . $elementId);
             }
             $DB->Query("DELETE FROM b_iblock_element_lock WHERE IBLOCK_ELEMENT_ID=" . $elementId);
             $DB->Query("DELETE FROM b_rating_vote WHERE ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND ENTITY_ID = " . $elementId);
             $DB->Query("DELETE FROM b_rating_voting WHERE ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND ENTITY_ID = " . $elementId);
             if (!$DB->Query("DELETE FROM b_iblock_element WHERE ID=" . $elementId)) {
                 return false;
             }
             if (isset(self::$elementIblock[$elementId])) {
                 unset(self::$elementIblock[$elementId]);
             }
             \Bitrix\Iblock\PropertyIndex\Manager::deleteElementIndex($zr["IBLOCK_ID"], $piId);
             if (CModule::IncludeModule("bizproc")) {
                 CBPDocument::OnDocumentDelete(array("iblock", "CIBlockDocument", $zr["ID"]), $arErrorsTmp);
             }
             foreach (GetModuleEvents("iblock", "OnAfterIBlockElementDelete", true) as $arEvent) {
                 ExecuteModuleEventEx($arEvent, array($zr));
             }
             CIBlock::clearIblockTagCache($zr['IBLOCK_ID']);
             unset($elementId);
         }
     }
     /************* QUOTA *************/
     $_SESSION["SESS_RECOUNT_DB"] = "Y";
     /************* QUOTA *************/
     return true;
 }