• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/lib/update/themepickergroup.php
  • Класс: BitrixIntranetUpdateThemePickerGroup
  • Вызов: ThemePickerGroup::execute
public function execute(array &$result): bool
{
	if (!(
		Loader::includeModule('intranet')
		&& Loader::includeModule('socialnetwork')
		&& Option::get('intranet', 'needAssignWorkgroupTheme', 'Y') === 'Y'
	))
	{
		return false;
	}

	/* BitrixIntranetUpdateThemePickerConvert hasn't completed yet */
	if (Option::get('intranet', 'needConvertThemePicker', 'Y') !== 'N')
	{
		return true;
	}

	$return = false;

	$params = Option::get('intranet', 'themepickerworkgroupassign', '');
	$params = ($params !== '' ? @unserialize($params, [ 'allowed_classes' => false ]) : []);
	$params = (is_array($params) ? $params : []);

	if (empty($params))
	{
		$params = [
			'lastId' => 0,
			'number' => 0,
			'count' => $this->getCount(),
		];
	}

	if ($params['count'] > 0)
	{
		$result['title'] = '';
		$result['progress'] = 1;
		$result['steps'] = '';
		$result['count'] = $params['count'];

		$found = false;

		$sitesList = $this->getSites();
		$themesList = $this->getPatternThemes();

		if (
			!empty($sitesList)
			&& !empty($themesList)
		)
		{
			$query = new Query(WorkgroupTable::getEntity());
			$query->registerRuntimeField(
				'',
				new ReferenceField('WGS',
					WorkgroupSiteTable::getEntity(),
					[
						'=ref.GROUP_ID' => 'this.ID',
					],
					[ 'join_type' => 'INNER' ]
				)
			);
			$query->addFilter('@WGS.SITE_ID', $sitesList);
			$query->addFilter('>ID', (int)$params['lastId']);
			$query->addOrder('ID');
			$query->addGroup('ID');
			$query->addSelect('ID');
			$query->setLimit($this->limit);

			$res = $query->exec();

			while ($workgroupRecord = $res->fetch())
			{
				$themeId = $themesList[array_rand($themesList)];

				$resSites = WorkgroupSiteTable::getList([
					'filter' => [
						'GROUP_ID' => (int)$workgroupRecord['ID']
					],
					'select' => [ 'SITE_ID' ]
				]);
				while($workgroupSiteRecord = $resSites->fetch())
				{
					$context = 'bitrix24_' . $workgroupSiteRecord['SITE_ID'];

					$themeRes = ThemeTable::getList([
						'filter' => [
							'=ENTITY_TYPE' => ThemePicker::ENTITY_TYPE_SONET_GROUP,
							'ENTITY_ID' => (int)$workgroupRecord['ID'],
							'=CONTEXT' => $context
						]
					]);
					if ($themeRes->fetch())
					{
						continue;
					}

					ThemeTable::set([
						'THEME_ID' => $themeId,
						'USER_ID' => 0,
						'ENTITY_TYPE' => ThemePicker::ENTITY_TYPE_SONET_GROUP,
						'ENTITY_ID' => (int)$workgroupRecord['ID'],
						'CONTEXT' => $context,
					]);

				}

				$found = true;
				$params['lastId'] = $workgroupRecord['ID'];
				$params['number']++;
			}
		}

		if ($found)
		{
			Option::set('intranet', 'themepickerworkgroupassign', serialize($params));
			$return = true;
		}

		$result['progress'] = (int)($params['number'] * (int)$this->limit / $params['count']);
		$result['steps'] = $params['number'];

		if ($found === false)
		{
			Option::delete('intranet', [ 'name' => 'themepickerworkgroupassign' ]);
			Option::set('intranet', 'needAssignWorkgroupTheme', 'N');
		}
	}

	return $return;
}