• Модуль: translate
  • Путь к файлу: ~/bitrix/modules/translate/lib/index/pathindexcollection.php
  • Класс: BitrixTranslateIndexPathIndexCollection
  • Вызов: PathIndexCollection::collectFilePath
private function collectFilePath($relPath): int
{
	$fullPath = TranslateIOPath::tidy(self::$documentRoot.'/'.$relPath);

	$topPath = $this->constructAncestorsByPath($relPath);

	$topPathId = (int)$topPath['ID'];
	$topDepthLevel = (int)$topPath['DEPTH_LEVEL'];
	$isTopLang = $topPath['IS_LANG'];

	$topLangId = null;
	if ($isTopLang)
	{
		$topLangId = TranslateIOPath::extractLangId($relPath);
	}

	$relPath = TranslateIOPath::replaceLangId($relPath, '#LANG_ID#');

	if ($isTopLang)
	{
		if ($langSettings = TranslateSettings::instantiateByPath(self::$documentRoot.'/'.$relPath))
		{
			if (!$langSettings->isExists() || !$langSettings->load())
			{
				unset($langSettings);
			}
		}
	}

	/**
	 * @param string $parentFullPath Full real path of the parent folder.
	 * @param string $parentRelPath Relative project path of the parent folder.
	 * @param int $parentId The Id of of the parent folder index record.
	 * @param bool $isParentLang The flag that is parent folder is language folder.
	 * @param string $parentLangId The lang Id of the parent folder.
	 * @param int $depthLevel Current depth level.
	 *
	 * @return Generator|int
	 */
	$lookForLangDirectory =
		function (
			$parentFullPath,
			$parentRelPath,
			$parentId,
			$isParentLang = false,
			$parentLangId = null,
			$depthLevel = 0
		)
		use (
			&$lookForLangDirectory,
			/** @var TranslateSettings */
			&$langSettings
		)
		{
			$processedItemCount = 0;

			$this->getImmediateChildren($parentId);

			if ($isParentLang)
			{
				$childrenList = TranslateIOFileSystemHelper::getFileList($parentFullPath);
				if (!empty($childrenList))
				{
					foreach ($childrenList as $fullPath)
					{
						$name = basename($fullPath);
						if (in_array($name, TranslateIGNORE_FS_NAMES))
						{
							continue;
						}
						if (!TranslateIOPath::isPhpFile($name))
						{
							continue;
						}
						if (!is_file($fullPath))
						{
							continue;
						}

						$relPath = TranslateIOPath::replaceLangId($parentRelPath . '/'. $name, '#LANG_ID#');

						$pathId = null;

						if (isset($this->immediateChildren[$parentId][$relPath]))
						{
							$pathId = $this->immediateChildren[$parentId][$relPath];
						}

						if (self::$verbose)
						{
							echo "File path: {$relPath}";
						}
						if ($pathId === null)
						{
							$nodeData = [
								'PARENT_ID' => $parentId,
								'NAME' => $name,
								'PATH' => $relPath,
								'IS_LANG' => 'Y',
								'IS_DIR' => 'N',
								'DEPTH_LEVEL' => $depthLevel,
							];

							if ($langSettings instanceof TranslateSettings)
							{
								$settings = $langSettings->getOptions($relPath);
								if (!empty($settings[TranslateSettings::OPTION_LANGUAGES]))
								{
									$nodeData['OBLIGATORY_LANGS'] = implode(',', $settings[TranslateSettings::OPTION_LANGUAGES]);
								}
							}

							$res = IndexInternalsPathIndexTable::add($nodeData);
							$pathId = $res->getId();

							$this->immediateChildren[$parentId][$relPath] = $pathId;
						}

						if (self::$verbose)
						{
							echo "tIndex id: {$pathId}n";
						}

						//yield $pathId;
						$processedItemCount ++;
					}
				}
			}

			// dir only
			$childrenList = TranslateIOFileSystemHelper::getFolderList($parentFullPath);
			if (empty($childrenList))
			{
				$childrenList = [];
			}

			if ($parentLangId === null && basename($parentFullPath) === 'lang')
			{
				foreach ($childrenList as $i => $fullPath)
				{
					$name = basename($fullPath);
					if (in_array($name, TranslateIGNORE_FS_NAMES))
					{
						unset($childrenList[$i]);
					}
					if (!in_array($name, self::$enabledLanguages))
					{
						unset($childrenList[$i]);
					}
				}
				unset($i, $fullPath, $name);
				if (self::$useTranslationRepository)
				{
					// translation Repository
					foreach ($this->checkLanguages as $langId)
					{
						$fullPathLang = MainLocalizationTranslation::convertLangPath($parentFullPath.'/'.$langId, $langId);
						if (file_exists($fullPathLang))
						{
							$childrenList[] = $fullPathLang;
						}
					}
					unset($langId, $fullPathLang);
				}
			}

			if (!empty($childrenList))
			{
				$ignoreDev = implode('|', TranslateIGNORE_MODULE_NAMES);
				foreach ($childrenList as $fullPath)
				{
					$name = basename($fullPath);
					if (in_array($name, TranslateIGNORE_FS_NAMES))
					{
						continue;
					}

					$relPath = $parentRelPath . '/'. $name;

					if (!is_dir($fullPath))
					{
						continue;
					}

					if (in_array($relPath, TranslateIGNORE_BX_NAMES))
					{
						continue;
					}

					// /bitrix/modules/[smth]/dev/
					if (preg_match("#^bitrix/modules/[^/]+/({$ignoreDev})$#", trim($relPath, '/')))
					{
						continue;
					}

					if ($isParentLang && in_array($name, TranslateIGNORE_LANG_NAMES))
					{
						continue;
					}

					$isLang = $isParentLang || ($name === 'lang');
					if ($isLang)
					{
						if (in_array($name, self::$availableLanguages))
						{
							// only active languages
							if (!in_array($name, self::$enabledLanguages))
							{
								continue;
							}
							$parentLangId = $name;
							$name = '#LANG_ID#';
						}
						$relPath = TranslateIOPath::replaceLangId($relPath, '#LANG_ID#');
					}

					$pathId = null;

					if (isset($this->immediateChildren[$parentId][$relPath]))
					{
						$pathId = $this->immediateChildren[$parentId][$relPath];
					}

					if (self::$verbose)
					{
						echo "Path folder: {$relPath}";
					}
					if ($pathId === null)
					{
						$nodeData = [
							'PARENT_ID' => $parentId,
							'NAME' => $name,
							'PATH' => $relPath,
							'IS_LANG' => $isLang ? 'Y' : 'N',
							'IS_DIR' => 'Y',
							'DEPTH_LEVEL' => $depthLevel,
						];

						if ($langSettings instanceof TranslateSettings)
						{
							$settings = $langSettings->getOptions($relPath);
							if (!empty($settings[TranslateSettings::OPTION_LANGUAGES]))
							{
								$nodeData['OBLIGATORY_LANGS'] = implode(',', $settings[TranslateSettings::OPTION_LANGUAGES]);
							}
						}

						$res = IndexInternalsPathIndexTable::add($nodeData);
						$pathId = $res->getId();

						$this->immediateChildren[$parentId][$relPath] = $pathId;
						$this->immediateChildren[$pathId] = [];

						$this->ancestorsPaths[$relPath] = [
							'ID' => $pathId,
							'DEPTH_LEVEL' => $depthLevel,
							'IS_LANG' => $isLang,
							'PATH' => $relPath,
						];
					}

					if (self::$verbose)
					{
						echo "tIndex id: {$pathId}n";
					}

					$processedItemCount += $lookForLangDirectory($fullPath, $relPath, $pathId, $isLang, $parentLangId, $depthLevel + 1);// go deeper
					$processedItemCount ++;
				}
			}

			return $processedItemCount;
		};

	$processedItemCount = $lookForLangDirectory($fullPath, $relPath, $topPathId, $isTopLang, $topLangId, $topDepthLevel + 1);

	if ($isTopLang && isset($langSettings))
	{
		/** @var TranslateSettings $langSettings */
		$settings = $langSettings->getOptions('*');
		if (!empty($settings) && !empty($settings[TranslateSettings::OPTION_LANGUAGES]))
		{
			IndexInternalsPathIndexTable::bulkUpdate(
				['OBLIGATORY_LANGS' => implode(',', $settings[TranslateSettings::OPTION_LANGUAGES])],
				[
					'LOGIC' => 'OR',
					'=PATH' => $relPath,
					'=%PATH' => $relPath. '/%',
				]
			);
		}
		foreach ($langSettings as $settingPath => $settings)
		{
			if (strpos($settingPath, '*') !== false && $settingPath !== '*' && !empty($settings['languages']))
			{
				$settingPath = str_replace('*', '', $settingPath);
				IndexInternalsPathIndexTable::bulkUpdate(
					['OBLIGATORY_LANGS' => implode(',', $settings[TranslateSettings::OPTION_LANGUAGES])],
					[
						'LOGIC' => 'OR',
						'=PATH' => $relPath .'/#LANG_ID#/'. $settingPath,
						'=%PATH' => $relPath .'/#LANG_ID#/'. $settingPath. '/%',
					]
				);
			}
		}
		foreach ($langSettings as $settingPath => $settings)
		{
			if (TranslateIOPath::isPhpFile($settingPath) && !empty($settings[TranslateSettings::OPTION_LANGUAGES]))
			{
				IndexInternalsPathIndexTable::bulkUpdate(
					['OBLIGATORY_LANGS' => implode(',', $settings[TranslateSettings::OPTION_LANGUAGES])],
					['=PATH' => $relPath .'/#LANG_ID#/'. $settingPath]
				);
			}
		}
	}

	return $processedItemCount;
}