• Как вывести из свойств "должность" и "компанию"?

    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)
    Ответ написан
    Комментировать
  • БИТРИКС. Вопросы к экзамену. Верхнее меню сайта - как реализовать поддержку стиля отображения пункта меню?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Вы невнимательно прочитали курс.
    Меню в битриксе состоит из 5 частей - название пункта, ссылки, дополнительных ссылок (для подсветки), параметров ссылки и условия отображения.

    Подробнее прочитать можно тут: https://dev.1c-bitrix.ru/learning/course/?COURSE_I...

    Кейс который Вас спрашивают целиком и полностью описан в документации: https://dev.1c-bitrix.ru/learning/course/?COURSE_I...
    Ответ написан
    Комментировать
  • Битрикс: экзамен 1. Как реализовать различное отображение информации в шапке в зависимости от времени?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Мне, как человеку, сдававшему этот экзамен и работающему с 1С-Битрикс более 5 лет неизвестно про функцию определяющее рабочее время.

    Как я бы прочитал требования под это задание: необходимо определить рабочее ли сейчас время на сервере средствами php и средствами битрикса подключить отображаемую область с телефоном или email (2 включаемых области).

    На мой взгляд, имеется ввиду, что подключать эту верстку нужно не через include/require, а через компонент/встроенную функцию подключения. Именно это и проверяется.
    Ответ написан
    Комментировать
  • Как вывести описание категорий в Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    чтобы вывести на страницу продукции название и описание?


    Если у Вас компонент каталога - смотрите в параметрах каталога поля которые нужно доставать.
    Если они есть, доставайте и редактируйте вывод раздела.

    Если нет, на result_modifier.php доставайте по ID раздела и выводите
    Ответ написан
    Комментировать
  • Как убрать в выборе списка городов слово "Другой"?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Есть подозрение, что у Вас произошла дозагрузка справочника без очистки.

    Сделайте резервную копию и произведите импорт местоположений с отмеченной опцией "Удалить все существующие местоположения"
    Ответ написан
    2 комментария
  • Подходит ли Битрикс для доски объявлений?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если мы говорим про абстрактную доску обьявлений (или сферического коня в вакууме), то да, подходит.

    А уже дальше, когда начнете смотреть на параметры поймете что и как.
    Например при бюджете в 500 рублей Битрикс Вам не подойдет (там один хостинг в год обойдется не меньше 5 тысяч, я уже не говорю о плате за саму систему).

    Сейчас можно дать только 2 обоснования:
    1) Целевые (есть ли деньги на покупку системы, сервера под нее и ожидаемую нагрузку и разработчиков)
    2) Силовые (есть ли разработчики способные грамотно сделать эту самую доску, так как из коробки под доску объявлений там почти ничего нет)

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если я все правильно понял и нигде не ошибся, то можно попробовать и так:

    <div class="currency">
      <ul>
        <? foreach ($obj as $element):?>
          <? $color = ($element['percent_change_24h'] > 0) '#4ac06a' : '#ff8d8d'; ?>
          <? $plus = ($element['percent_change_24h'] > 0) '+' : ''; ?>
          <li>
            <i class="cc <?=$element["symbol"];?> iconsi" title="<?=$element["name"];?>"></i>
            <div class="block_coin">
              <span class="coin_name"><?=$element["name"];?></span>
              <span style="color: '<?=$color;?>';" class="coin_price"><?=$element['price_usd'];?></span>
              <span style="color: '<?=$color;?>';" class="coin_change">(<?=$plus;?><?=$element["percent_change_24h"];?>%)</span>
            </div>
          </li>
        <? endforeach; ?>
      </ul>
    </div>
    Ответ написан
    2 комментария
  • Где могут пригодиться итераторы PHP?

    gromdron
    @gromdron
    Работаю с Bitrix24
    На эту тему есть замечательная статья: ashep.org/2013/using-spl-iterators-1

    Коротко пару выжимок:
    Цикл foreach создаёт копию полученного массива. Если вы имеете дело с большими объёмами данных, такой подход не годится по очевидной причине: снижение производительности. Итератор SPL работает по другому: он обрабатывает один элемент итерируемого списка за раз, делая это куда более эффективно, нежели foreach.


    При создании поставщиков данных (data providers) итераторы помогают сделать их более эффективными, предлагаю возможности ленивой загрузки (lazy loading). «Ленивая загрузка» означает то, что фактическое получение данных из источника выполняет только тогда, когда эти данные нужны. Помимо прочего, вы получаете возможность трансформации данных перед тем, как отдавать их клиенту объекта.
    Ответ написан
    Комментировать
  • Bitrix один инфоблок для всех информационных материалов?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Не стоит так делать. Крайне не рекомендуется

    Как минимум Вы потеряете:
    1) Производительность. Считать на странице куда именно зашел пользователь и выбирать нужное и строить обойдется дороже чем получить и вывести в уже известном шаблоне
    2) Юзабилити. Контент-менеджер не сможет редактировать из публички и админки ваш треш, так как все по факту будет в одной карточке и понять какие именно поля нужны будет очень и очень сложно
    3) Поиск. Он ничего не знает о вашем супер-пупер компоненте и либо вы будете писать собственные механики и индексаторы, либо не будете использовать поиск. Все пути отображаемые в поиске берутся из настроек инфоблока, а не из страницы где это все расположено (и не из свойства элемента, а именно из настроек этого общего инфоблока)

    Вы получите:
    1) Кусок г...на который нормально редактировать можно только из 1С
    2) Очень дорогой и неоптимизированный компонент, который можно будет настраивать (и тяжело кастомизировать)

    P.S. И конечно кроме автора никто не сможет поддерживать этот компонент.
    P.S.2. У нас в компании за такое руки принудительно об стол выпрямляют))
    Ответ написан
    Комментировать
  • Можно ли использовать Битрикс как headless CMS?

    gromdron
    @gromdron
    Работаю с Bitrix24
    С выходом нового d7 подхода к построению компонентов (так-называемые Engine\Controller) вы сможете использовать любой фронт-энд и довольно просто вызывать методы вашего компонента.

    Например: у вас есть компонент reviews в пространстве имет colobot.
    Соответственно у него есть action: getList (function getListAction).
    Для того чтобы отправить запрос и получить ответ можно будет использовать конструкцию вроде:

    BX.ajax.runComponentAction('colobot:reviews::getList',{
    	// .. параметры которые будут отправлены в метод getListAction
    	// компонента reviews в пространстве имен colobot
    }).then(function(){
    	// .. полезные действия
    });


    Но как уже указали коллеги Выше - можно, но API придется писать самим (в БУСе его пока нет)
    Ответ написан
    Комментировать