Example #1
0
 protected function initReferences(&$configData)
 {
     /** @global \CDatabase $DB */
     global $DB;
     // Наполнение ссылок на другие таблицы или сущности
     $rawReferenceList = array();
     if (!empty($configData['reference']) && is_array($configData['reference'])) {
         foreach ($configData['reference'] as $rawReference) {
             $reference = array("table" => null, "entity" => null, "alias" => null, "type" => null, "condition" => null, "reference_field" => null, "self_field" => null);
             foreach ($reference as $refParam => &$refParamValue) {
                 if (!empty($rawReference[$refParam]) && is_string($rawReference[$refParam])) {
                     $refParamValue = $rawReference[$refParam];
                 }
             }
             $rawReferenceList[] = $reference;
         }
         unset($rawReference);
     }
     if (!empty($rawReferenceList)) {
         foreach ($rawReferenceList as &$reference) {
             $reference['fields'] = null;
             if (!empty($reference['entity'])) {
                 try {
                     $referenceConfigPath = self::normalizePath($reference['entity']);
                     if (substr($referenceConfigPath, 0, 1) != '/') {
                         $curConfigDir = dirname($this->configPath);
                         $referenceConfigPath = $curConfigDir . '/' . $reference['entity'];
                     }
                     $referenceConfigPath = self::normalizePath($referenceConfigPath);
                     if (null !== $this->parentRefConfig && $this->parentRefConfig->getConfigPath() == $referenceConfigPath) {
                         $refEntity = $this->parentRefConfig;
                     } else {
                         $refEntity = new self($referenceConfigPath, $this);
                     }
                     $reference['fields'] = $refEntity->getFieldsList(true);
                     // Если алиас связанной таблицы случайно не заполнен, то надо попробовать
                     // взять алиас из объекта связанной сущности + проверить не использовали ли мы его уже
                     // (т.е. не занят ли другой связанной таблицей относительно текущей сущносии)
                     // и только если алиас из объекта не подошел, только тогда выбрасываем исключение на неправильный алиас
                     if ((empty($reference['alias']) || !self::validateTblAlias($reference['alias'])) && !array_key_exists($refEntity->getAlias(), $this->reference)) {
                         $reference['alias'] = $refEntity->getAlias();
                     }
                     $reference['table'] = $refEntity->getTableName();
                 } catch (Err $e) {
                     if ($e->getCode() == Err::E_CFG_REF_ENTITY_SAME_CLASS) {
                         throw $e;
                     }
                     throw new Err(array('#REASON#' => $e->getMessage() . ' (' . Err::ID . $e->getCode() . ')'), Err::E_CFG_REF_READ_ENTITY_FAIL);
                 }
             } else {
                 if (!empty($reference['table']) && !self::validateTblName($reference['table'])) {
                     throw new Err('', Err::E_CFG_REF_WRG_NAME);
                 }
                 $rsColumns = $DB->Query('SHOW COLUMNS FROM ' . $reference['table']);
                 $refColumnsList = array();
                 while ($column = $rsColumns->Fetch()) {
                     $refColumnsList[] = $column['Field'];
                 }
                 if (empty($refColumnsList)) {
                     throw new Err(array('#REASON#' => 'OBX_CORE_DBENTITY_EDITOR_E_FETCH_TABLE_COLUMNS_FAILED'), Err::E_CFG_REF_READ_ENTITY_FAIL);
                 }
                 $reference['fields'] = $refColumnsList;
             }
             if (empty($reference['alias']) || !self::validateTblAlias($reference['alias'])) {
                 throw new Err('', Err::E_CFG_REF_WRG_ALIAS);
             }
             if (array_key_exists($reference['alias'], $this->reference)) {
                 throw new Err('', Err::E_CFG_REF_ALIAS_NOT_UQ);
             }
             if (empty($reference['type'])) {
                 throw new Err('', Err::E_CFG_REF_WRG_JOIN_TYPE);
             }
             switch ($reference['type']) {
                 case 'left_join':
                 case 'right_join':
                 case 'cross':
                     break;
                 default:
                     throw new Err('', Err::E_CFG_REF_WRG_JOIN_TYPE);
             }
             $refCondition = self::parseReferenceCondition($reference['condition']);
             if (null === $refCondition) {
                 throw new Err('', Err::E_CFG_REF_WRG_CONDITION);
             }
             if ($refCondition['left']['table'] == $this->tableAlias && $refCondition['right']['table'] == $reference['alias']) {
                 $reference['self_field'] = $refCondition['left']['field'];
                 $reference['reference_field'] = $refCondition['right']['field'];
             } elseif ($refCondition['right']['table'] == $this->tableAlias && $refCondition['left']['table'] == $reference['alias']) {
                 $reference['self_field'] = $refCondition['right']['field'];
                 $reference['reference_field'] = $refCondition['left']['field'];
             } else {
                 throw new Err('', Err::E_CFG_REF_WRG_CONDITION);
             }
             if (!in_array($reference['reference_field'], $reference['fields']) || empty($this->fields[$reference['self_field']])) {
                 throw new Err('', Err::E_CFG_REF_WRG_CONDITION);
             }
             $this->reference[$reference['alias']] = $reference;
         }
     }
 }