- Модуль: lists
- Путь к файлу: ~/bitrix/modules/lists/classes/general/listfields.php
- Класс: CListFieldList
- Вызов: CListFieldList::_read_form_settings
protected function _read_form_settings($form_id)
{
if(!$form_id)
return null;
global $DB;
//read list meta from module table
$rsFields = $DB->Query("
SELECT * FROM b_lists_field
WHERE IBLOCK_ID = ".$this->iblock_id."
ORDER BY SORT ASC
", false, "File: ".__FILE__."
Line: ".__LINE__);
$dbFields = array();
while($arField = $rsFields->Fetch())
$dbFields[$arField["FIELD_ID"]] = $arField;
$fields = array();
$customTabs = CUserOptions::GetOption("form", $form_id);
//read list meta from interface settings
if($customTabs && $customTabs["tabs"])
{
$sort = 10;
$arTabs = explode("--;--", $customTabs["tabs"]);
foreach($arTabs as $customFields)
{
if($customFields)
{
$arCustomFields = explode("--,--", $customFields);
array_shift($arCustomFields);
foreach($arCustomFields as $customField)
{
list($FIELD_ID, $customName) = explode("--#--", $customField);
if($FIELD_ID != "SECTIONS")
{
$customName = ltrim($customName, "* -xa0");
if(CListFieldTypeList::IsField($FIELD_ID))
$obField = $fields[$FIELD_ID] = new CListElementField($this->iblock_id, $FIELD_ID, $customName, $sort);
else
$obField = $fields[$FIELD_ID] = new CListPropertyField($this->iblock_id, $FIELD_ID, $customName, $sort);
//check if property was deleted from admin interface
if(!is_array($obField->GetArray()))
{
unset($fields[$FIELD_ID]);
}
else
{
$sort += 10;
unset($dbFields[$FIELD_ID]);
}
}
}
}
}
//There were some fields "deleted" from interface
foreach($dbFields as $FIELD_ID => $arField)
{
$DB->Query("
DELETE FROM b_lists_field
WHERE IBLOCK_ID = ".$this->iblock_id."
AND FIELD_ID = '".$DB->ForSQL($FIELD_ID)."'
", false, "File: ".__FILE__."
Line: ".__LINE__);
}
}
else//or from module metadata
{
foreach($dbFields as $FIELD_ID => $arField)
{
if(CListFieldTypeList::IsField($FIELD_ID))
$obField = $fields[$FIELD_ID] = new CListElementField($this->iblock_id, $FIELD_ID, $arField["NAME"], $arField["SORT"]);
else
$obField = $fields[$FIELD_ID] = new CListPropertyField($this->iblock_id, $FIELD_ID, $arField["NAME"], $arField["SORT"]);
//check if property was deleted from admin interface
if(!is_array($obField->GetArray()))
{
unset($fields[$FIELD_ID]);
$DB->Query("
DELETE FROM b_lists_field
WHERE IBLOCK_ID = ".$this->iblock_id."
AND FIELD_ID = '".$DB->ForSQL($FIELD_ID)."'
", false, "File: ".__FILE__."
Line: ".__LINE__);
}
}
}
return $fields;
}