403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/iblock/classes/mysql/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/iblock/classes/mysql/iblockproperty.php
<?php

use Bitrix\Main;
use Bitrix\Iblock\PropertyTable;

class CIBlockProperty extends CAllIBlockProperty
{
	function _Update($ID, $arFields, $bCheckDescription = false)
	{
		global $DB;
		$ID=intval($ID);
		$rsProperty = $this->GetByID($ID);
		$arProperty = $rsProperty->Fetch();
		if(!$arProperty)
		{
			$this->LAST_ERROR = $this->FormatNotFoundError($ID);
			return false;
		}
		\Bitrix\Iblock\PropertyIndex\Manager::onPropertyUpdate($arProperty["IBLOCK_ID"], $arProperty, $arFields);
		if($arProperty["VERSION"]!=2)
		{
			return true;
		}
		$tableFields = $DB->GetTableFields("b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]);
		if(is_set($arFields, "MULTIPLE") && $arFields["MULTIPLE"]!=$arProperty["MULTIPLE"])
		{//MULTIPLE changed
			if($arFields["MULTIPLE"]=="Y")
			{//MULTIPLE=Y
				$strSql = "
					INSERT INTO b_iblock_element_prop_m".$arProperty["IBLOCK_ID"]."
					(IBLOCK_ELEMENT_ID, IBLOCK_PROPERTY_ID, VALUE, VALUE_ENUM, VALUE_NUM
					".(isset($tableFields["DESCRIPTION_".$arProperty["ID"]])? ", DESCRIPTION": "")."
					)
					SELECT
						IBLOCK_ELEMENT_ID
						,".$arProperty["ID"]."
						,PROPERTY_".$arProperty["ID"]."
						,".($arProperty["PROPERTY_TYPE"]=="S" || $arProperty["PROPERTY_TYPE"]=="s"?
							"0":
							"PROPERTY_".$arProperty["ID"])."
						,".($arProperty["PROPERTY_TYPE"]=="S" || $arProperty["PROPERTY_TYPE"]=="s"?
							"0":
							"PROPERTY_".$arProperty["ID"])."
						".(isset($tableFields["DESCRIPTION_".$arProperty["ID"]])? ",DESCRIPTION_".$arProperty["ID"]: "")."
					FROM
						b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
					WHERE
						PROPERTY_".$arProperty["ID"]." is not null
				";
				if(!$DB->Query($strSql))
				{
					$this->LAST_ERROR = $this->FormatUpdateError($ID, "MY01");
					return false;
				}
				$strSql = "
					UPDATE b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
					SET PROPERTY_".$arProperty["ID"]."=null
					".(isset($tableFields["DESCRIPTION_".$arProperty["ID"]])? ", DESCRIPTION_".$arProperty["ID"]."=null": "")."
				";
				if(!$DB->Query($strSql))
				{
					$this->LAST_ERROR =  $this->FormatUpdateError($ID, "MY02");
					return false;
				}
				if ($DB->type === 'MYSQL')
				{
					$strSql = '
						ALTER TABLE b_iblock_element_prop_s' . $arProperty['IBLOCK_ID'] . '
						CHANGE PROPERTY_' . $arProperty['ID'] . ' PROPERTY_' . $arProperty['ID'] . ' ' . self::getLongTextType() . '
					';
				}
				else
				{
					$strSql = '
						ALTER TABLE b_iblock_element_prop_s' . $arProperty['IBLOCK_ID'] . '
						ALTER COLUMN PROPERTY_' . $arProperty['ID'] . ' TYPE ' . self::getLongTextType() . '
					';
				}
				if(!$DB->DDL($strSql))
				{
					$this->LAST_ERROR =  $this->FormatUpdateError($ID, "MY03");
					return false;
				}
			}
			else
			{//MULTIPLE=N
				switch($arFields["PROPERTY_TYPE"])
				{
					case "S":
						$strType = "text";
						break;
					case "N":
						$strType = "numeric(18,4)";
						break;
					case "L":
					case "F":
					case "G":
					case "E":
						$strType = self::getIntegerType();
						break;
					default://s - small string
						$strType = "varchar(255)";
				}
				$strSql = "
					UPDATE b_iblock_element_prop_s" . $arProperty["IBLOCK_ID"] . "
					SET PROPERTY_" . $arProperty["ID"] . "=null
					" . (isset($tableFields["DESCRIPTION_".$arProperty["ID"]]) ? ", DESCRIPTION_" . $arProperty["ID"] . "=null": "") . "
				";
				if(!$DB->Query($strSql))
				{
					$this->LAST_ERROR =  $this->FormatUpdateError($ID, "MY05");

					return false;
				}
				if ($DB->type === 'MYSQL')
				{
					$strSql = "
						ALTER TABLE b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
						CHANGE PROPERTY_".$arProperty["ID"]." PROPERTY_".$arProperty["ID"]." ".$strType."
					";
				}
				else
				{
					$strSql = "
						ALTER TABLE b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
						ALTER COLUMN PROPERTY_".$arProperty["ID"]." TYPE ".$strType." USING PROPERTY_".$arProperty["ID"]."::" .$strType. "
					";
				}
				if(!$DB->DDL($strSql))
				{
					$this->LAST_ERROR =  $this->FormatUpdateError($ID, "MY04");
					return false;
				}
				switch($arFields["PROPERTY_TYPE"])
				{
					case "N":
					case "F":
					case "G":
					case "E":
						$strTrans = "VALUE_NUM";
						break;
					case "L":
						$strTrans = "VALUE_ENUM";
						break;
					case "s":
						$strTrans = "SUBSTRING(VALUE, 0 ,255)";
						break;
					default:
						$strTrans = "VALUE";
				}
				$helper = Main\Application::getConnection()->getSqlHelper();
				$strSql = $helper->prepareCorrelatedUpdate(
					'b_iblock_element_prop_s' . $arProperty["IBLOCK_ID"],
					'EL',
					[
						'PROPERTY_' . $ID => $strTrans . (isset($tableFields['DESCRIPTION_' . $ID]) ? ',DESCRIPTION_'.$ID.' = DESCRIPTION' : '')
					],
					'b_iblock_element_prop_m' . $arProperty["IBLOCK_ID"] . ' AS EN',
					'EN.IBLOCK_ELEMENT_ID = EL.IBLOCK_ELEMENT_ID AND EN.IBLOCK_PROPERTY_ID = ' . $ID
				);
				if(!$DB->Query($strSql))
				{
					$this->LAST_ERROR = $this->FormatUpdateError($ID, "MY05");
					return false;
				}
				$strSql = "
					DELETE FROM
						b_iblock_element_prop_m".$arProperty["IBLOCK_ID"]."
					WHERE
						IBLOCK_PROPERTY_ID = ".$ID."
				";
				if(!$DB->Query($strSql))
				{
					$this->LAST_ERROR = $this->FormatUpdateError($ID, "MY06");
					return false;
				}
			}
		}
		else
		{//MULTIPLE not changed
			if(is_set($arFields ,"PROPERTY_TYPE")
			&& $arFields["PROPERTY_TYPE"]!=$arProperty["PROPERTY_TYPE"]
			&& $arProperty["MULTIPLE"]=="N")
			{
				switch($arFields["PROPERTY_TYPE"])
				{
					case "S":
						$strType = "text";
						break;
					case "N":
						$strType = "numeric(18,4)";
						break;
					case "L":
					case "F":
					case "G":
					case "E":
						$strType = self::getIntegerType();
						break;
					default://s - small string
						$strType = "varchar(255)";
				}
				$strSql = "
					ALTER TABLE b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
					CHANGE PROPERTY_".$arProperty["ID"]." PROPERTY_".$arProperty["ID"]." ".$strType."
				";
				if(!$DB->DDL($strSql))
				{
					$this->LAST_ERROR =  $this->FormatUpdateError($ID, "MY07");
					return false;
				}
			}
		}

