Задать вопрос
  • Как объединить три массива?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Как вариант, еще один:

    /**
     * Prepare array for our job
     */
    $arrayOne = [
    	0 => 80,
    	1 => 80,
    	2 => 90,
    ];
    
    $arrayTwo = [
    	0 => [
    		0 => 190,
    		1 => 195,
    	],
    	1 => [
    		0 => 200,
    	],
    	2 => [
    		0 => 190,
    		1 => 195,
    	],
    ];
    
    $arrayThree = [
    	0 => 1,
    	1 => 2,
    	2 => 3,
    ];
    
    /**
     * @var array Array with actual data in our structure
     */
    $arResult = [];
    
    foreach ( $arrayTwo as $iKeyOne => $arrayTwoElement )
    {
    	// if in second array exist unknown key
    	if ( !array_key_exists($iKeyOne, $arrayOne) )
    	{
    		continue;
    	}
    
    	// if in third array exist unknown key
    	if ( !array_key_exists($iKeyOne, $arrayThree) )
    	{
    		continue;
    	}
    
    	// if in second array no elements
    	if ( empty($arrayTwoElement) || !is_array($arrayTwoElement) )
    	{
    		continue;
    	}
    
    	/* @var integer Key for first depth level  */
    	$iLevelKey = (int) $arrayOne[ $iKeyOne ];
    
    	/* @var integer Value for second depth level */
    	$iLevelValue = (int) $arrayThree[ $iKeyOne ];
    
    	foreach ($arrayTwoElement as $k => $v)
    	{
    		$arResult[ $iLevelKey ][ $v ] = $iLevelValue;
    	}
    }
    
    var_dump($arResult);
    /*
    Will display:
    array(2) {
      [80]=>
      array(3) {
        [190]=> int(1)
        [195]=> int(1)
        [200]=> int(2)
      }
      [90]=>
      array(2) {
        [190]=> int(3)
        [195]=> int(3)
      }
    }
    */
    Ответ написан
    Комментировать
  • Как реализовать SSO (единый вход) на Laravel?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Есть такая штука, называется ADFS - на Windows Server поднимается соответствующая роль и открывается OpenID / OAuth авторизация.

    Ну а дальше, по принципам что и соц.сети :)
    Ответ написан
    Комментировать
  • Как сделать поиск по свойствам раздела (UF) типа "Файл"?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Из коробки Ваша задача не решается - в поисковой индекс попадают только определенные поля самого элемента (например текст анонса, текст полной новости) и значения(!) пользовательских полей.
    Для поля типа файл, значение пользовательского поля не название, а содержимое (и то, если соответствующий дескриптор для открытия файла найден).

    Но Вашу задачу можно решить технически:

    1) На событиях перед добавлением/изменением элемента инфоблока в SEARCH_CONTENT можно дописывать название файла
    2) Затем подписаться на события индексации и добавлять соответствующие значения в поиск.
    Как пример, можно ознакомиться с https://dev.1c-bitrix.ru/community/blogs/oracle/26...

    Еще например, можно разработать отдельную страницу для более оптимального поиска (на последней конференции Вадим Думбравану чуть больше часа рассказывал про полнотекстовый поиск в своих разработках)
    Ответ написан
    Комментировать
  • Не сохраняются изменения в SEO bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Что делать?

    Пересматривать ЧПУ и структуру разделов. Как вариант - задать везде нужные уровни, т.е. взять вышестоящую маску и у всех дочерних разделов следующего уровня проставить их в соответствии маске.

    Во вкладке SEO, когда меняю пункты META и оставляю галочку на "Изменить для этого раздела и его подразделов", то изменения сохраняются, но они еще сохраняются в подразделов. Мне этого не надо, потому что у каждого подраздела будут свои МЕТА пункты.

    По-умолчанию, SEO-элементы наследуются от родителя.
    Т.е. если у вас структура - 1 - 2 - 3 и вы задали ее у 1, то у 2 и 3 она будет одинаковая, как и у первого уровня.
    Если затем Вы изменили значение для пункта 2, то и у 3 пункт изменится на значение 2.
    Ответ написан
    Комментировать
  • Как правильно создать фасетный велосипед?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ваше решение вполне имеет место быть, а грабли будут те же самые, что и в Битриксе - перестроение кеша.
    Например у Вас добавилось поле, а это значит, что Вам нужно перестраивать кеш (т.е. удалять и заново строить), а на работающем сайте это занимает прилично времени.
    К тому же, для ускорения Вам придется либо исключить некоторые поля, либо дублировать записи из множественных списков, но с этим частично может помочь разгрузка базы.

    На ум приходят две мысли:
    - при mysql 5.7+ можно проверить как поведет себя json поля (чтобы не пересобирать каждый раз схему, а просто переписывать значения)
    - попробовать вынести куда-нибудь на mongodb это решение (дописывать поля там, не пересобирая).

    Но в целом, Ваш вариант вполне подходит (за исключением того, что вариант с перестроением кеша нужно все-таки проработать).
    Ответ написан
    Комментировать
  • Как применить функцию по изменению товара перед тем как положить его в корзину?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Можно и не использовать эту функцию.
    До 15.5.0 (на старом каталоге), есть события добавления - OnBeforeBasketAdd или OnBasketAdd
    После 15.5.0 (на новом каталоге), есть события добавления/изменения - OnSaleBasketItemEntitySaved

    Как работают события, описано в документации
    Ответ написан
    Комментировать
  • Почему падает MySQL во время установки Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Все верно - это не ошибка Битрикса, а ошибка сервера.

    Получить "ERROR 1030 (HY000) at line 18723: Got error 168 from storage engine", можно несколькими способами.
    Наиболее распространенные:
    1) Нехватает места на хостинге (Хостинг жадный и дал Вам всего 2ГБ на Битрикс, а рекомендуется для чистой установки не меньше 10ГБ)
    2) Вы уперлись в количество одновременно открытых файлов.

    В любом случае, точную ошибку может дать только log СУБД.
    Ответ написан
    4 комментария
  • Почему не работает return?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ну так все правильно!
    Вы же получаете результат для своей строки на второй итерации, а return на первой не работает.
    Заменяем:
    encrypt($text, $m);
    На
    return encrypt($text, $m);

    И видим результат: s eT ashi tist!
    Можно конечно еще и функцию упростить:
    function encrypt($text, $n)
    {
    	if ( $n < 1 )
    	{
    		return $text;
    	}
    	$str1 = $str2 = "";
    	for($i = 0, $len = strlen($text); $i < $len; $i++)
    	{
    		if ( $i%2 == 0 )
    		{
    			$str2 .= $text[$i];
    		}
    		else
    		{
    			$str1 .= $text[$i];
    		}
    	}
    
    	return encrypt( $str1.$str2, ($n-1));
    }
      
    echo encrypt('This is a test!', 2);
    Ответ написан
    Комментировать
  • Битрикс состав заказа, версия 15.0?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Допустимые методы изменения формы заказа появились с версии 16.0.33.
    Без обновления платформы, все что вы сотворите с карточкой заказа пропадет.
    Ответ написан
    Комментировать
  • Как вывести из свойств "должность" и "компанию"?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Изучайте параметры компонента bitrix:news.
    Обратите внимание на LIST_PROPERTY_CODE.
    В шаблоне компонента посмотрите на $arResult
    Ответ написан
  • Почему может не работать SEF в компоненте "bitrix:news"?

    gromdron
    @gromdron
    Работаю с Bitrix24
    "PATH" => "/page/index.php/",


    "PATH" => "/page/index.php",

    А вообще - откройте в визуальном редакторе настройки компонента и просто сохраните (сохранив страницу). Он сам откорректирует правила в urlrewrite
    Ответ написан
    2 комментария
  • Как усовершенствовать функцию?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А что Вы в ней хотите усовершенствовать?
    Ну например можно добавить typehint array у $requestTags и избавиться от проверки:

    public static function getTags(array $requestTags): array
    {
        $tags = [];
    
        foreach ($requestTags as $tag) {
            if (is_numeric($tag)) {
                $tags[] = $tag;
            } else {
                $newTag = Tag::upsert(['name' => $tag]);
                $tags[] = $newTag->id;
            }
        }
    
        return $tags;
    }


    Либо можно вынести в отдельную функицю сохранение тегов, например:

    function mapTags( array &$value )
    {
        if ( is_numeric($value) )
        {
            return $value;
        }
    
        $newTag = Tag::upsert(['name' => $tag]);
        return $newTag->id;
    }


    И тогда весь код метода свернется в:

    public static function getTags( array $requestTags ): array
    {
        return array_map('mapTags', $requestTags);
    }


    Можно просто уменьшить вложенность оставив скрипт (меньше уровней будет):

    public static function getTags($requestTags): array
    {
        $tags = [];
    
        if ( !$requestTags )
        {
            return $tags;
        }
    
        foreach ($requestTags as $tag) {
            if (is_numeric($tag)) {
                $tags[] = $tag;
            } else {
                $newTag = Tag::upsert(['name' => $tag]);
                $tags[] = $newTag->id;
            }
        }
    
        return $tags;
    }


    Если это очень частовыполняемая операция, то можно сэкономить на запросах:

    public static function getTags(array $requestTags): array
    {
        if ( empty($requestTags) )
        {
            return $requestTags;
        }
    
        $existedTags = array_filter($requestTags, 'is_numeric');
        $newTags = array_diff($requestTags, $existedTags);
    
        /**
         * Тут единый batch-метод который отправляет 
         * 1 запрос на все теги сразу.
         * В results - массив Tag, обработанных batch-методом
         */
        foreach ($results as $tag)
        {
            $existedTags[] = $tag->id;
        }
    
        return array_unique($existedTags);
    }
    Ответ написан
    1 комментарий
  • Какую посоветуете CRM для call центра?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Хотел бы я что-то дельное посоветовать)
    На самом деле могу лишь сказать, что Битрикс24 из коробки для этих целей не подойдет.
    Вернее как, он может закрыть все интересующие Вас вопросы, но в каких-то местах нужно будет допиливать.
    Давайте по косточкам, теперь почему:

    при входящем звонке показ истории звонков и заявок с этого номера

    Битрикс не показывает всю историю - только данные звонящего.
    То есть придется дорабатывать специальную карточку или вывод истории звонков.

    Поиск заявок по адресу
    отслеживания статуса заявок
    переадресация заявок на ответственных лиц

    Битрикс не оперирует адресами, соответственно придется изворачиваться и на "сделках" пытаться реализовать инциденты и заявки.
    Но если все же принять что "Сделка" = Заявка, то с отслеживанием статусов, переадресацией и поиском проблем не будет

    Ну... чем смог :)
    Ответ написан
    2 комментария
  • Битрикс - как Реализовать возможность администратору сайта указывать текст в блоке ПОЛЕЗНАЯ ИНФОРМАЦИЯ без необходимости редактироваться исходный код?

    gromdron
    @gromdron
    Работаю с Bitrix24
    ОМГ!
    Вы же читать умеете?? Давайте порассуждаем о задании и прочитаем его.
    • Задание решить с помощью включаемых областей.

    Значит нужно использовать компонент bitrix:main.include и никак иначе.
    Возможно придется писать дополнительный код.
    • Реализовать возможность администратору сайта указывать текст в блоке Полезная информация без необходимости редактироваться исходный код.

    Окей, значит дополнительного кода писать не нужно, а значит все можно решить компонентом bitrix:main.include + шаблон
    • Должна быть возможность указывать разный текст для разных разделов сайта.

    Разделов? Ага, значит смотрим параметры компонента (https://dev.1c-bitrix.ru/user_help/components/sluz...
    AREA_FILE_SHOW: sect
    AREA_FILE_RECURSIVE: Y
    • Верстка, реализующая «каркас» блока, не должна быть в файле, который содержит редактируемый администратором текст. Это позволит минимизировать возможность «поломки» шаблона сайта.

    А раз bitrix:main.include подключает файл в шаблоне компонента, значит нам нужно кастомизировать шаблон компонента, а не тупо его вставить

    Что получается в итоге:
    1) В шаблоне сайта размещаем компонент bitrix:main.include, настраиваем его на работу с разделами
    2) В корне размещаем sect.php файл, в котором пишем "Лучший выбор мебели в нашей компании!", таким образом мы удовлетворили первое решение
    3) В разделе /company/ создаем sect.php файл в котором пишем "Надежный поставщик на все времена."
    4) После создания и размещения в режиме редактирования нажимаем копировать шаблон компонента и вносим изменения:
    - Если файла нет или область пуста (надеюсь на php-вы же сможете это сделать) - не выводить область
    - Если она есть - выводить в шаблоне

    Читайте внимательно документацию! Смотрите видео курсов.
    *Экзамен проверят ВАШИ знания, а не мои*
    Ответ написан
    Комментировать
  • 1C-Битрикс. Как получить название склада по ID склада?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Наверное самый простой способ это подключить модуль Каталога и воспользоваться соответствующим DataMapper:

    use \Bitrix\Catalog;
    
    $arStore = Catalog\StoreTable::getRow([
    	'select' => ['TITLE'],
    	'filter' => [
    		'ID' => $iStoreId,
    	]
    ]);
    if ( $arStore )
    {
    	// В $arStore['TITLE'] название
    }
    else
    {
    	// Склад не найден
    }
    Ответ написан
    4 комментария
  • Как сделать временную ссылку на файл в PHP?

    gromdron
    @gromdron
    Работаю с Bitrix24
    В этом нет ничего сложного или необычного - все уже изобрели до Вас.
    Не виду смысла отвечать подробно ибо эту тему разобрали на хабре по косточкам от и до.

    Читать можно по ссылке: https://habrahabr.ru/post/151795/

    P.S. Скажу за себя - X-Accel-Redirect наше все :)
    Ответ написан
    Комментировать
  • Каким событием (хуком) можно отловить отправку AJAX-формы с сайта на Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Никак.
    То есть Вы не можете отловить отправку всех форм на бек-энде, потому что каждая форма это по факту не единый запрос на какой-то адрес, а обычный POST/GET в iframe на тот же адресс.
    То есть, как это работает:
    1) На JS вы выполняете отправку формы (триггерите данную функцию)
    2) Функция создает невидимый iframe и задает target формы на данный iframe
    3) Этот iframe отправляется, а результат который возвращается из него, заменяется в контейнере формы

    Единственное что вы можете сделать - это на JS: подвесится на все формы на submit событие (стандартный для JS) или на битриксовое onAjaxSuccess (когда форма уже отправлена, а результат получен).
    Можно конечно в init.php ловить все GET/POST запросы, но это уже дикость.

    P.S. Правьте компонент, а не костыли вставляйте
    Ответ написан
    2 комментария
  • Как и куда встроить прослушивание событий в 1С-Битрикс для их обработки и дальнейшей передачи в удаленные сервисы?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Вообще, исчерпывающую информацию на этот вопрос дает официальная документация по файлу init.php.

    Обработчики событий лучше группировать в одном файле и тщательно аннотировать где они используются и какая задача перед ними стоит.


    Про способы организации кода это довольно узкая тематика.
    Если Вы 100% уверены, что они еще пригодятся на других проектах (и у Вас уже есть подобные заказы), то предпочтительнее делать модуль.
    Если это хардкорная интеграция только для существующего проекта, то init.php(*).

    Мы, например, придерживаемся последнего варианта:
    1) В директории /local/php_interface/ создаем следующие файлы:

    - init.php (Содержит подключение других файлов + автолоадер)
    - constants.php (Содержит только константы, актуальные для данного проекта)
    - events.php (содержит подписки на события, но логика их обработки не находится в этом файле)

    2) В директории /local/php_interface/classes/ по PSR размещаем класс для проекта.

    Например:

    init.php:
    /**
     * - /local/classes/{Path|raw}/{*|raw}.php
     * - /local/classes/{Path|ucfirst,lowercase}/{*|ucfirst,lowercase}.php
     */
    spl_autoload_register(function($sClassName)
    {
    
    	$sClassFile = __DIR__.'/classes';
    
    	if ( file_exists($sClassFile.'/'.str_replace('\\', '/', $sClassName).'.php') )
    	{
    		require_once($sClassFile.'/'.str_replace('\\', '/', $sClassName).'.php');
    	}
    
    	$arClass = explode('\\', strtolower($sClassName));
    	foreach($arClass as $sPath )
    	{
    	    $sClassFile .= '/'.ucfirst($sPath);
    	}
    	$sClassFile .= '.php';
    	if (file_exists($sClassFile))
    	{
    		require_once($sClassFile);
    	}
    });
    
    /**
     * File with event handlers
     */
    require_once(__DIR__.'/events.php');


    events.php:
    $eventManager = \Bitrix\Main\EventManager::getInstance();
    
    /**
     * For new core of bitrix use
     *     $eventManager->addEventHandler( #module#, #handler#, [#namespace#, #function#]);
     * 
     * For old core of bitrix use
     *     $eventManager->addEventHandlerCompatible( #module#, #handler#, [#namespace#, #function#]);
     */
    
    $eventManager->addEventHandlerCompatible("module", "event", ['\\Project\\Module\\Event\\Handler', 'onEvent']);
    Ответ написан
    Комментировать
  • Как в битриксе проверить на пустоту ShowMeta('')?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для начала поймите, что в момент вызова ShowMeta у Вас нет данных о том, что они заполнены. То есть проверять там на пустоту НЕЛЬЯ!

    Ознакомьтесь со следующей документацией:
    1) Механизм отложенных функций
    2) Порядок выполнения страницы

    После ознакомления, Вы поймете, что действовать именно так как Вы хотите не получиться. НО!
    Можно написать свою отложенную функцию со свойственной ей поведением и получить желаемый результат.
    Ответ написан
  • Как починить создание бекапов в битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    В один из прекрасных дней перестал делаться бекап битрикса - точней делается бекап только sql -www.site.ru_20180309_051402_full_c8dd87.sql.


    Скорее всего были отредактированы настройки регулярного резервного копирования. Проверьте настройки и способ запуска.

    Проблема номер 2 - не могу зайти в админку. Просто рефрешится страница с логином. Обновлял, сбрасывал кеш, заходил под разными ip - не заходит.


    А что пишет? Уверены ли Вы что он должен иметь доступ? Это пользователь с ID:1 или другой? Пробовали ли Вы зайти под админом (пользователь с ID:1)
    Ответ написан
    Комментировать