403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/components/bitrix/landing.blocks.mp_widget.bp/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/components/bitrix/landing.blocks.mp_widget.bp/class.php
<?php

use Bitrix\Landing\Mainpage;
use Bitrix\Iblock\ElementTable;
use Bitrix\Lists\Api\Request\ServiceFactory\GetAverageIBlockTemplateDurationRequest;
use Bitrix\Lists\Api\Service\ServiceFactory\ServiceFactory;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

CBitrixComponent::includeComponentClass('bitrix:landing.blocks.mp_widget.base');

class LandingBlocksMainpageWidgetBP extends LandingBlocksMainpageWidgetBase
{
	private const BP_AMOUNT = 15;

	private const WIDGET_CSS_VAR_PROPERTIES = [
		'COLOR_BG' => '--widget-color-bg',
		'COLOR_BG_BUTTON' => '--widget-color-bg-button',
		'COLOR_BG_BUTTON_V2' => '--widget-bp-v2-color-bg-button',
		'COLOR_BUTTON_TEXT' => '--widget-color-bg-button-text',
		'COLOR_BUTTON_TEXT_V2' => '--widget-bp-v2-color-bg-button-text',
	];

	/**
	 * The main executable method of the component.
	 * Initializes parameters and obtains data to display.
	 * @return void
	 */
	public function executeComponent(): void
	{
		$this->checkParam('COLOR_HEADERS', 'var(--primary)');
		$this->checkParam('COLOR_BG', '#f3fbfe');
		$this->checkParam('COLOR_BUTTON', '#bdc1c6');

		foreach (self::WIDGET_CSS_VAR_PROPERTIES as $property => $cssVar)
		{
			$this->addCssVarProperty($property, $cssVar);
		}

		$this->getData();

		parent::executeComponent();
	}