		if(
			$bCheckDescription
			|| (
				array_key_exists("WITH_DESCRIPTION", $arFields)
				&& $arFields["WITH_DESCRIPTION"] != $arProperty["WITH_DESCRIPTION"]
			)
		)
		{//WITH_DESCRIPTION changed
			if ($arFields["WITH_DESCRIPTION"] == "Y")
			{//WITH_DESCRIPTION=Y
				if (!isset($tableFields["DESCRIPTION_".$ID]))
				{
					$strSql = "
						ALTER TABLE b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
						ADD DESCRIPTION_".$ID." varchar(255)
					";
					if (!$DB->DDL($strSql))
					{
						$this->LAST_ERROR = $this->FormatUpdateError($ID, "MY08");
						return false;
					}
				}
			}
			else
			{//WITH_DESCRIPTION=N
				if (isset($tableFields["DESCRIPTION_".$ID]))
				{
					$rs = $DB->Query("
						SELECT COUNT(1) CNT
						FROM b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
						WHERE DESCRIPTION_".$ID." IS NOT NULL AND DESCRIPTION_".$ID." <> ''
					");
					$ar = $rs->Fetch();
					if ($ar["CNT"] <= 0)
					{
						$strSql = "
							ALTER TABLE b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
							DROP DESCRIPTION_".$ID."
						";
						if (!$DB->DDL($strSql))
						{
							$this->LAST_ERROR = $this->FormatUpdateError($ID, "MY09");
							return false;
						}
					}
				}
			}
		}

		return true;
	}

	public static function DropColumnSQL($strTable, $arColumns)
	{
		global $DB;
		$tableFields = $DB->GetTableFields($strTable);
		foreach ($arColumns as $i => $columnName)
		{
			if (!isset($tableFields[$columnName]))
				unset($arColumns[$i]);
		}
		if ($arColumns)
			return array("ALTER TABLE ".$strTable." DROP ".implode(", DROP ", $arColumns));
		else
			return array();
	}

	function _Add($ID, $arFields)
	{
		global $DB;

		$ID = (int)$ID;
		if ($ID <= 0)
		{
			return false;
		}

		$arFields['IBLOCK_ID'] = (int)($arFields['IBLOCK_ID'] ?? 0);
		if ($arFields['IBLOCK_ID'] <= 0)
		{
			return false;
		}

		$arFields['PROPERTY_TYPE'] ??= PropertyTable::TYPE_STRING;
		$arFields['MULTIPLE'] ??= 'N';
		$arFields['WITH_DESCRIPTION'] ??= 'N';

		if ($arFields["MULTIPLE"] === "Y")
		{
			$strType = self::getLongTextType();
		}
		else
		{
			switch($arFields["PROPERTY_TYPE"])
			{
				case PropertyTable::TYPE_STRING:
					$strType = "text";
					break;
				case PropertyTable::TYPE_NUMBER:
					$strType = "numeric(18,4)";
					break;
				case PropertyTable::TYPE_LIST:
				case PropertyTable::TYPE_FILE:
				case PropertyTable::TYPE_SECTION:
				case PropertyTable::TYPE_ELEMENT:
					$strType = self::getIntegerType();
					break;
				default://s - small string
					$strType = "varchar(255)";
			}
		}
		$strSql = "
			ALTER TABLE b_iblock_element_prop_s".$arFields["IBLOCK_ID"]."
			ADD PROPERTY_".$ID." ".$strType."
			".($arFields["WITH_DESCRIPTION"] == "Y"? ", ADD DESCRIPTION_".$ID." varchar(255)": "")."
		";

		return $DB->DDL($strSql, true);
	}

	private static function getLongTextType(): string
	{
		$connection = Main\Application::getConnection();
		$helper = $connection->getSqlHelper();
		unset($connection);

		$field = (new Main\ORM\Fields\TextField('TMP'))
			->configureLong(true)
		;

		return $helper->getColumnTypeByField($field);
	}

	private static function getIntegerType(?int $size = null): string
	{
		$connection = Main\Application::getConnection();
		$helper = $connection->getSqlHelper();
		unset($connection);

		$field = (new Main\ORM\Fields\IntegerField('TMP'));
		if ($size !== null)
		{
			$field->configureSize($size);
		}

		return $helper->getColumnTypeByField($field);
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit