%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/components/bitrix/main.interface.buttons/ |
Current File : //home/bitrix/www/bitrix/components/bitrix/main.interface.buttons/class.php |
<? use Bitrix\Main\Localization\Loc; use Bitrix\Main\Text; if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); Loc::loadMessages(__FILE__); class CMainInterfaceButtons extends CBitrixComponent { /** * 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 = array(); /** * More item class * @var string */ protected $defaultMoreItemClass = "main-buttons-item-more-default"; /** * Checks required component params * @return boolean */ protected function checkRequiredParams() { $result = true; if (empty($this->arParams["ID"])) { ShowError(Loc::getMessage("MIB_ID_NOT_SET")); $result = false; } if (!is_array($this->arParams["ITEMS"]) || empty($this->arParams["ITEMS"])) { //ShowError(Loc::getMessage("MIB_ITEMS_NOT_FOUND")); $result = false; } return $result; } 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["ID"] = $this->prepareContainerId($this->arParams["ID"]); $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"]); $this->arParams["DISABLE_SETTINGS"] = $this->prepareDisableSettings($this->arParams["DISABLE_SETTINGS"]); return $this; } protected function prepareDisableSettings($settings = false) { return is_bool($settings) ? $settings : false; } /** * 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 = strtolower($id); return $id; } /** * Prepares user options * @param array $userOptions * @return array User options */ protected function prepareUserOptions($userOptions) { $userOptionsSettings = array(); if (is_array($userOptions) && isset($userOptions[$this->userOptionsKey]) && !empty($userOptions[$this->userOptionsKey])) { $userOptionsSettings = json_decode($userOptions[$this->userOptionsKey], true); } return $userOptionsSettings; } /** * Prepares settings */ protected function prepareSettings() { $userOptionsRaw = $this->getUserOptions(); $settings = $this->prepareUserOptions($userOptionsRaw); $this->settings = $settings; } /** * 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 = 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); 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->checkRequiredParams()) { if ($this->filterItems()) { $this->prepareSettings(); $this->prepareParams(); $this->prepareResult(); $this->setStyles(); $this->includeComponentTemplate(); } } } }