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; } } }