%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/components/bitrix/lists.field.edit/ |
| Current File : //home/bitrix/www/bitrix/components/bitrix/lists.field.edit/component.php |
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponent $this */
/** @var array $arParams */
/** @var array $arResult */
/** @var string $componentName */
/** @var string $componentPath */
/** @var string $componentTemplate */
/** @var string $parentComponentName */
/** @var string $parentComponentPath */
/** @var string $parentComponentTemplate */
$this->setFrameMode(false);
/** @var CCacheManager $CACHE_MANAGER */
global $CACHE_MANAGER;
if(!CModule::IncludeModule('lists'))
{
ShowError(GetMessage("CC_BLFE_MODULE_NOT_INSTALLED"));
return;
}
$lists_perm = CListPermissions::CheckAccess(
$USER,
$arParams["~IBLOCK_TYPE_ID"],
intval($arParams["~IBLOCK_ID"]),
$arParams["~SOCNET_GROUP_ID"]
);
if($lists_perm < 0)
{
switch($lists_perm)
{
case CListPermissions::WRONG_IBLOCK_TYPE:
ShowError(GetMessage("CC_BLFE_WRONG_IBLOCK_TYPE"));
return;
case CListPermissions::WRONG_IBLOCK:
ShowError(GetMessage("CC_BLFE_WRONG_IBLOCK"));
return;
case CListPermissions::LISTS_FOR_SONET_GROUP_DISABLED:
ShowError(GetMessage("CC_BLFE_LISTS_FOR_SONET_GROUP_DISABLED"));
return;
default:
ShowError(GetMessage("CC_BLFE_UNKNOWN_ERROR"));
return;
}
}
elseif(
(
$arParams["~IBLOCK_ID"] > 0
&& $lists_perm < CListPermissions::IS_ADMIN
&& !CIBlockRights::UserHasRightTo($arParams["~IBLOCK_ID"], $arParams["~IBLOCK_ID"], "iblock_edit")
) || (
$arParams["~IBLOCK_ID"] == 0
&& $lists_perm < CListPermissions::IS_ADMIN
)
)
{
ShowError(GetMessage("CC_BLFE_ACCESS_DENIED"));
return;
}
$arParams["CAN_EDIT"] =
$lists_perm >= CListPermissions::IS_ADMIN
|| (
$arParams["~IBLOCK_ID"] > 0
&& CIBlockRights::UserHasRightTo($arParams["~IBLOCK_ID"], $arParams["~IBLOCK_ID"], "iblock_edit")
)
;
$arIBlock = CIBlock::GetArrayByID(intval($arParams["~IBLOCK_ID"]));
$arResult["~IBLOCK"] = $arIBlock;
$arResult["IBLOCK"] = htmlspecialcharsex($arIBlock);
$arResult["IBLOCK_ID"] = $arIBlock["ID"];
if(isset($arParams["SOCNET_GROUP_ID"]) && $arParams["SOCNET_GROUP_ID"] > 0)
$arParams["SOCNET_GROUP_ID"] = intval($arParams["SOCNET_GROUP_ID"]);
else
$arParams["SOCNET_GROUP_ID"] = "";
$arResult["GRID_ID"] = "lists_fields";
$arResult["FORM_ID"] = "lists_field_edit";
$arResult["~LISTS_URL"] = str_replace(
array("#group_id#"),
array($arParams["SOCNET_GROUP_ID"]),
$arParams["~LISTS_URL"]
);
$arResult["LISTS_URL"] = htmlspecialcharsbx($arResult["~LISTS_URL"]);
$arResult["~LIST_URL"] = CHTTP::urlAddParams(str_replace(
array("#list_id#", "#section_id#", "#group_id#"),
array($arResult["IBLOCK_ID"], 0, $arParams["SOCNET_GROUP_ID"]),
$arParams["~LIST_URL"]
), array("list_section_id" => ""));
$arResult["LIST_URL"] = htmlspecialcharsbx($arResult["~LIST_URL"]);
$arResult["~LIST_EDIT_URL"] = str_replace(
array("#list_id#", "#group_id#"),
array($arResult["IBLOCK_ID"], $arParams["SOCNET_GROUP_ID"]),
$arParams["~LIST_EDIT_URL"]
);
$arResult["LIST_EDIT_URL"] = htmlspecialcharsbx($arResult["~LIST_EDIT_URL"]);
$arResult["~LIST_FIELDS_URL"] = str_replace(
array("#list_id#", "#group_id#"),
array($arResult["IBLOCK_ID"], $arParams["SOCNET_GROUP_ID"]),
$arParams["~LIST_FIELDS_URL"]
);
$arResult["LIST_FIELDS_URL"] = htmlspecialcharsbx($arResult["~LIST_FIELDS_URL"]);
$obList = new CList($arIBlock["ID"]);
$arFields = $obList->GetFields();
if(array_key_exists($arParams["FIELD_ID"], $arFields))
{
$arResult["FIELD"] = $arFields[$arParams["FIELD_ID"]];
$arResult["FIELD_ID"] = $arParams["FIELD_ID"];
}
else
{
$arResult["FIELD"] = false;
$arResult["FIELD_ID"] = false;
}
$arResult["~LIST_FIELD_EDIT_URL"] = str_replace(
array("#list_id#", "#field_id#", "#group_id#"),
array($arResult["IBLOCK_ID"], $arResult["FIELD_ID"], $arParams["SOCNET_GROUP_ID"]),
$arParams["~LIST_FIELD_EDIT_URL"]
);
$arResult["LIST_FIELD_EDIT_URL"] = htmlspecialcharsbx($arResult["~LIST_FIELD_EDIT_URL"]);
//Assume there was no error
$bVarsFromForm = false;
//Form submitted
if($_SERVER["REQUEST_METHOD"] == "POST" && check_bitrix_sessid())
{
//When Save or Apply buttons was pressed
if(isset($_POST["save"]) || isset($_POST["apply"]))
{
$strError = "";
//Gather fields for update
$arField = array(
"SORT" => $_POST["SORT"],
"NAME" => trim($_POST["NAME"], " \n\r\t\x0"),
"IS_REQUIRED" => $_POST["IS_REQUIRED"],
"MULTIPLE" => $_POST["MULTIPLE"],
"CODE" => $_POST["CODE"],
"TYPE" => $_POST["TYPE"],
"DEFAULT_VALUE" => $_POST["DEFAULT_VALUE"],
"USER_TYPE_SETTINGS" => $_POST["USER_TYPE_SETTINGS"],
"SETTINGS" => $_POST["SETTINGS"],
);
if(isset($arField["SETTINGS"]["ADD_READ_ONLY_FIELD"]) && $arField["SETTINGS"]["ADD_READ_ONLY_FIELD"] == "Y")
{
switch($arField["TYPE"])
{
case "SORT":
if(strlen($arField["DEFAULT_VALUE"]) <= 0)
$strError = GetMessage("CC_BLFE_BAD_FIELD_ADD_READ_ONLY")."<br>";
break;
case "L":
if(is_array($_POST["LIST_DEF"]))
{
$listDefaultValue = current($_POST["LIST_DEF"]);
if(empty($listDefaultValue))
$strError = GetMessage("CC_BLFE_BAD_FIELD_ADD_READ_ONLY")."<br>";
}
break;
case "S:HTML":
if(empty($arField["DEFAULT_VALUE"]["TEXT"]))
$strError = GetMessage("CC_BLFE_BAD_FIELD_ADD_READ_ONLY")."<br>";
break;
default:
if(empty($arField["DEFAULT_VALUE"]))
$strError = GetMessage("CC_BLFE_BAD_FIELD_ADD_READ_ONLY")."<br>";
}
}
if(strlen($arField["NAME"]) <= 0)
$strError = GetMessage("CC_BLFE_BAD_FIELD_NAME")."<br>";
if($arField["TYPE"] == "PREVIEW_PICTURE")
{
$arField["DEFAULT_VALUE"]["METHOD"] = "resample";
$arField["DEFAULT_VALUE"]["COMPRESSION"] = intval(COption::GetOptionString('main', 'image_resize_quality', '95'));
}
elseif($arField["TYPE"] == "S:Date")
{
if(!empty($arField["DEFAULT_VALUE"]) && !CheckDateTime($arField["DEFAULT_VALUE"], FORMAT_DATE))
{
$strError = GetMessage("CC_BLFE_INVALID_DEFAULT_VALUE")."<br>";
}
}
elseif($arField["TYPE"] == "S:DateTime")
{
if(!empty($arField["DEFAULT_VALUE"]) && !CheckDateTime($arField["DEFAULT_VALUE"]))
{
$strError = GetMessage("CC_BLFE_INVALID_DEFAULT_VALUE")."<br>";
}
}
if(preg_match("/^(G|G:|E|E:)/", $arField["TYPE"]))
{
$arField["LINK_IBLOCK_ID"] = intval($_POST["LINK_IBLOCK_ID"]);
$arIBLOCKS = CLists::GetIBlocks($arParams["~IBLOCK_TYPE_ID"], !$arParams["CAN_EDIT"], $arParams["~SOCNET_GROUP_ID"]);
if(substr($arField["TYPE"], 0, 1) == "G")
unset($arIBLOCKS[$arResult["IBLOCK_ID"]]);
if(!array_key_exists($arField["LINK_IBLOCK_ID"], $arIBLOCKS))
$strError = GetMessage("CC_BLFE_WRONG_LINK_IBLOCK")."<br>";
}
if(isset($_POST["ROW_COUNT"]) && $_POST["ROW_COUNT"] > 0)
$arField["ROW_COUNT"] = intval($_POST["ROW_COUNT"]);
if(isset($_POST["COL_COUNT"]) && $_POST["COL_COUNT"] > 0)
$arField["COL_COUNT"] = intval($_POST["COL_COUNT"]);
if(isset($_POST["LIST"]))
$arField["LIST"] = $_POST["LIST"];
if(!is_array($arField["LIST"]))
$arField["LIST"] = array();
//Import values from textarea
if(isset($_POST["LIST_TEXT_VALUES"]) && strlen($_POST["LIST_TEXT_VALUES"]))
{
$max_sort = 0;
//create values "map"
$arListMap = array();
foreach($arField["LIST"] as $i => $arEnum)
{
if($arEnum["SORT"] > $max_sort)
$max_sort = intval($arEnum["SORT"]);
$arListMap[trim($arEnum["VALUE"], " \t\n\r")] = $arEnum["ID"];
}
//add non empty lines to the list
foreach(explode("\n", $_POST["LIST_TEXT_VALUES"]) as $value_line)
{
$value = trim($value_line, " \t\n\r");
if(strlen($value) > 0 && !isset($arListMap[$value]))
{
$max_sort += 10;
$arListMap[$value] = "m".$max_sort;
$arField["LIST"]["m".$max_sort] = array(
"SORT" => $max_sort,
"VALUE" => $value,
);
}
}
}
if(isset($_POST["LIST_DEF"]) && is_array($_POST["LIST_DEF"]))
{
foreach($arField["LIST"] as $i => $arEnum)
{
$arField["LIST"][$i]["DEF"] = "N";
}
foreach($_POST["LIST_DEF"] as $def)
{
$def = intval($def);
if($def > 0 && isset($arField["LIST"][$def]))
{
$arField["LIST"][$def]["DEF"] = "Y";
}
}
}
if(!$strError)
{
try
{
if ($arResult["FIELD_ID"])
{
unset($arField["TYPE"]);
$arResult["FIELD_ID"] = $obList->UpdateField($arResult["FIELD_ID"], $arField);
}
else
{
$arResult["FIELD_ID"] = $obList->AddField($arField);
}
//Clear components cache
$CACHE_MANAGER->ClearByTag("lists_list_".$arIBlock["ID"]);
$tab_name = $arResult["FORM_ID"]."_active_tab";
$obList->actualizeDocumentAdminPage(str_replace(
array("#list_id#", "#group_id#"),
array($arResult["IBLOCK_ID"], $arParams["SOCNET_GROUP_ID"]), $arParams["LIST_ELEMENT_URL"]));
//And go to proper page
if (isset($_POST["save"]))
LocalRedirect($arResult["~LIST_FIELDS_URL"]);
elseif ($arResult["FIELD_ID"])
LocalRedirect(
CHTTP::urlAddParams(str_replace(
array("#list_id#", "#field_id#", "#group_id#"),
array($arResult["IBLOCK_ID"], $arResult["FIELD_ID"], $arParams["SOCNET_GROUP_ID"]),
$arParams["~LIST_FIELD_EDIT_URL"]
),
array($tab_name => $_POST[$tab_name]),
array("skip_empty" => true, "encode" => true)
)
);
else
LocalRedirect($arResult["~LIST_FIELDS_URL"]);
}
catch (Bitrix\Main\SystemException $exception)
{
ShowError($exception->getMessage());
if (!$arResult["FIELD_ID"])
{
$bVarsFromForm = true;
}
}
}
else
{
ShowError($strError);
$bVarsFromForm = true;
}
}
elseif(isset($_POST["action"]) && $_POST["action"]==="type_changed")
{
$bVarsFromForm = true;
}
elseif($arResult["FIELD_ID"] && isset($_POST["action"]) && $_POST["action"]==="delete")
{
$obList->DeleteField($arResult["FIELD_ID"]);
$obList->Save();
//Clear components cache
$CACHE_MANAGER->ClearByTag("lists_list_".$arIBlock["ID"]);
LocalRedirect($arResult["~LIST_FIELDS_URL"]);
}
else
{
//Go to lists page
LocalRedirect($arResult["~LISTS_URL"]);
}
}
$arResult["TYPES"] = $obList->GetAvailableTypes($arResult["FIELD_ID"]);
$data = array();
if($bVarsFromForm)
{//There was an error so display form values
$data["SORT"] = $_POST["SORT"];
$data["NAME"] = $_POST["NAME"];
$data["IS_REQUIRED"] = $_POST["IS_REQUIRED"];
$data["MULTIPLE"] = $_POST["MULTIPLE"];
$data["CODE"] = $_POST["CODE"];
$data["TYPE"] = $_POST["TYPE"];
if (isset($_POST["ROW_COUNT"]))
$data["ROW_COUNT"] = $_POST["ROW_COUNT"];
if (isset($_POST["COL_COUNT"]))
$data["COL_COUNT"] = $_POST["COL_COUNT"];
if($data["TYPE"] !== $arResult["FIELD"]["TYPE"])
{
//field type was changed so it needs adjustment
$arMatch = array();
if(preg_match("/^(.):(.+)$/", $data["TYPE"], $arMatch))
{
$arResult["FIELD"]["PROPERTY_USER_TYPE"] = CIBlockProperty::GetUserType($arMatch[2]);
}
}
if(
$data["TYPE"] !== "PREVIEW_PICTURE"
&& $data["TYPE"] !== "DETAIL_PICTURE"
&& is_array($_POST["DEFAULT_VALUE"])
)
{
$data["DEFAULT_VALUE"] = "";
}
else
{
$data["DEFAULT_VALUE"] = $_POST["DEFAULT_VALUE"];
}
$data["SETTINGS"] = $_POST["SETTINGS"];
if(isset($_POST["LIST"]) && is_array($_POST["LIST"]))
{
$n = 0;
$arResult["LIST"] = array();
foreach($_POST["LIST"] as $k => $v)
{
$match = array();
if(preg_match("/^n(\d+)$/", $k, $match))
{
if(intval($match[1]) > $n)
$n = intval($match[1]);
}
$arResult["LIST"][$k] = array(
"ID" => $k,
"SORT" => $v["SORT"],
"VALUE" => $v["VALUE"],
);
}
while($n >= 0)
{
if(array_key_exists("n".$n, $arResult["LIST"]))
{
if(strlen($arResult["LIST"]["n".$n]["VALUE"]) > 0)
break;
else
unset($arResult["LIST"]["n".$n]);
}
$n--;
}
$arResult["LIST"][] = array(
"ID" => "n".($n+1),
"SORT" => 500,
"NAME" => "",
);
}
elseif(preg_match("/^(L|L:)/", $data["TYPE"]))
{
$arResult["LIST"] = array();
$arResult["LIST"][] = array(
"ID" => "n0",
"SORT" => 500,
"NAME" => "",
);
}
else
{
$arResult["LIST"] = false;
}
$data["LIST_TEXT_VALUES"] = $_POST["LIST_TEXT_VALUES"];
if(isset($_POST["LIST_DEF"]) && is_array($_POST["LIST_DEF"]))
{
$n = 0;
$arResult["LIST_DEF"] = array();
foreach($_POST["LIST_DEF"] as $def)
{
if(array_key_exists($def, $arResult['LIST']))
$arResult["LIST_DEF"][$def] = true;
}
}
elseif(preg_match("/^(L|L:)/", $data["TYPE"]))
{
$arResult["LIST_DEF"] = array();
}
else
{
$arResult["LIST_DEF"] = false;
}
if(isset($_POST["LINK_IBLOCK_ID"]) && $_POST["LINK_IBLOCK_ID"] > 0)
{
$data["LINK_IBLOCK_ID"] = intval($_POST["LINK_IBLOCK_ID"]);
}
}
elseif($arResult["FIELD_ID"])
{//Edit existing field
$data["SORT"] = $arResult["FIELD"]["SORT"];
$data["NAME"] = $arResult["FIELD"]["NAME"];
$data["IS_REQUIRED"] = $arResult["FIELD"]["IS_REQUIRED"];
$data["MULTIPLE"] = $arResult["FIELD"]["MULTIPLE"];
$data["CODE"] = $arResult["FIELD"]["CODE"];
$data["TYPE"] = $arResult["FIELD"]["TYPE"];
$data["DEFAULT_VALUE"] = $arResult["FIELD"]["DEFAULT_VALUE"];
$data["SETTINGS"] = $arResult["FIELD"]["SETTINGS"];
$data["ROW_COUNT"] = $arResult["FIELD"]["ROW_COUNT"];
$data["COL_COUNT"] = $arResult["FIELD"]["COL_COUNT"];
if(isset($arResult["FIELD"]["LINK_IBLOCK_ID"]))
{
$data["LINK_IBLOCK_ID"] = intval($arResult["FIELD"]["LINK_IBLOCK_ID"]);
}
if(preg_match("/^PROPERTY_(\\d+)$/", $arResult["FIELD_ID"], $arMatch))
{
$arResult["LIST"] = array();
$arResult["LIST_DEF"] = array();
$rsEnum = CIBlockPropertyEnum::GetList(array("sort"=>"asc", "value"=>"asc"), array("PROPERTY_ID" => $arMatch[1]));
while($ar = $rsEnum->GetNext())
{
$arResult["LIST"][$ar["ID"]] = $ar;
if($ar["DEF"] == "Y")
$arResult["LIST_DEF"][$ar["ID"]] = true;
}
$arResult["LIST"][] = array(
"ID" => "n0",
"SORT" => 500,
"NAME" => "",
);
}
else
{
$arResult["LIST"] = false;
$arResult["LIST_DEF"] = false;
}
$data["LIST_TEXT_VALUES"] = '';
}
else
{//New one
$data["ID"] = "";
$data["SORT"] = 500;
$data["NAME"] = GetMessage("CC_BLFE_FIELD_NAME_DEFAULT");
$data["IS_REQUIRED"] = "N";
$data["MULTIPLE"] = "N";
$data["CODE"] = "";
list($data["TYPE"], $temp) = each($arResult["TYPES"]);
reset($arResult["TYPES"]);
$arResult["LIST"] = false;
$data["LIST_TEXT_VALUES"] = '';
$arResult["LIST_DEF"] = false;
}
if(preg_match("/^(G|G:|E|E:)/", $data["TYPE"]))
{
$arResult["LINK_IBLOCKS"] = CLists::GetIBlocks($arParams["~IBLOCK_TYPE_ID"], !$arParams["CAN_EDIT"], $arParams["~SOCNET_GROUP_ID"]);
if(substr($data["TYPE"], 0, 1) == "G")
unset($arResult["LINK_IBLOCKS"][$arResult["IBLOCK_ID"]]);
}
$arResult["FORM_DATA"] = array();
foreach($data as $key => $value)
{
$arResult["FORM_DATA"]["~".$key] = $value;
if(is_array($value))
{
foreach($value as $key1 => $value1)
$value[$key1] = htmlspecialcharsbx($value1);
$arResult["FORM_DATA"][$key] = $value;
}
else
{
$arResult["FORM_DATA"][$key] = htmlspecialcharsbx($value);
}
}
$arResult['RAND_STRING'] = $this->randString();
$arResult["CAN_BE_MULTIPLE"] = !$obList->is_field($data["TYPE"]);
$arResult["IS_PROPERTY"] = $arResult["CAN_BE_MULTIPLE"];
if($data["TYPE"] == "S:map_yandex")
$arResult["CAN_BE_MULTIPLE"] = false;
$arResult["CAN_BE_OPTIONAL"] = $data["TYPE"] != "NAME";
$arResult["IS_READ_ONLY"] = $arResult["FIELD_ID"]? $obList->is_readonly($arResult["FIELD_ID"]): CListFieldTypeList::GetByID($data["TYPE"])->IsReadonly();
$arResult["IS_MULTIPLE_ONLY"] = $data["TYPE"] == "S:DiskFile";
$this->IncludeComponentTemplate();
if($arResult["FIELD_ID"])
$APPLICATION->SetTitle(GetMessage("CC_BLFE_TITLE_EDIT", array("#NAME#" => htmlspecialcharsex($arResult["FIELD"]["NAME"]))));
else
$APPLICATION->SetTitle(GetMessage("CC_BLFE_TITLE_NEW"));
$APPLICATION->AddChainItem($arResult["IBLOCK"]["NAME"], $arResult["~LIST_URL"]);
$APPLICATION->AddChainItem(GetMessage("CC_BLFE_CHAIN_LIST_EDIT"), $arResult["~LIST_EDIT_URL"]);
$APPLICATION->AddChainItem(GetMessage("CC_BLFE_CHAIN_FIELDS"), $arResult["~LIST_FIELDS_URL"]);
?>