- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblocksection.php
- Класс: CAllIBlockSection
- Вызов: CAllIBlockSection::CheckFields
function CheckFields(&$arFields, $ID=false)
{
global $DB, $APPLICATION;
$this->LAST_ERROR = "";
if(($ID===false || array_key_exists("NAME", $arFields)) && (string)$arFields["NAME"] === '')
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_SECTION")."
";
$pictureIsArray = isset($arFields["PICTURE"]) && is_array($arFields["PICTURE"]);
if (
$pictureIsArray
&& array_key_exists("bucket", $arFields["PICTURE"])
&& is_object($arFields["PICTURE"]["bucket"])
)
{
//This is trusted image from xml import
}
elseif(
$pictureIsArray
&& isset($arFields["PICTURE"]["name"])
)
{
$error = CFile::CheckImageFile($arFields["PICTURE"]);
if ($error <> '')
$this->LAST_ERROR .= $error."
";
}
$detailPictureIsArray = isset($arFields["DETAIL_PICTURE"]) && is_array($arFields["DETAIL_PICTURE"]);
if(
$detailPictureIsArray
&& array_key_exists("bucket", $arFields["DETAIL_PICTURE"])
&& is_object($arFields["DETAIL_PICTURE"]["bucket"])
)
{
//This is trusted image from xml import
}
elseif(
$detailPictureIsArray
&& isset($arFields["DETAIL_PICTURE"]["name"])
)
{
$error = CFile::CheckImageFile($arFields["DETAIL_PICTURE"]);
if ($error <> '')
$this->LAST_ERROR .= $error."
";
}
$arIBlock = false;
$arThis = false;
if($ID === false)
{
if(!array_key_exists("IBLOCK_ID", $arFields))
{
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_ID")."
";
}
else
{
$arIBlock = CIBlock::GetArrayByID($arFields["IBLOCK_ID"]);
if(!$arIBlock)
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_ID")."
";
}
}
else
{
$rsThis = $DB->Query("SELECT ID, IBLOCK_ID, DETAIL_PICTURE, PICTURE FROM b_iblock_section WHERE ID = ".intval($ID));
$arThis = $rsThis->Fetch();
if(!$arThis)
{
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_SECTION_ID", array("#ID#" => intval($ID)))."
";
}
else
{
$arIBlock = CIBlock::GetArrayByID($arThis["IBLOCK_ID"]);
if(!$arIBlock)
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_ID")."
";
}
}
$arParent = false;
$IBLOCK_SECTION_ID = isset($arFields["IBLOCK_SECTION_ID"])? intval($arFields["IBLOCK_SECTION_ID"]): 0;
if(($IBLOCK_SECTION_ID > 0) && ($this->LAST_ERROR == ''))
{
$sqlCheck = 'select ID, IBLOCK_ID from b_iblock_section where ID = ' . $IBLOCK_SECTION_ID;
if ($ID !== false)
{
$sqlCheck .= ' and ID != '.(int)$ID;
}
$rsParent = $DB->Query($sqlCheck);
$arParent = $rsParent->Fetch();
if(!$arParent)
$this->LAST_ERROR = GetMessage("IBLOCK_BAD_BLOCK_SECTION_PARENT")."
";
}
if($arParent && $arIBlock)
{
if($arParent["IBLOCK_ID"] != $arIBlock["ID"])
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_SECTION_ID_PARENT")."
";
}
if($arParent && ($this->LAST_ERROR == ''))
{
$rch = $DB->Query("
SELECT 'x'
FROM
b_iblock_section bsto
,b_iblock_section bsfrom
WHERE
bsto.ID = ".$arParent["ID"]."
AND bsfrom.ID = ".intval($ID)."
AND bsto.LEFT_MARGIN >= bsfrom.LEFT_MARGIN
AND bsto.LEFT_MARGIN <= bsfrom.RIGHT_MARGIN
");
if($rch->Fetch())
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_SECTION_RECURSE")."
";
}
if($arIBlock)
{
if(
array_key_exists("CODE", $arFields)
&& mb_strlen($arFields["CODE"])
&& is_array($arIBlock["FIELDS"]["SECTION_CODE"]["DEFAULT_VALUE"])
&& $arIBlock["FIELDS"]["SECTION_CODE"]["DEFAULT_VALUE"]["UNIQUE"] == "Y"
)
{
$res = $DB->Query("
SELECT ID
FROM b_iblock_section
WHERE IBLOCK_ID = ".$arIBlock["ID"]."
AND CODE = '".$DB->ForSQL($arFields["CODE"])."'
AND ID <> ".intval($ID)
);
if($res->Fetch())
$this->LAST_ERROR .= GetMessage("IBLOCK_DUP_SECTION_CODE")."
";
}
foreach($arIBlock["FIELDS"] as $FIELD_ID => $field)
{
if(!preg_match("/^SECTION_(.+)$/", $FIELD_ID, $match))
continue;
$FIELD_ID = $match[1];
if($field["IS_REQUIRED"] === "Y")
{
switch($FIELD_ID)
{
case "NAME":
case "DESCRIPTION_TYPE":
//We should never check for this fields
break;
case "PICTURE":
$field["NAME"] = GetMessage("IBLOCK_FIELD_PICTURE");
case "DETAIL_PICTURE":
if($arThis && $arThis[$FIELD_ID] > 0)
{//There was an picture so just check that it is not deleted
if(
array_key_exists($FIELD_ID, $arFields)
&& is_array($arFields[$FIELD_ID])
&& $arFields[$FIELD_ID]["del"] === "Y"
)
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_SECTION_FIELD", array("#FIELD_NAME#" => $field["NAME"]))."
";
}
else
{//There was NO picture so it MUST be present
if(!array_key_exists($FIELD_ID, $arFields))
{
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_SECTION_FIELD", array("#FIELD_NAME#" => $field["NAME"]))."
";
}
elseif(is_array($arFields[$FIELD_ID]))
{
if(
$arFields[$FIELD_ID]["del"] === "Y"
|| (array_key_exists("error", $arFields[$FIELD_ID]) && $arFields[$FIELD_ID]["error"] !== 0)
|| $arFields[$FIELD_ID]["size"] <= 0
)
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_SECTION_FIELD", array("#FIELD_NAME#" => $field["NAME"]))."
";
}
else
{
if(intval($arFields[$FIELD_ID]) <= 0)
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_SECTION_FIELD", array("#FIELD_NAME#" => $field["NAME"]))."
";
}
}
break;
default:
if($ID===false || array_key_exists($FIELD_ID, $arFields))
{
if(is_array($arFields[$FIELD_ID]))
$val = implode("", $arFields[$FIELD_ID]);
else
$val = $arFields[$FIELD_ID];
if($val == '')
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_SECTION_FIELD", array("#FIELD_NAME#" => $field["NAME"]))."
";
}
break;
}
}
}
}
$APPLICATION->ResetException();
if($ID===false)
$db_events = GetModuleEvents("iblock", "OnBeforeIBlockSectionAdd", true);
else
{
$arFields["ID"] = $ID;
$arFields["IBLOCK_ID"] = $arIBlock["ID"];
$db_events = GetModuleEvents("iblock", "OnBeforeIBlockSectionUpdate", true);
}
/****************************** QUOTA ******************************/
if(empty($this->LAST_ERROR) && (COption::GetOptionInt("main", "disk_space") > 0))
{
$quota = new CDiskQuota();
if(!$quota->checkDiskQuota($arFields))
$this->LAST_ERROR = $quota->LAST_ERROR;
}
/****************************** QUOTA ******************************/
foreach ($db_events as $arEvent)
{
$bEventRes = ExecuteModuleEventEx($arEvent, array(&$arFields));
if($bEventRes===false)
{
if($err = $APPLICATION->GetException())
$this->LAST_ERROR .= $err->GetString()."
";
else
{
$APPLICATION->ThrowException("Unknown error");
$this->LAST_ERROR .= "Unknown error.
";
}
break;
}
}
if($this->LAST_ERROR <> '')
return false;
return true;
}