Your IP : 3.23.103.132


Current Path : /var/www/www-root/data/www.catalog.monolith-realty.ru/bitrix/modules/landing/lib/
Upload File :
Current File : /var/www/www-root/data/www.catalog.monolith-realty.ru/bitrix/modules/landing/lib/folder.php

<?php
namespace Bitrix\Landing;

class Folder extends \Bitrix\Landing\Internals\BaseTable
{
	/**
	 * Internal class.
	 * @var string
	 */
	public static $internalClass = 'FolderTable';

	/**
	 * Deletes all folders for site.
	 * @param int $siteId Site id.
	 * @return void
	 */
	public static function deleteForSite(int $siteId): void
	{
		$res = self::getList([
			'select' => [
				'ID'
			],
			'filter' => [
				'SITE_ID' => $siteId
			]
		]);
		while ($row = $res->fetch())
		{
			parent::delete($row['ID']);
		}
	}

	/**
	 * Changes SITE_ID for folder, all sub folders, all sub landings.
	 * @param int $folderId Folder id.
	 * @param int $newSiteId New folder site id.
	 * @return void
	 */
	public static function changeSiteIdRecursive(int $folderId, int $newSiteId)
	{
		// move sub folders
		$res = self::getList([
			'select' => [
				'ID'
			],
			'filter' => [
				'PARENT_ID' => $folderId
			]
		]);
		while ($row = $res->fetch())
		{
			$resAffected = self::update($row['ID'], [
				'SITE_ID' => $newSiteId
			]);
			if ($resAffected->isSuccess())
			{
				self::changeSiteIdRecursive($row['ID'], $newSiteId);
			}
		}

		// move sub landings
		$res = Landing::getList([
			'select' => [
				'ID'
			],
			'filter' => [
				'FOLDER_ID' => $folderId
			]
		]);
		while ($row = $res->fetch())
		{
			Landing::update($row['ID'], [
				'SITE_ID' => $newSiteId
			]);
		}

	}

	/**
	 * Recursively collects all subfolder ids for specific folder.
	 *
	 * @param int $folderId Folder id.
	 * @return array
	 */
	public static function getSubFolderIds(int $folderId): array
	{
		$ids = [];

		$res = self::getList([
			'select' => ['ID'],
			'filter' => [
				'PARENT_ID' => $folderId,
			],
		]);
		while ($row = $res->fetch())
		{
			array_push($ids, $row['ID'], ...self::getSubFolderIds($row['ID']));
		}

		return $ids;
	}

	/**
	 * Returns site's folders id.
	 * @param int $siteId Site id.
	 * @param array $additionalFilter Optional additional filter.
	 * @return array
	 */
	public static function getFolderIdsForSite(int $siteId, array $additionalFilter = []): array
	{
		$return = [];
		$additionalFilter['SITE_ID'] = $siteId;

		$res = self::getList([
			'select' => [
				'ID'
			],
			'filter' => $additionalFilter
		]);
		while ($row = $res->fetch())
		{
			$return[] = $row['ID'];
		}

		return $return;
	}

	/**
	 * Returns breadcrumbs for folder of site.
	 * @param int $folderId Folder id.
	 * @param int|null $siteId Site id (optional, but desirable for optimisation).
	 * @return array
	 */
	public static function getBreadCrumbs(int $folderId, ?int $siteId = null): array
	{
		static $cacheFolders = [];
		$crumbs = [];

		if (!$siteId)
		{
			$res = self::getList([
				'select' => [
					'SITE_ID'
				],
				'filter' => [
					'ID' => $folderId
				],
				'limit' => 1
			]);
			if ($row = $res->fetch())
			{
				$siteId = $row['SITE_ID'];
			}
		}

		if (!$siteId)
		{
			return $crumbs;
		}

		// get all folder's chunks for the site
		if (!array_key_exists($siteId, $cacheFolders))
		{
			$cacheFolders[$siteId] = [];
			$res = self::getList([
				'select' => [
					'ID', 'TITLE', 'INDEX_ID', 'CODE',
					'PARENT_ID', 'ACTIVE', 'DELETED'
				],
				'filter' => [
					'SITE_ID' => $siteId
				]
			]);
			while ($row = $res->fetch())
			{
				$cacheFolders[$siteId][$row['ID']] = $row;
			}
		}

		if (!$cacheFolders[$siteId])
		{
			return $crumbs;
		}

		// build recursively
		$folders = $cacheFolders[$siteId];
		do
		{
			if (!isset($folders[$folderId]))
			{
				break;
			}
			$crumbs[] = $folders[$folderId];
			$folderId = $folders[$folderId]['PARENT_ID'];
		}
		while ($folderId);

		return array_reverse($crumbs);
	}

	/**
	 * Returns breadcrumbs for folder of site as string.
	 * @param int $folderId Folder id.
	 * @param string $glue Glue for implode breadcrumbs.
	 * @param int|null $siteId Site id (optional, but desirable for optimisation).
	 * @return string
	 */
	public static function getBreadCrumbsString(int $folderId, string $glue, ?int $siteId = null): string
	{
		$path = [];
		$crumbs = self::getBreadCrumbs($folderId, $siteId);
		foreach ($crumbs as $crumb)
		{
			$path[] = $crumb['TITLE'];
		}
		return implode($glue, $path);
	}

	/**
	 * Returns folder's full path with parents folders.
	 * @param int $folderId Folder id.
	 * @param int|null $siteId Site id (optional, but desirable for optimisation).
	 * @param array &$lastFolder Last folder item.
	 * @return string
	 */
	public static function getFullPath(int $folderId, ?int $siteId = null, array &$lastFolder = []): string
	{
		$codes = [];

		foreach (self::getBreadCrumbs($folderId, $siteId) as $folder)
		{
			$lastFolder = $folder;
			$codes[] = $folder['CODE'];
		}

		return '/' . implode('/', $codes) . '/';
	}
}