• Почему со временем windows начинает проседать по производительности в играх?

    @VladOnOff
    Проблемы с кэшем начались после win10 1607 и не хотят исправлять. Ставь https://www.wagnardsoft.com/forums/viewtopic.php?f...

    https://i.imgur.com/T1Xx8qE.png

    Также попробуй отключить сжатие памяти
    https://superuser.com/questions/1000485/how-to-dis...
    Ответ написан
    1 комментарий
  • Почему не работает команда "dump()"?

    похоже что вы что то забыли.
    В старой версии ядра есть функция mydump - документация
    В новой версии ядра D7 появился аналог данной функции dump
    D7 использует ООП, соответственно вам нужно либо подключить namespace \Bitrix\Main\Diag\Debug
    use \Bitrix\Main\Diag\Debug;
    либо вызывать \Bitrix\Main\Diag\Debug::dump()

    Так же может пригодится полезная статейка про отладку
    Ответ написан
    Комментировать
  • Как вывести значения свойства типа "справочник"?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если предположить, что Вы в инфоблоке добавили новое свойство и добавили ему тип Справочник, то думаю это для Вас)

    Я создал тестовое свойство (TEST) - привязка к справочнику и у стандартного компонента news.detail захотел вывести картинку. Для того чтобы его получить я написал небольшой (неоптимальный) фрагмент кода в result_modifier.php.
    В результате работы в свойства появляется ключ EXTRA_VALUE, в котором уже содержатся необходимые описания каждого элемента (в том числе и картинка), а его обрабатывать и выводить уже нужно в шаблоне (template.php) компонента
    use \Bitrix\Main\Loader;
    use \Bitrix\Highloadblock as HL;
    
    /**
     * @var array Массив описывающий свойство типа справочник 
     */
    $arHighloadProperty = $arResult["PROPERTIES"]['TEST'];
    
    /**
     * @var string название таблицы справочника
     */
    $sTableName = $arHighloadProperty['USER_TYPE_SETTINGS']['TABLE_NAME'];
    
    /**
     * Работаем только при условии, что
     *    - модуль highloadblock подключен
     *    - в описании присутствует таблица
     *    - есть заполненные значения 
     */
    if ( Loader::IncludeModule('highloadblock') && !empty($sTableName) && !empty($arHighloadProperty["VALUE"]) )
    {
    	/**
    	 * @var array Описание Highload-блока
    	 */
    	$hlblock = HL\HighloadBlockTable::getRow([
    		'filter' => [
    			'=TABLE_NAME' => $sTableName
    		],
    	]);
    
    	if ( $hlblock )
    	{
    		/**
    		 * Магия highload-блоков компилируем сущность, чтобы мы смогли с ней работать
    		 * 
    		 */
    		$entity      = HL\HighloadBlockTable::compileEntity( $hlblock );
    		$entityClass = $entity->getDataClass();
    		
    		$arRecords = $entityClass::getList([
    			'filter' => [
    				'UF_XML_ID' => $arHighloadProperty["VALUE"]
    			],
    		]);
    		foreach ($arRecords as $record)
    		{	
    			/**
    			 * Тут любые преобразования с записью, полученной из таблицы.
    			 * Я транслировал почти все напрямую. 
    			 * 
    			 * Нужно помнить, что например в UF_FILE возвращается ID файла,
    			 * а не полный массив описывающий файл
    			 */
    			$arRecord = [
    				'ID'                  => $record['ID'],
    				'UF_NAME'             => $record['UF_NAME'],
    				'UF_SORT'             => $record['UF_SORT'],
    				'UF_XML_ID'           => $record['UF_XML_ID'],
    				'UF_LINK'             => $record['UF_LINK'],
    				'UF_DESCRIPTION'      => $record['UF_DESCRIPTION'],
    				'UF_FULL_DESCRIPTION' => $record['UF_FULL_DESCRIPTION'],
    				'UF_DEF'              => $record['UF_DEF'],
    				'UF_FILE'             => [],
    				'~UF_FILE'            => $record['UF_FILE'],
    			];
    
    			/**
    			 * Не очень быстрое решение - сколько записей в инфоблоке, столько файлов и получим
    			 * Хорошо было бы вынести под код и там за 1 запрос все получить, а не плодить
    			 * по дополнительному запросу на каждый файл
    			 */
    			if ( !empty($arRecord['~UF_FILE']) )
    			{
    				$arRecord['UF_FILE'] = \CFile::getById($arRecord['~UF_FILE'])->fetch();
    			}
    
    			$arHighloadProperty['EXTRA_VALUE'][] = $arRecord;
    		}
    	}
    }
    Ответ написан
  • Как создать кастомное действие с привязкой к элементу?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Впринципе не сложно.

    Для начала Вы подписываетесь на событие OnAdminListDisplay модуля Main.
    Именно оно отвечает за действие ДО вывода любого списка элементов в административной панели (за исключением под-листов у инфоблоков и модуля производительности).
    На вход оно принимает лишь 1 параметр - экзепляр класса CAdminList (см. /bitrix/modules/main/interface/admin_list.php)

    Чтобы обрабатывать нужную таблицу, нужно ограничить выборку. Т.е. Ваш обработчик будет выглядеть как-то так:

    <?php
    AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
    function MyOnAdminContextMenuShow(&$oAdminList)
    {
        /**
         * $type - тип кода инфоблока, например news, events и т.д.
         * $iblock - идентификатор инфоблока
         * 
         * Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
         */
        if ( $oAdminList->table_id == "tbl_iblock_list_".md5($type.".".$iblock) )
        {
            // полезные действия
        }
    }
    ?>


    Собственно так, мы получаем возможность работать с выводом.
    Для более подробного пояснения лучше прочитать про заказные элементы в административной панели в документации: https://dev.1c-bitrix.ru/api_help/main/general/adm...

    Собственно добавим нужные нам данные для работы. Предположим, я хочу логгировать выделенные элементы на странице, тогда мой код будет выглядеть так:
    AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
    function MyOnAdminContextMenuShow(&$oAdminList)
    {
        /**
         * $type - тип кода инфоблока, например news, events и т.д.
         * $iblock - идентификатор инфоблока
         * 
         * Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
         */
        if ( $oAdminList->table_id == "tbl_iblock_list_".md5("structure.4") )
        {
        	$arActions = $oAdminList->arActions;
    
        	$arActions['alert'] = 'Ругаться!';
    
        	$oAdminList->AddGroupActionTable($arActions);
        }
    }
    
    AddEventHandler("main", "OnAfterEpilog", "iblockAlert");
    
    function iblockAlert()
    {
    	$oRequest = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
    
    	// Проверяем, что работает только в админке
    	if ( $oRequest->isAdminSection() )
    	{
    		if (
    			// Интересуют только интерактивные запросы
    			$oRequest->get('mode')=='frame'
    			// Где передана переменна IBLOCK_ID
    			&& $oRequest->get('IBLOCK_ID')==4
    			// Соответствующие нашему action
    			&& $oRequest->get('action')=='alert'
    			)
    		{
    			/**
    			 * Вот тут можно сделать что угодно
    			 * Можно получить выделенные ID
    			 * через $oRequest->get('ID')
    			 * Если он пуст, значит действие на всех элементах инфоблока
    			 */
    		}
    	}
    }


    На самом деле параметров гораздо больше - есть еще custom области, которые можно выводить, но суть та же. Если захотите добавить свое поле (я добавлял простой action), то лучше глянуть в исходники и там уже по аналогии разрбраться
    Ответ написан
    3 комментария