	/**
	 * Gets the data to display in the widget.
	 * Determines whether to use demo data or real data.
	 * @return void
	 */
	protected function getData(): void
	{
		$this->arResult['SHOW_EMPTY_STATE'] = false;
		if (Mainpage\Manager::isUseDemoData())
		{
			$data = $this->getDemoData();
		}
		else
		{
			$data = $this->getRealData();
			if (count($data) === 0)
			{
				$this->arResult['SHOW_EMPTY_STATE'] = true;
			}
		}

		$this->arResult['BUSINESS_PROCESSES'] = $data;
		$sort = $this->arParams['SORT'] ?? null;

		if (isset($sort))
		{
			$sortedProcesses = $this->sortBusinessProcesses($data, $sort);
		}
		else
		{
			$sortedProcesses = $this->sortBusinessProcesses($data);
		}
		$this->arResult['BUSINESS_PROCESSES'] = array_slice($sortedProcesses, 0, self::BP_AMOUNT);

		$this->checkParam('TITLE', Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_TITLE'));
		$this->checkParam('BUTTON', Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_BUTTON'));
		$this->arResult['TITLE'] = $this->arParams['TITLE'];
		$this->arResult['BUTTON'] = $this->arParams['BUTTON'];
		$this->arResult['SUBTITLE'] = Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_TEXT');
		$this->arResult['SUBTITLE_SHORT'] = Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_TEXT_SHORT');

		$this->arResult['PHRASES'] = [];
		$this->arResult['PHRASES']['NAVIGATOR_BUTTON'] = $this->getNavigatorButtonPhrases();
		if (count($this->arResult['BUSINESS_PROCESSES']) > 5)
		{
			$this->arResult['IS_SHOW_EXTEND_BUTTON'] = true;
		}
		else
		{
			$this->arResult['IS_SHOW_EXTEND_BUTTON'] = false;
		}
	}

	/**
	 * Returns demo data for the widget.
	 * @return array Array with demo data.
	 */
	protected function getDemoData(): array
	{
		$averageTime = [3600, 7200, 86400, 172800, 259800];

		return [
			[
				'NAME' => Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_DEMO_DATA_NAME_1'),
				'COUNT' => '142',
				'AVERAGE_TIME' => $averageTime[0],
				'AVERAGE_TEXT' => $this->getPhraseWithDays($this->secondsToDays($averageTime[0])),
			],
			[
				'NAME' => Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_DEMO_DATA_NAME_2'),
				'COUNT' => '87',
				'AVERAGE_TIME' => $averageTime[1],
				'AVERAGE_TEXT' => $this->getPhraseWithDays($this->secondsToDays($averageTime[1])),
			],
			[
				'NAME' => Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_DEMO_DATA_NAME_3'),
				'COUNT' => '55',
				'AVERAGE_TIME' => $averageTime[2],
				'AVERAGE_TEXT' => $this->getPhraseWithDays($this->secondsToDays($averageTime[2])),
			],
			[
				'NAME' => Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_DEMO_DATA_NAME_4'),
				'COUNT' => '29',
				'AVERAGE_TIME' => $averageTime[3],
				'AVERAGE_TEXT' => $this->getPhraseWithDays($this->secondsToDays($averageTime[3])),
			],
			[
				'NAME' => Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_DEMO_DATA_NAME_5'),
				'COUNT' => '40',
				'AVERAGE_TIME' => $averageTime[4],
				'AVERAGE_TEXT' => $this->getPhraseWithDays($this->secondsToDays($averageTime[4])),
			],
		];
	}

	/**
	 * Returns real data about business processes.
	 * @return array An array with data about business processes.
	 * @throws \Bitrix\Iblock\ElementTable::getCount
	 */
	protected function getRealData(): array
	{
		global $USER;

		$businessProcessesData = [];
		if (Loader::includeModule('lists'))
		{
			$iBlockTypeId = Option::get('lists', 'livefeed_iblock_type_id', 'bitrix_processes');
			$currentUserId = (int)$USER->GetID();
			$service = ServiceFactory::getServiceByIBlockTypeId($iBlockTypeId, $currentUserId);
			if ($service)
			{
				$sefFolder = '/bitrix/components/bitrix/lists.element.creation_guide/?iBlockTypeId=bitrix_processes&iBlockId=';
				$checkPermissionResult = $service->checkIBlockTypePermission();
				$lists_perm = $checkPermissionResult->getPermission();
				if ($lists_perm > CListPermissions::ACCESS_DENIED && $checkPermissionResult->isSuccess())
				{
					$getCatalogResult = $service->getCatalog();
					if ($getCatalogResult->isSuccess())
					{
						$catalog = $getCatalogResult->getCatalog();
						foreach ($catalog as $iBlock)
						{
							$businessProcess = [];
							$businessProcess['ID'] = $iBlock['ID'];
							$businessProcess['NAME'] = $iBlock['NAME'];
							$businessProcess['URL'] = $sefFolder . $iBlock['ID'];
							$businessProcess['IS_SHOW_LIVE_FEED'] = CLists::getLiveFeed($iBlock['ID']);
							$businessProcess['AVERAGE_TIME'] = null;
							if (Loader::includeModule('bizproc'))
							{
								$averageTimeResult = $service->getAverageIBlockTemplateDuration(
									new GetAverageIBlockTemplateDurationRequest(
										$iBlock['ID'], CBPDocumentEventType::Create, false,
									)
								);
								if ($averageTimeResult->isSuccess())
								{
									$seconds = $averageTimeResult->getAverageDuration();
									$daysAmount = 0;
									if ($seconds > 0)
									{
										$daysAmount = $this->secondsToDays($seconds);
									}
									$businessProcess['AVERAGE_TEXT'] = $this->getPhraseWithDays($daysAmount);
								}
								else
								{
									$businessProcess['AVERAGE_TEXT'] = $this->getPhraseWithDays(0);
								}
							}
							$businessProcess['COUNT'] = ElementTable::getCount(
								CIBlockElement::getPublicElementsOrmFilter(['IBLOCK_ID' => $iBlock['ID']])
							);
							$businessProcessesData[] = $businessProcess;
						}
					}
				}
			}
		}

		return $businessProcessesData;
	}

	/**
	 * Sorts business processes in accordance with the specified criterion.
	 *
	 * @param array $data Array of business process data to sort.
	 * @param string $sort Sorting criterion.
	 *
	 * @return array Sorted array of data about business processes.
	 */
	protected function sortBusinessProcesses(array $data, string $sort = 'popularHighToLow'): array
	{
		$count = array_map(function($item) {
			return $item['COUNT'] ?? 0;
		}, $data);

		if (count($count) === count($data))
		{
			switch ($sort)
			{
				case 'popularHighToLow':
					array_multisort($count, SORT_ASC, $data);
					break;
				case 'popularLowToHigh':
					array_multisort($count, SORT_DESC, $data);
					break;
			}
		}

		return $data;
	}

	/**
	 * Converts seconds to days.
	 *
	 * @param int $seconds Number of seconds.
	 *
	 * @return int Number of days.
	 */
	protected function secondsToDays(int $seconds): int
	{
		return ceil($seconds / (60 * 60 * 24));
	}

	/**
	 * Returns a phrase with the number of days.
	 *
	 * @param int $days Number of days.
	 *
	 * @return string A phrase with the number of days.
	 */
	protected function getPhraseWithDays(int $days): string
	{
		if ($days === 0)
		{
			$phrase = Loc::getMessage('CLASS_BLOCK_MP_WIDGET_BP_DAYS_ERROR');
		}
		else
		{
			$phrase = Loc::getMessagePlural('CLASS_BLOCK_MP_WIDGET_BP_DAYS', $days, [
				'#DAYS#' => $days,
			]);
		}

		return $phrase;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit