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