1С-Битрикс. Пишем человеческий шаблон многоуровнего меню каталога
Не буду писать про боль при интегации дефотного шаблона. Давайте просто напишем свой, с блекджеком и вот этим всем.
В заметке (интересного):
- построение древовидного массива без рекурсии (неограниченной вложенности)
- анонимная рекурсивная функция
- формирование урлов для секций супер-быстрым способом
- поработаем с сущностями инфоблока через ORM D7
Вводные данные
Предположим, что шаблон вашего сайта называется main. Все пути в заметке будут на основе его.
Шаблон меню обзовём template-with-ul-recursive.
Тип меню будет catalog-left-menu
<?php $APPLICATION->IncludeComponent( "bitrix:menu", "template-with-ul-recursive", array( "ROOT_MENU_TYPE" => "catalog-left-menu", "MENU_CACHE_TYPE" => "N", "MENU_CACHE_TIME" => "3600", "MENU_CACHE_USE_GROUPS" => "N", "MENU_CACHE_GET_VARS" => array( ), "MAX_LEVEL" => "4", "CHILD_MENU_TYPE" => "", "USE_EXT" => "Y", "DELAY" => "N", "ALLOW_MULTI_SELECT" => "Y", "CSS_CLASS_OUTER" => "left-menu", "COMPONENT_TEMPLATE" => "template-with-ul-recursive" ), false ); ?>
Из важного:
- MENU_CACHE_TYPE в N — кеширование обязательно выключаем, у нас будет своё
- USE_EXT в Y — пункты меню будем наполнять в . ext файле
- ALLOW_MULTI_SELECT в Y — корректно определит автивности всех вложенностей
Остальные параметры индивидуальны.
CSS-класс для каждого пункта меню
Для секции добавим (пригодится) новое пользовательское свойство с именем UF_CSS_CLASS_MENU и типом строка. Свойство можно добавить на странице редактирования любого раздела нужного инфоблока (вкладка «Доп. поля»)
Наполняем пунктами меню
В корне сайта создаём файл с именем .catalog-left-menu.menu_ext.php и содержимым:
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); @var use Bitrix\Iblock\SectionTable; use Bitrix\Main\Loader; use Bitrix\Iblock\IblockTable; use Bitrix\Main\Data\Cache; use Bitrix\Main\Data\TaggedCache; use Bitrix\Main\Entity; use Bitrix\Main\Application; $catalogIblockId = 1; $aMenuLinksExt = array(); $cache = Cache::createInstance(); $cacheTime = 86400; $cacheId = 'catalog-left-menu-ext'; if ($cache->initCache($cacheTime, $cacheId, '/olegpro/bitrix. menu_ext/catalog-left-menu')) { $aMenuLinksExt = $cache->GetVars(); } elseif ($cache->startDataCache()) { if (Loader::includeModule('iblock')) { $iblockIterator = IblockTable::getList(array( 'select' => array('SECTION_PAGE_URL', 'CODE'), 'filter' => array('=ID' => $catalogIblockId), 'limit' => 1 )); if ($iblock = $iblockIterator->fetch()) { $connection = Application::getConnection(); $entityUtsTableName = sprintf('b_uts_iblock_%s_section', $catalogIblockId); $entityUtsTableNameTableExists = $connection->isTableExists($entityUtsTableName); if ($entityUtsTableNameTableExists) { $entityUts = Entity\Base::compileEntity('utsSectionOlegproLeftCatalogMenu' . randString(4), [ 'VALUE_ID' => ['data_type' => 'integer'], 'UF_CSS_CLASS_MENU' => ['data_type' => 'string'], ], ['table_name' => sprintf('b_uts_iblock_%s_section', $catalogIblockId)] ); } $sectionIteratorParameters = array( 'select' => [ 'CODE', 'NAME', 'ID', 'DEPTH_LEVEL', 'IBLOCK_SECTION_ID', ], 'filter' => [ '=IBLOCK_ID' => $catalogIblockId, '<=DEPTH_LEVEL' => 4, '=ACTIVE' => 'Y', '=GLOBAL_ACTIVE' => 'Y', ], 'order' => [ 'LEFT_MARGIN' => 'ASC', ], 'runtime' => [], ); if ($entityUtsTableNameTableExists && isset($entityUts) && is_object($entityUts)) { $sectionIteratorParameters['select']['UF_CSS_CLASS_MENU'] = 'UF.UF_CSS_CLASS_MENU'; $sectionIteratorParameters['runtime'][] = new Entity\ReferenceField('UF', $entityUts, ['=this.ID' => 'ref.VALUE_ID'] ); } $sectionIterator = SectionTable::getList($sectionIteratorParameters); $sections = []; while ($section = $sectionIterator->fetch()) { $sections[$section['ID']] = $section; } unset($section); foreach ($sections as $section) { $sectionCodes = [ $section['CODE'] ]; $parentId = $section['IBLOCK_SECTION_ID']; while (isset($parentId)) { if (isset($sections[$parentId])) { $sectionCodes[] = $sections[$parentId]['CODE']; $parentId = $sections[$parentId]['IBLOCK_SECTION_ID']; } else { $parentId = null; } } $aMenuLinksExt[] = array( $section['NAME'], str_replace( array( '#SITE_DIR#', '#IBLOCK_CODE#', '#SECTION_CODE_PATH#', ), array( SITE_DIR, $iblock['CODE'], implode('/', array_reverse($sectionCodes)) ), $iblock['SECTION_PAGE_URL'] ), array(), array( 'ID' => $section['ID'], 'DEPTH_LEVEL' => $section['DEPTH_LEVEL'], 'CODE' => $section['CODE'], 'IBLOCK_SECTION_ID' => $section['IBLOCK_SECTION_ID'], 'UF_CSS_CLASS_MENU' => $section['UF_CSS_CLASS_MENU'], ) ); } if (defined('BX_COMP_MANAGED_CACHE')) { $tagCache = new TaggedCache(); $tagCache->startTagCache('/olegpro/bitrix. menu_ext/catalog-left-menu'); $tagCache->registerTag(sprintf('iblock_id_%s', $catalogIblockId)); $tagCache->endTagCache(); } } else { $cache->abortDataCache(); } } $cache->endDataCache($aMenuLinksExt); } $aMenuLinks = array_merge($aMenuLinks, $aMenuLinksExt);
Значение переменной $catalogIblockId меняем на ID инфоблока каталога.
Важно! Урлы секций обрабатываются только для варианта #SECTION_CODE_PATH#
Создаём папку и файлы шаблона
Создадим папку для нашего шаблона local/templates/main/components/bitrix/menu/template-with-ul-recursive
Создаём в этой папке файл result_modifier.php. В нём мы соберём массив нужного нам формата, чтобы потом в шаблоне было удобно выводить само меню.
<?php [email protected] if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); @var @var @var $selectedItems = []; $mapSectionIds = []; $mapSectionParentIds = []; $allSelectedItems = []; foreach ($arResult as $arItem) { if ($arItem['SELECTED'] && isset($arItem['PARAMS']['ID'])) { $selectedItems[$arItem['PARAMS']['ID']] = 1; } if (isset($arItem['PARAMS']['ID']) && array_key_exists('IBLOCK_SECTION_ID', $arItem['PARAMS'])) { $mapSectionIds[$arItem['PARAMS']['ID']] = $arItem['PARAMS']['IBLOCK_SECTION_ID']; } } $selectedDirectItemsId = $selectedItems; foreach ($mapSectionIds as $sectionId => $sectionParentId) { $sectionsParent = []; $parentId = $sectionParentId; while (isset($parentId)) { $sectionsParent[] = $parentId; $parentId = isset($mapSectionIds[$parentId]) ? $mapSectionIds[$parentId] : null; } $mapSectionParentIds[$sectionId] = $sectionsParent; if (isset($selectedItems[$sectionId])) { $selectedItems[$sectionId] = $sectionsParent; $allSelectedItems = array_merge($allSelectedItems, $sectionsParent); } } if (!empty($allSelectedItems)) { $allSelectedItems = array_flip($allSelectedItems); } foreach ($arResult as $key => $arItem) { if ( isset( $arItem['PARAMS']['ID'], $allSelectedItems[$arItem['PARAMS']['ID']] ) ) { $arItem['SELECTED'] = true; $arResult[$key] = $arItem; } } unset($key, $arItem); $map = [ 0 => [ 'CHILDREN' => [] ] ]; foreach ($arResult as &$arItem) { $arItem['CHILDREN'] = []; $map[$arItem['PARAMS']['ID']] = &$arItem; } foreach ($arResult as &$arItem) { $map[(int)$arItem['PARAMS']['IBLOCK_SECTION_ID']]['CHILDREN'][] = &$arItem; } $arResultCopy = $arResult; $arResult = [ 'CHILDREN' => $map[0]['CHILDREN'], 'SELECTED_DIRECT_IDS' => $selectedDirectItemsId, ]; $map = null; unset($map);
Создаём в папке local/templates/main/components/bitrix/menu/template-with-ul-recursive файл с параметрами . parameters.php
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); use Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); $arTemplateParameters = array( 'CSS_CLASS_OUTER' => array( 'NAME' => Loc::getMessage('MENU_CSS_CLASS_OUTER'), 'TYPE' => 'STRING', 'DEFAULT' => 'menu', ), 'CSS_CLASS_ITEM' => array( 'NAME' => Loc::getMessage('MENU_CSS_CLASS_ITEM'), 'TYPE' => 'STRING', 'DEFAULT' => 'menu', ), 'CSS_CLASS_ITEM_ACTIVE' => array( 'NAME' => Loc::getMessage('MENU_CSS_CLASS_ITEM_ACTIVE'), 'TYPE' => 'STRING', 'DEFAULT' => 'menu', ), );
Создаём в папке local/templates/main/components/bitrix/menu/template-with-ul-recursive/lang/ru/ файл .parameters.php с языковыми фразами параметров
<?php [email protected] $MESS['MENU_CSS_CLASS_OUTER'] = 'CSS класс для списка (ul)'; $MESS['MENU_CSS_CLASS_ITEM'] = 'CSS класс для элемента списка (li)'; $MESS['MENU_CSS_CLASS_ITEM_ACTIVE'] = 'CSS класс для активного элемента списка';
Создаём в папке local/templates/main/components/bitrix/menu/template-with-ul-recursive/ файл template. php с нашим шаблоном
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); @var @var @var $this->setFrameMode(true); if (!empty($arResult)) { $menuRecursive = function ($items, $level = 1) use ($arParams, $arResult, &$menuRecursive) { $items = array_values($items); $countItems = sizeof($items); if (sizeof($items) > 0) { $cssClassOuter = array_filter( array_map('trim', explode(' ', $arParams['CSS_CLASS_OUTER'])) ); $cssClassOuter = array_map( function ($value) use ($level, &$cssClassOuter) { return implode(' ', [$value, sprintf('%s-level%d', $value, $level)]); }, $cssClassOuter ); ?><ul><?php foreach ($items as $i => $arItem) { $cssClasses = [ $arParams['CSS_CLASS_ITEM'], ]; if (($i + 1) % 2 == 0) { $cssClasses[] = 'even'; } else { $cssClasses[] = 'odd'; } if ($i == 0) { $cssClasses[] = 'first'; } if ($countItems == $i + 1) { $cssClasses[] = 'last'; } if ($arItem['SELECTED']) { $cssClasses[] = $arParams['CSS_CLASS_ITEM_ACTIVE']; } if (isset($arItem['PARAMS'], $arItem['PARAMS']['CLASS']) && strlen(trim($arItem['PARAMS']['CLASS']))) { $cssClasses[] = trim($arItem['PARAMS']['CLASS']); } if ($arItem['SELECTED'] && isset($arResult['SELECTED_DIRECT_IDS'][$arItem['PARAMS']['ID']])) { ?><li> <span><?php echo $arItem['TEXT'] ?></span> <?php $menuRecursive($arItem['CHILDREN'], $arItem['PARAMS']['DEPTH_LEVEL'] + 1) ?> </li><?php } else { ?><li> <a href="<?php echo $arItem['LINK'] ?>"><?php echo $arItem['TEXT'] ?></a> <?php $menuRecursive($arItem['CHILDREN'], $arItem['PARAMS']['DEPTH_LEVEL'] + 1) ?> </li><?php } } ?></ul><?php } }; $menuRecursive($arResult['CHILDREN']); }
Вот, собственно, и всё. Надеюсь, вам понравилось Подписывайтесь на канал, ставьте пальцы вверх и т.п. 🙂
Bitrix — Грабли
Небходимо добавить в раздел head, link c rel = «canonical» Для этого, находим активный шаблон и правим файл header.php Вариант 1 Вариант 2
Далее »Очередной сайт на битрикс и надо вывести мета (title, description) для категорий, при этом чтоб не менялись мета в дочерних категориях. Вскрытие показало что шаблон для категорий переносился вручную и битрикс об этом ничего не знает, что немного затрудняет доступ к шаблону. Реализация вывода мета данных Создал у раздела во вкладке «Доп. поля» (Дополнительные поля), два поля UF_SEO_TITLE, UF_SEO_DESC. Теперь […]
Далее »И так, для чего может понадобится Bitrix API, и с чем его едят. REST API может подойти для решения ряда задач получение данных с вашей битрикс системы отправка данных в Bitrix с сайта или приложения синхронизация данных из Битрикса с другой CRM системой Под Bitrix подразумевается не CMS Bitrix, а сервис «Битрикс24». Для новичков и кому постарше рекомендую установить приложение […]
Далее »Как правило, чтоб добавить в раздел head код, к примеру такой можно просто найти файл в котором находится раздел head и вписать туда данный код, и он будет работать, конечно «типа эксперты» будут критиковать такой код за то что он не соответствует философии битрикса. Для добавления линков, мета и скриптов можно воспользоваться и другим вариантом, который чуть ближе к философии […]
Далее »Обычно для вывода h2 используется следующий код Но такое может не подойти, если надо разграничить заголовок h2 и мета тег title. То есть если сделать как написано выше то заголовок и тайтл будут одинаковы, поскольку вывод title скорей всего будет следующий Методы установки значений для мета данных
Далее »Есть страницы каталога и страницы фильтра, например такие: https://my-site.ru/catalog/anestetiki/filter/clear/apply/ https://my-site.ru/catalog/anestetiki/ но они обе имеют одинаковое содержимое и соответственно являются для поисковиков дублем, и стоит вопрос по закрытию страниц фильтра от индексации Один из вариантов закрытия от индексации страницы фильтра. открываем файл шапки своего шаблона /bitrix/templates/mytempl/header.php и в шапке вставляем код до $APPLICATION->ShowHead()
Далее »Для того чтобы сделать редирект есть множество способом, например с помощь инструкций в .htaccess или с помощью header в php Но эти способы могут не сработать в битрексе, и тогда можно воспользоваться функцией битрикса LocalRedirect() Ссылка на док. тут Пример использования
Далее »Страница сайта site.org/vacancy/ отдает ответ 404 и показывает шаблон 404 страницы, хотя если авторизироватся в битриксе, то страница нормально работает, и отображает данные. В индексном файле страницы (site.org/vacancy/index.php) подключен компонент вывода новостей. Если убрать компонент то страница отображается для пользователей. Проверен параметр компонента «SET_STATUS_404» => «N» тоесть даже при ошибке может отдавать статус 200 Проблема оказалась в следующем. Компонент выводит […]
Далее »В общем беда в следующем, есть инфоблок (iblock) у которого есть разделы (section), и надо этим разделам назначить определенные мета данные (title, мета-описание, мета-ключи). Прикол в том, что у битрикса есть компонент «SEO», который позволяет задавать разделам и элементам мета-данные, как шаблонно с учетом параметров так и без параметров, НО эти мета применяются и к подразделам и элементам, а этого […]
Далее »Задача. Необходимо вывести текст из поля описания инфоблока. Фактически происходит вывод не описания инфоблока а описание типа инфоблока. Решение. Для этого используем ниже следующий код, добавляя его в шаблон, в моем случае это был bitrix:catalog.section.list, но это надо смотреть индивидуально по проекту.
Далее »1С-Битрикс & 404 Not found
В обновлении модуля «Информационные блоки» v15.5.1 от 24.05.2015 помимо всего прочего были обновлены компоненты bitrix:catalog, bitrix:news.
Данные компоненты «научились» работать с 404й ошибкой! Мы очень давно этого ждали и на безрыбье пользовались собственным решением описанным тут.
Наконец пришло время когда можно отказаться от собственного костыля, а обработку ошибки отдать системе, проверим что же все таки изменилось и как с этим работать.
Обновление системы/шаблонов
Во-первых нужно обновиться, а затем пропатчить свои кастомные шаблоны, потому что в настройках появились новые ключи, их нужно передать из комплексного компонента в обычные.
"MESSAGE_404" => $arParams["MESSAGE_404"], "SET_STATUS_404" => $arParams["SET_STATUS_404"], "SHOW_404" => $arParams["SHOW_404"], "FILE_404" => $arParams["FILE_404"],
Настройка компонентов
Скриншот 1.
Переходим к настройкам компонентов. Сразу прокрутим вниз до блока «Настройки 404 ошибки» (скриншот 1).
Ранее этого блока не было, рассмотрим его параметры.
- «Установить статус 404» — собственно устанавливает соответствующий статус.
- «Показ специальной страницы» — если выбрать данный чек, то появится поле ввода для пути к странице ошибки 404.
- «Сообщение для показа» — тут вводится текст, который будет выведен пользователю когда появляется 404я ошибка. По умолчанию данные берутся из компонента.
Если выбран вариант показа специальной страницы, то при возникновении 404й ошибки, на страницу, без изменения URL, будет подгружена указанная страница, либо /404. php по умолчанию.
Если заполнить поле сообщения, то при возникновении 404й ошибки, на месте компонента будет выведено соответствующее сообщение.
«Не лучше костыля»
Вроде бы решение хорошее и даже работает, но давайте копнем глубже. Начнем с компонента bitrix:catalog, с настройками 404й ошибки вроде все ясно, но как работает метод с разными вариантами построения URL?
Первый вариант настройки URL
Скриншот 2.
Разберем первый вариант построения URL для секций и элементов, блок «Управление адресами страниц», в данном случаи все элементы инфоблока находятся в корне, а секции выстраиваются в цепочку (скриншот 2).
Посмотрим как компонент будет реагировать на URL следующих типов:
- «/models/section1/что-то-не-то/» — 404
- «/models/что-то-не-то/section1/» — 404
- «/models/что-то-не-тоsection1/» — 404
- «/models/section1/что-то-не-то/section2/» — 404
- «/models/element/что-то-не-то/» — 404
- «/models/что-то-не-то/element/» — 404
- «/models/что-то-не-тоelement/» — 404
И подобные комбинации будут адекватно отдавать 404ю ошибку.
Второй вариант настройки URL
Скриншот 3.
Разберем второй вариант построения URL для секций и элементов, блок «Управление адресами страниц», в данном случаи все элементы инфоблока находятся в своих секциях, а секции находятся в корне (скриншот 3).
Посмотрим как компонент будет реагировать на URL следующих типов:
- «/models/section1/что-то-не-то/» — 404
- «/models/что-то-не-то/section1/» — 404
- «/models/что-то-не-тоsection1/» — 404
- «/models/element/что-то-не-то/» — 404
- «/models/что-то-не-то/element/» — 200 OK
- «/models/section/что-то-не-то/element/» — 404
- «/models/что-то-не-тоelement/» — 404
Как видно из примера, при такой настройке между секцией и элементом, в URL можно написать что угодно и система это «проглотит». Ситуацию можно исправить только заменив #SECTION_CODE# на #SECTION_CODE_PATH#.
Компонент bitrix:news
Он тоже получил обновление, но как и раньше, очень плохо работает с секциями, а следовательно никакой адекватной обработки 404х ошибок с их участием нет.
Итог
В общем данное обновление полностью закрывает необходимость использования собственного решения. Но на этом все, поддержки некоторых видов настроек URL как не было, так и нет, компонент bitrix:news как и раньше — в пролете.
Bitrix Q&A
спросил 12 Апр от аноним спросил 17 Март от аноним спросил 28 Янв от аноним спросил 26 Дек, 20 от аноним спросил 02 Ноя, 20 от аноним спросил 24 Авг, 20 от аноним спросил 10 Авг, 20 от анонимБитрикс — проверка лицензионного ключа 1C-Bitrix, проверка ключа, регистрация ключа, покупка продления
Указывайте лицензионный ключ правильно!
Лицензионный ключ — это код из 23 символов в состав, которого входят прописные (большие) буквы латинского алфавита и цифры, в формате: XXX-XX-XXXXXXXXXXXXXXXX.
Если вы вводите символы кода вручную, убедитесь, что правильно интерпретировали символ «0» и «I».
Информация о ключе
Форма позволяет получить информацию о владельце лицензии, редакции продукта, сроке активности Стандартной лицензии, используемых решениях из каталога «Маркетплейс» и многое другое.
Продление ключа
Если лицензии необходимо продление, на странице с результатом проверки будет размещена ссылка для добавления необходимого товар в корзину заказа, а также указан срок, в течении которого необходимо активировать купоны приобретаемого продления.
Регистрация
Также с помощью данной формы вы можете активировать вашу копию продукта «1С-Битрикс», если лицензионный ключ ранее не был активирован.
Онлайн-регистрация позволит вам получить доступ к дистрибутивам продукта в исходных кодах, закрытому клиентскому форуму, приоритетной технической поддержке. Если вы не активировали лицензию в течение шести месяцев с даты заключения соответствующего лицензионного договора, активация произойдет автоматически по истечении этого периода.
Как найти ваш лицензионный ключ:
- Авторизуйтесь под учетной записью администратора на вашей установке продукта «1С-Битрикс»
(т.е. вы должны перейти на ваш сайт, в раздел http://www.mysite.ru/bitrix/admin/). - Войдите в раздел «Marketplace-Обновление платформы» («Настройки-Обновления», если у вас версия ниже 11.0.0), в блоке «Ответ от сервера обновлений» найдите поле «Лицензионный ключ» (см. рисунок ниже).
- Нажмите кнопку «Проверить ключ» (для версий 11.X.X и выше) или скопируйте лицензионный ключ и вставьте на данной странице в поле для ввода ключа (для версий ниже 11.X.X).
По дополнительным вопросам лицензирования и продления просим обращаться в отдел продаж по телефону +375 (17) 336-24-04 либо электронной почте belarus@1c-bitrix. by.
Просим указать какую задачу пытались решить на данной странице и не смогли получить результат. Благодарим Вас за отзыв.
Как интегрировать Битрикс24 с вашим приложением Rails: Часть 1
В недавнем проекте для OmbuLabs нам пришлось интегрировать Битрикс24 (инструмент, который клиент использовал для управления своим бизнесом) с приложением Rails, которое мы создавали для клиента .
Целью этой интеграции была синхронизация данных между приложением Rails и Bitrix CRM. По сути, мы хотели получать данные из Битрикс каждый раз, когда происходило изменение (т.е.лид был создан / обновлен). Мы также хотели синхронизировать наоборот, отправлять изменения в Битрикс каждый раз, когда что-то меняется на стороне Rails.
Мы собираемся разбить этот процесс на две разные статьи. В этом разделе описаны шаги, которые необходимо сделать для соединения обеих сторон. Во второй части будет рассказано, как отправлять и извлекать данные с помощью веб-перехватчиков.
Авторизация приложений
Битрикс API использует для авторизации OAuth 2.0. Мы покажем вам один из способов использования его в Rails:
Создать новую конечную точку
Нам понадобится новая конечная точка, на которую приложение «Битрикс» (которое мы создадим на следующем шаге) сможет перенаправить.
# config / routes.rb
получить «битрикс / коннект», в: «битрикс # коннект»
# приложение / контроллеры / bitrix_controller.rb
класс BitrixController
Создать новое приложение в Битрикс
Вы можете войти в свою учетную запись «Битрикс» и перейти в меню «Приложения», чтобы добавить новое приложение.
Вы должны отметить опцию «Доступно только как сценарий», а также разделы, к которым вы хотите иметь доступ (т.е.е. CRM). Внизу формы вам нужно будет вставить URL-адрес конечной точки, которую мы создали на предыдущем шаге ( bitrix # connect
).
После сохранения у вас будет новое приложение с идентификатором Application ID
и ключом приложения
.
Я рекомендую вам хранить эти учетные данные как переменные среды в Rails, чтобы вы могли использовать их позже.
Подключение
К счастью, есть Ruby gem, который упрощает взаимодействие с Bitrix API.
Добавьте его в свой Gemfile, а затем запустите пакет , установите
гем 'bitrix24_cloud_api'
После установки драгоценного камня вы можете создать простой класс для обработки соединения.
# приложение / услуги / bitrix_service.rb
класс BitrixService
def инициализировать
@app_id = ENV ["BITRIX_APP_ID"] # ID вашего приложения Битрикс
@app_key = ENV ["BITRIX_APP_KEY"] # ключ приложения вашего приложения Битрикс
@endpoint = "мой.bitrix24.com "# Замени my на свой субдомен
@redirect_uri = "http://123.ngrok.io/bitrix/connect" # Он должен совпадать с URL, который вы указали в приложении Битрикс
конец
клиент def
params = {
app_id: @app_id,
app_key: @app_key,
конечная точка: @endpoint,
redirect_uri: @redirect_uri
}
Bitrix24CloudApi :: Client. new (параметры)
конец
конец
Теперь вы можете перейти в консоль rails
и выполнить следующий оператор для генерации URL авторизации Битрикс:
# рельсы консоли
БитриксСервис.new.client.authorize_url
Если вы все сделали правильно, он должен вернуть URL-адрес, аналогичный https://my.bitrix24.com/oauth/authorize?client_id=xxxxx&redirect_uri=xxxxx&response_type=code
.
Вы можете вставить это в браузер, и он перенаправит вас на конечную точку / bitrix / connect
, которую вы добавили ранее, с дополнительным параметром code
. Вы, вероятно, увидите ошибку, потому что мы еще не добавили никакой логики в нашу конечную точку.
Мы хотим получить access_token и refresh_token
в обмен на параметр code
, который мы получили, поэтому давайте добавим для этого некоторую логику:
# приложение / контроллеры / bitrix_controller. rb
класс BitrixController
Вернитесь к сгенерированному URL-адресу в браузере, и теперь вы должны увидеть ответ JSON с токенами.
Получив access_token
, можно приступать к выполнению запросов к Bitrix API.
# рельсы консоли
client = Bitrix24CloudApi :: Клиент.новый (access_token: «abc123456», конечная точка: «my.bitrix24.com»)
client.leads
Единственное, что здесь нужно учитывать, это то, что access_token
имеет срок действия 1 час. Так что это не сработает, если вам понадобится использовать его через 60 минут.
Вот где приходит на место refresh_token
. Вы должны сохранить refresh_token
(из ответа JSON) в качестве переменной среды, чтобы вы всегда могли использовать его для создания нового access_token
.
Если мы немного подправим наш класс, теперь мы можем получить его поддержку:
# приложение / услуги / bitrix_service.rb
класс BitrixService
def инициализировать (access_token = nil)
@access_token = токен_доступа
# ...
конец
клиент def
params = if @ access_token.present?
{конечная точка: @endpoint, access_token: @access_token}
еще
{
app_id: @app_id,
app_key: @app_key,
конечная точка: @endpoint,
redirect_uri: @redirect_uri
}
конец
Bitrix24CloudApi :: Client.new (параметры)
конец
def generate_access_token
клиент.refresh_token (ENV ["BITRIX_REFRESH_TOKEN"]) [: access_token]
конец
конец
Вы можете попробовать сами, запустив:
# рельсы консоли
access_token = BitrixService.new.generate_access_token
client = BitrixService.new (токен_доступа) . client
client.leads
Вы можете использовать приведенный выше код каждый раз, когда хотите установить соединение. Единственный способ истечения срока действия refresh_token - это если вы не отправляете запросы более 30 дней.
Заключение
В первой части было показано, как подключить приложение Rails к учетной записи Битрикс.Следите за обновлениями во второй части, где мы увидим, как извлекать и извлекать данные из Битрикс с помощью веб-хуков.
Блого Битрикс24 и цифровом маркетинге - INTERVOLGARU
Разработчики Битрикс24 прилагают серьезные усилия, чтобы обеспечить возможность обмена информацией между Битрикс24 и различными системами. Мы рассмотрим, как возможен такой обмен информацией с корпоративным веб-сайтом, и покажем, как настраивать лиды с помощью соединения с веб-сайтом B24 +.
Давайте начнем.
Мы собираемся использовать облачную версию сервиса Битрикс24 и установку WordPress с настройками по умолчанию.
Ваш сайт может быть построен на любой платформе. Мы просто добавим в него html-код, созданный Битрикс24 в конце.
В демонстрационных целях мы будем использовать два тестовых сайта: один построен на платформе Битрикс, а другой - на WordPress.
Тестовый сайт на платформе Битрикс:
Тестовый сайт на WordPress:
Обратный вызов - это частый элемент, с которым вы сталкиваетесь на многих веб-сайтах.Это похоже на приемник, который вибрирует или мигает, чтобы привлечь внимание.
Вы можете настроить аналогичный элемент на своем сайте с помощью Битрикс24, не привлекая профессиональных программистов.
Процедура настройки включает три этапа:
настройка формы, вызываемой виджетом.
настройка самого виджета;
размещение виджета на сайте.
Настройка формы
Откройте раздел форм SRM в Битрикс24.
В открывшемся окне вы увидите три предустановленные формы: Обратный звонок, Форма обратной связи и Контактная информация:
Следующее, что вам нужно сделать, это скопировать форму, которую нужно встроить.
Вы можете увидеть новую форму, которую вы только что скопировали из предустановленных.Нажмите "кнопку редактирования".
Теперь можно редактировать форму. Измените имя, заголовок и текст в форме, как показано ниже. Мы также можем добавить поле Name из объекта Lead. Для этого откройте раздел Lead и щелкните поле Name:
Цвет по умолчанию - синий. Если он не совпадает с цветовой схемой вашего сайта, вы можете выбрать более подходящий вариант в поле Цвет.
Не забудьте указать человека, ответственного за новый лид и перезвонивший клиенту в поле Ответственное лицо:
Откройте раздел «Еще».Он содержит множество полезных настроек для нашей формы, которые позволяют задать правила заполнения поля лида и установить метрики для оценки рекламной кампании маркетологами:
После того, как вы сохранили новую форму, вы увидите ее в списке. Не забудьте его включить:
Теперь вы можете разместить форму на любой странице сайта. Для этого нажмите кнопку «Код веб-сайта» и скопируйте представленный код на нужную страницу.Однако нам нужна не просто форма на сайте, а приемник, который будет привлекать внимание, то есть виджет. Следовательно, нам нужно перейти ко второму этапу.
Настройка виджета
Давайте создадим виджет и прикрепим к нему нашу новую форму обратного вызова. Для этого зайдите в CRM и выберите в меню «Виджет веб-сайта».
Откроется окно с готовым виджетом. Он показывает несколько каналов для входящих лидов:
Нам нужно создать виджет только для заказа обратного звонка.Выберите Создать виджет:
Введите имя виджета «Вызов заказа». Отключите ненужные каналы - откройте линию и форму CRM и выберите форму Обратного звонка. В правой части окна находятся настройки положения виджета, цвета и времени показа страницы сайта. Настроим наш виджет на сайте:
Сохраним виджет. Теперь у нас есть установленный виджет с прикрепленной к нему необходимой формой. Переходим к третьему этапу - размещению виджета на сайте.
Размещение на сайте
Для размещения виджета достаточно просто добавить созданный Битрикс24 скрипт в html-код страницы.
Но мы рассмотрим, как разместить виджет на сайте, чтобы он отображался на всех страницах. В качестве примера мы будем использовать тестовый сайт CMSBitrixFramework. Нажмите кнопку "Код веб-сайта":
В открывшемся окне нажмите Копировать в буфер:
Затем мы переходим на наш тестовый веб-сайт и входим в административный режим, где последовательно выбираем разделы «Настройки» - «Настройки продукта» - «Сайты» - «Шаблоны веб-сайтов».Затем мы выбираем Изменить в используемом шаблоне:
Переходим в самый конец кода шаблона и вставляем наш скрипт перед закрывающим тегом