%PDF- %PDF-
Server IP : 37.220.80.31 / Your IP : 3.14.136.121 Web Server : Apache/2.4.52 (Ubuntu) System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64 User : www-root ( 1010) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/esol.allimportexport/lib/import/ |
Upload File : |
<?php namespace Bitrix\EsolAie\Import; use Bitrix\Main\Entity, Bitrix\Main\Loader, Bitrix\Main\Config\Option, Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); Loc::loadMessages(dirname(__FILE__).'/../field_list.php'); class FieldList { protected static $instances = array(); protected $eFields = null; protected $entity = null; protected $entityClass = null; protected $params = array(); public static function getInstance($entity='false') { if (!isset(static::$instances[$entity])) static::$instances[$entity] = new static($entity); return static::$instances[$entity]; } public function __construct($entity) { $this->entity = $entity; $this->entityClass = \Bitrix\EsolAie\Runner::GetEntityClassByKey($entity); $this->checkEntityModule($this->entityClass); } public function checkEntityModule($entityClass) { $module = ToLower(current(explode('\\', substr($entityClass, strlen('\Bitrix\\'))))); if($module) Loader::includeModule($module); } public function setProfileParams($params=array()) { $this->params = $params; if(is_callable(array($this->entityClass, 'setProfileParams'))) { call_user_func(array($this->entityClass, 'setProfileParams'), $params); } } public function getEntityOptions() { $arParams = array(); if(is_callable(array($this->entityClass, 'getEntityOptions'))) { $arParams = call_user_func(array($this->entityClass, 'getEntityOptions')); if(!is_array($arParams)) $arParams = array(); } return $arParams; } public function GetEntityClass() { return $this->entityClass; } public function GetEntityRelTitles() { $entityClass = $this->entityClass; if(is_callable(array($entityClass, 'getRelTitles'))) { $arTitles = $entityClass::getRelTitles(); } else $arTitles = array(); return $arTitles; } public function GetReferenceFieldTitle($field, $arFieldTitles) { $title = $field->getTitle(); /*$arReference = $field->getReference(); if(count($arReference)==1) { $key = current(array_keys($arReference)); if(preg_match('/^=this\.([^\.]+)$/i', $key, $m) && isset($arFieldTitles[$m[1]]) && strlen($arFieldTitles[$m[1]]) > 0) { $title = $arFieldTitles[$m[1]]; } }*/ $arEntityTitles = array( '\Bitrix\Iblock\Iblock' => Loc::getMessage("ESOL_AE_FL_ENTITY_IBLOCK"), '\Bitrix\Catalog\Discount' => Loc::getMessage("ESOL_AE_FL_ENTITY_CATALOG_DISCOUNT"), '\Bitrix\Sale\Internals\Discount' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_DISCOUNT"), '\Bitrix\Iblock\Property' => Loc::getMessage("ESOL_AE_FL_ENTITY_IBLOCK_PROPERTY"), '\Bitrix\Sale\Internals\StatusLang' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_STATUS_LANG"), '\Bitrix\Sale\Internals\Basket' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_BASKET"), '\Bitrix\Sale\Internals\Payment' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_PAYMENT"), '\Bitrix\Sale\Internals\Shipment' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_SHIPMENT"), '\Bitrix\Sale\Internals\OrderCoupons' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_ORDERCOUPONS"), '\Bitrix\Sale\Internals\OrderDiscountData' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_ORDERDISCOUNTDATA"), '\Bitrix\Sale\Internals\Fuser' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_FUSER"), '\Bitrix\Main\User' => Loc::getMessage("ESOL_AE_FL_ENTITY_USER"), '\Bitrix\Sale\Internals\Order' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_ORDER"), '\Bitrix\Main\UserGroup' => Loc::getMessage("ESOL_AE_FL_ENTITY_USER_GROUP"), '\Bitrix\Main\Group' => Loc::getMessage("ESOL_AE_FL_ENTITY_GROUP"), '\Bitrix\Sale\Internals\OrderPropsValue' => Loc::getMessage("ESOL_AE_FL_ENTITY_ORDERPROPSVALUE"), '\Bitrix\EsolAie\Entity\SaleUserAccount' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_USER_ACCOUNT"), '\Bitrix\Sale\Internals\UserProps' => Loc::getMessage("ESOL_AE_FL_ENTITY_SALE_USER_PROPS") ); $entityName = $field->getRefEntityName(); if(isset($arEntityTitles[$entityName]) && strlen($arEntityTitles[$entityName]) > 0) { $title = $arEntityTitles[$entityName].' ['.$title.']'; } return $title; } public function GetRelsByField($field, $entityClass=false) { $arParts = explode('.', $field); $field = array_shift($arParts); $restField = implode('.', $arParts); $arRelFields = array(); if(!$entityClass) $entityClass = $this->GetEntityClass(); if(is_callable(array($entityClass, 'getMap'))) { $arMap = $entityClass::getMap(); foreach($arMap as $mf) { if($mf instanceof Entity\ReferenceField) { $arRef = $mf->getReference(); if(strlen($restField) > 0) { if($mf->getName()==$field) { return $this->GetRelsByField($restField, $mf->getRefEntity()->getDataClass()); } continue; } if(is_array($arRef) && count($arRef)==1 && (array_key_exists('=this.'.$field, $arRef) || in_array('this.'.$field, $arRef))) { $relEntityClass = $mf->getDataType(); if(strpos($relEntityClass, 0, -5)!=='Table') $relEntityClass = $relEntityClass.'Table'; if($relEntity = \Bitrix\EsolAie\Runner::GetEntityKeyByClass($relEntityClass)) { $fl2 = self::getInstance($relEntity); $arRelFields = $fl2->GetEntityFieldsForFilter(); } else { $fl2 = self::getInstance($this->entity); $arRelFields = $fl2->GetEntityFieldsForFilter($relEntityClass); } foreach($arRelFields as $k=>$v) { if(strpos($k, '.')!==false) unset($arRelFields[$k]); } } } if(!empty($arRelFields)) break; } } return $arRelFields; } public function GetRelTableByField($field, $relField='', $entityClass=false) { $arParts = explode('.', $field); $field = array_shift($arParts); $restField = implode('.', $arParts); $arRelFields = array(); if(!$entityClass) $entityClass = $this->GetEntityClass(); if(is_callable(array($entityClass, 'getMap'))) { $arMap = $entityClass::getMap(); foreach($arMap as $mf) { if($mf instanceof Entity\ReferenceField) { $arRef = $mf->getReference(); if(strlen($restField) > 0) { if($mf->getName()==$field) { return $this->GetRelTableByField($restField, $relField, $mf->getRefEntity()->getDataClass()); } continue; } if(count($arRef)==1 && (array_key_exists('=this.'.$field, $arRef) || in_array('this.'.$field, $arRef))) { $relEntityClass = $mf->getDataType(); if(strpos($relEntityClass, 0, -5)!=='Table') $relEntityClass = $relEntityClass.'Table'; if($relEntity = \Bitrix\EsolAie\Runner::GetEntityKeyByClass($relEntityClass)) { $fl2 = self::getInstance($relEntity); $arRelFields = $fl2->GetEntityFieldsForFilter(); } else { $fl2 = self::getInstance($this->entity); $arRelFields = $fl2->GetEntityFieldsForFilter($relEntityClass); } $primary = ''; foreach($arRelFields as $k=>$v) { if($v['primary'] && strpos($k, '.')===false) $primary = $k; } if(strlen($primary) > 0) { $arRet = array('NAME'=>$relEntityClass, 'PRIMARY'=>$primary); if(strlen($relField) > 0) { if(array_key_exists($relField, $arRelFields)) { return $arRet; } } else { return $arRet; } } } } } } return false; } public function GetEntityFieldsDirect($entityClass=false, $allowRefs = true) { if($entityClass===false) $entityClass = $this->entityClass; $this->checkEntityModule($entityClass); if(!$entityClass || !class_exists($entityClass)) return array(); @ob_start(); if(is_callable(array($entityClass, 'getIEFields'))) { $arFields = $entityClass::getIEFields('import'); } else { $arFields = $entityClass::getMap(); } if(is_callable(array($entityClass, 'getImportExtraFields'))) { $arFields = $arFields + $entityClass::getImportExtraFields(); } $arAllowImportFields = array(); if(is_callable(array($entityClass, 'getRelAllowImportFields'))) { $arAllowImportFields = $entityClass::getRelAllowImportFields(); } $arOldFields = $arFields; $arFields = array(); $arFieldTitles = array(); foreach($arOldFields as $k=>$v) { $key = $k; if(is_object($v)) $fieldTitle = $v->getTitle(); else $fieldTitle = $v['title']; if(is_numeric($key)) { if(is_object($v) && is_callable(array($v, 'getColumnName')) && (/*exception for expression field*/ !is_callable(array($v, 'getValueField')) || $v->getValueField())) $key = $v->getColumnName(); else $key = $fieldTitle; } $arFieldTitles[$key] = $fieldTitle; $arFields[$key] = $v; } if($allowRefs) $arRelTitles = $this->GetEntityRelTitles(); else $arRelTitles = array(); $arRefs = array(); foreach($arFields as $k=>$v) { $v2 = $v; if(is_object($v)) { if($v2 instanceof Entity\ReferenceField) { if($allowRefs) { $arRefs[$k] = array( 'items' => $this->GetEntityFieldsDirect($v2->getRefEntity()->getDataClass(), false), 'title' => (isset($arRelTitles[$k]) ? $arRelTitles[$k] : $this->GetReferenceFieldTitle($v2, $arFieldTitles)) ); } elseif(array_key_exists($v2->getName(), $arAllowImportFields)) { $af = $arAllowImportFields[$v2->getName()]; if(is_array($af) && !empty($af) /*&& in_array($v2['data_type'], array('string', 'integer', 'boolean', 'datetime', 'text', 'date', 'datetime', 'enum', 'float'))*/) { $arRefs[$k] = array( 'items' => $this->GetEntityFieldsDirect($v2->getRefEntity()->getDataClass(), false), 'title' => (isset($arRelTitles[$k]) ? $arRelTitles[$k] : $this->GetReferenceFieldTitle($v2, $arFieldTitles)) ); if(is_array($arRefs[$k]['items'])) { foreach($arRefs[$k]['items'] as $k3=>$v3) { if(!in_array($k3, $af) && !isset($af[$k3])) unset($arRefs[$k]['items'][$k3]); elseif(isset($af[$k3]) && is_array($af[$k3])) { $arRefs[$k]['items'][$k3]['uf_settings'] = $af[$k3]; } } } if(!is_array($arRefs[$k]['items']) && empty($arRefs[$k]['items'])) unset($arRefs[$k]); } } unset($arFields[$k]); continue; } if(is_callable(array($v2, 'getDataType')) && !($v2 instanceof Entity\ExpressionField)) { $arFields[$k] = $v = array( 'data_type' => $v2->getDataType(), 'title' => $v2->getTitle(), 'private' => (is_callable(array($v2, 'isPrivate')) ? $v2->isPrivate() : false) ); if(is_callable(array($v2, 'isPrimary')) && $v2->isPrimary()) $arFields[$k]['primary'] = 1; if(is_callable(array($v2, 'isSerialized')) && $v2->isSerialized()) $arFields[$k]['serialized'] = 1; } else { unset($arFields[$k]); continue; } } else { if($v2['reference']) { $af = (isset($v2['ALLOW_IMPORT_FIELDS']) ? $v2['ALLOW_IMPORT_FIELDS'] : false); if(is_array($af) && !empty($af) /*&& in_array($v2['data_type'], array('string', 'integer', 'boolean', 'datetime', 'text', 'date', 'datetime', 'enum', 'float'))*/) { $refField = new Entity\ReferenceField($k, $v2['data_type'], $v2['reference']); $arRefs[$k] = array( 'items' => $this->GetEntityFieldsDirect($refField->getRefEntity()->getDataClass(), false), 'title' => (isset($arRelTitles[$k]) ? $arRelTitles[$k] : $this->GetReferenceFieldTitle($refField, $arFieldTitles)) ); if(is_array($arRefs[$k]['items'])) { foreach($arRefs[$k]['items'] as $k3=>$v3) { if(!in_array($k3, $af) && !isset($af[$k3])) unset($arRefs[$k]['items'][$k3]); elseif(isset($af[$k3]) && is_array($af[$k3])) { $arRefs[$k]['items'][$k3]['uf_settings'] = $af[$k3]; } } } if(!is_array($arRefs[$k]['items']) && empty($arRefs[$k]['items'])) unset($arRefs[$k]); } unset($arFields[$k]); continue; } elseif($v2['expression']) { unset($arFields[$k]); continue; } } if(!isset($arFields[$k]['title']) || strlen($arFields[$k]['title'])==0 || $arFields[$k]['title']==$k) { $arFields[$k]['title'] = $k; if(strlen(Loc::getMessage($entityClass."_ESOL_AE_".$k)) > 0) { $arFields[$k]['title'] = Loc::getMessage($entityClass."_ESOL_AE_".$k); } elseif(strlen(Loc::getMessage(str_replace('\EsolIE', '\\', $entityClass)."_ESOL_AE_".$k)) > 0) { $arFields[$k]['title'] = Loc::getMessage(str_replace('\EsolIE', '\\', $entityClass)."_ESOL_AE_".$k); } } if(in_array($v['data_type'], array('string', 'integer', 'boolean', 'datetime', 'text')) && (!array_key_exists('private', $v) || !$v['private'])) { $arFields[$k]['uid'] = 'Y'; } } $entityObj = new $entityClass(); $conn = $entityObj->getEntity()->getConnection(); $tblName = $entityObj->getTableName(); $res0 = $conn->query("SHOW FULL COLUMNS FROM `" . $tblName . "`"); while($f0 = $res0->fetch()) { if(isset($arFields[$f0['Field']]) && $f0['Null']=='NO' && strlen($f0['Default'])==0 && $f0['Key']!='PRI') { $arFields[$f0['Field']]['required'] = 1; } } foreach($arRefs as $k=>$v) { $arFields[$k] = $v; } @ob_end_clean(); return $arFields; } public function GetEntityFields($className=false) { if(!$className) { if(!isset($this->eFields)) { $this->eFields = $this->GetEntityFieldsDirect(false, false); } return $this->eFields; } else return $this->GetEntityFieldsDirect($className, false); } public function GetPrimaryField() { $arPrimaryFields = array(); $arFields = $this->GetEntityFields(); foreach($arFields as $k=>$v) { if($v['primary']) $arPrimaryFields[] = $k; } if(empty($arPrimaryFields) && array_key_exists('ID', $arFields)) $arPrimaryFields[] = 'ID'; if(count($arPrimaryFields)==1) return current($arPrimaryFields); else return $arPrimaryFields; } public function GetRequiredField() { $arRequiredFields = array(); $arFields = $this->GetEntityFields(); foreach($arFields as $k=>$v) { if($v['required']) $arRequiredFields[$k] = $v; } return $arRequiredFields; } public function GetEntityFieldsForFilter($className=false) { $arFields = $this->GetEntityFields($className); $arRels = array(); foreach($arFields as $k=>$v) { if(isset($v['items']) && is_array($v['items'])) { foreach($v['items'] as $k2=>$v2) { if(strlen($v2['title'])==0) continue; $v2['title'] = $v['title'].' / '.$v2['title']; $arRels[$k.'.'.$k2] = $v2; } unset($arFields[$k]); } } foreach($arRels as $k=>$v) { $arFields[$k] = $v; } return $arFields; } public function GetFieldsDirect(&$arGroups, $arFields, $group, $title) { $arGroups[$group] = array( 'title' => $title, 'items' => array() ); foreach($arFields as $k=>$ar) { if(is_array($ar['items'])) { if(!empty($ar['items'])) { $this->GetFieldsDirect($arGroups, $ar['items'], $k, $ar['title']); } } else { $key = $k; if($group!='__BASE__') $key = $group.'.'.$key; $arGroups[$group]['items'][$key] = $ar["title"]; } } } public function GetFields() { if(!$this->aFields) { $arGroups = array(); $this->GetFieldsDirect($arGroups, $this->GetEntityFields(), '__BASE__', Loc::getMessage("ESOL_AE_FL_BASE_GROUP")); $this->aFields = $arGroups; } return $this->aFields; } public function GetSortableFields() { if(!$this->aSortableFields) { $this->aSortableFields = array(); foreach($this->GetEntityFields() as $k=>$ar) { if(in_array($ar['data_type'], array('integer', 'string', 'boolean'))) { $this->aSortableFields[] = $k; } } } return $this->aSortableFields; } public function ShowSelectFields($fname, $value="", $arParams=array()) { $arGroups = $this->GetFields(); if($arParams['MULTIPLE']){?><select name="<?echo $fname;?>" multiple><?} else{?><select name="<?echo $fname;?>"><option value=""><?echo Loc::getMessage("ESOL_AE_FL_CHOOSE_FIELD");?></option><?} foreach($arGroups as $k2=>$v2) { ?><optgroup label="<?echo $v2['title']?>"><? foreach($v2['items'] as $k=>$v) { ?><option value="<?echo $k; ?>" <?if($k==$value){echo 'selected';}?>><?echo htmlspecialcharsbx($v); ?></option><? } ?></optgroup><? } ?></select><? } public function GetSelectUidFields($val=false) { $hash = md5(serialize($val)); if(!$this->UidFields) $this->UidFields = array(); if(!$this->UidFields[$hash]) { ob_start(); foreach($this->GetEntityFields() as $k=>$ar) { if($ar['uid']=="Y") { ?><option value="<?echo $k; ?>" <?if((is_array($val) && in_array($k, $val)) || $k==$val){echo 'selected';}?>><?echo htmlspecialcharsbx($ar['title']); ?></option><? } } $this->UidFields[$hash] = ob_get_clean(); } return $this->UidFields[$hash]; } public function ShowSelectUidFields($fname, $val=false) { $fields = $this->GetSelectUidFields($val); ?><select name="<?echo $fname;?>" class="chosen" multiple><?echo $fields;?></select><? } } ?>