Дмитрий Репин: Подмена параметров компонента прямо из шаблона

Web 1920 _ 1.png
Добрый день!
Бывают ситуации когда в каком-либо компоненте не хватает какого то параметра. Например, мне, не хватает параметра очередности столбцов в стандартном копоненте
"корзина" (bitrix:sale.basket.basket). То есть я хочу чтобы первым столбцом в корзине было не наименование, а артикул, или любой другой столбец.
Для этого я ничего не придумал лучше как добавить в настройках компонента дополнительные параметры вида "Номер столбца => Название столбца". Но проблема в том что я не знаю заранее количество столбцов, которые будут использованы в корзине, поэтому этот параметр должен быть динамически, то есть для параметра "COLUMNS_LIST" у компонента, мы должны добавить 'REFRESH' => 'Y' и в зависимости от количества выбранных столбцов выводить то же количество необходимых нам параметров.
Вариант "скопировать компонент в своё пространство имён" - оставим на потом, а я предлагаю прямо в шаблоне влезть в настройки параметров и поправить всё что нам нужно.
Итак. Копируем шаблон корзины в свой шаблон и добавляем (если отсутствует) файл .parameters.php прямо в вашей папке шаблона корзины.
Далее добавляем в этот файл параметр, полностью соответствующий параметру в папке .parameters.php компонента.
====code====
$arColumns = array(
   "NAME" => GetMessage("SBB_BNAME"),
   "DISCOUNT" => GetMessage("SBB_BDISCOUNT"),
   "WEIGHT" => GetMessage("SBB_BWEIGHT"),
   "PROPS" => GetMessage("SBB_BPROPS"),
   "DELETE" => GetMessage("SBB_BDELETE"),
   "DELAY" => GetMessage("SBB_BDELAY"),
   "TYPE" => GetMessage("SBB_BTYPE"),
   "PRICE" => GetMessage("SBB_BPRICE"),
   "QUANTITY" => GetMessage("SBB_BQUANTITY"),
   "SUM" => GetMessage("SBB_BSUM")
);
if (Loader::includeModule('catalog'))
{
   $arIblockIDs = array();
   $arIblockNames = array();
   $catalogIterator = CatalogCatalogIblockTable::getList(array(
      'select' => array('IBLOCK_ID', 'NAME' => 'IBLOCK.NAME'),
      'order' => array('IBLOCK_ID' => 'ASC')
   ));
   while ($catalog = $catalogIterator->fetch())
   {
      $catalog['IBLOCK_ID'] = (int)$catalog['IBLOCK_ID'];
      $arIblockIDs[] = $catalog['IBLOCK_ID'];
      $arIblockNames[$catalog['IBLOCK_ID']] = $catalog['NAME'];
   }
   unset($catalog, $catalogIterator);


   if (!empty($arIblockIDs))
   {
      $arProps = array();
      $propertyIterator = IblockPropertyTable::getList(array(
         'select' => array('ID', 'CODE', 'NAME', 'IBLOCK_ID'),
         'filter' => array('@IBLOCK_ID' => $arIblockIDs, '=ACTIVE' => 'Y', '!=XML_ID' => CIBlockPropertyTools::XML_SKU_LINK),
         'order' => array('IBLOCK_ID' => 'ASC', 'SORT' => 'ASC', 'ID' => 'ASC')
      ));
      while ($property = $propertyIterator->fetch())
      {
         $property['ID'] = (int)$property['ID'];
         $property['IBLOCK_ID'] = (int)$property['IBLOCK_ID'];
         $property['CODE'] = (string)$property['CODE'];
         if ($property['CODE'] == '')
            $property['CODE'] = $property['ID'];
         if (!isset($arProps[$property['CODE']]))
         {
            $arProps[$property['CODE']] = array(
               'CODE' => $property['CODE'],
               'TITLE' => $property['NAME'].' ['.$property['CODE'].']',
               'ID' => array($property['ID']),
               'IBLOCK_ID' => array($property['IBLOCK_ID'] => $property['IBLOCK_ID']),
               'IBLOCK_TITLE' => array($property['IBLOCK_ID'] => $arIblockNames[$property['IBLOCK_ID']]),
               'COUNT' => 1
            );
         }
         else
         {
            $arProps[$property['CODE']]['ID'][] = $property['ID'];
            $arProps[$property['CODE']]['IBLOCK_ID'][$property['IBLOCK_ID']] = $property['IBLOCK_ID'];
            if ($arProps[$property['CODE']]['COUNT'] < 2)
               $arProps[$property['CODE']]['IBLOCK_TITLE'][$property['IBLOCK_ID']] = $arIblockNames[$property['IBLOCK_ID']];
            $arProps[$property['CODE']]['COUNT']++;
         }
      }
      unset($property, $propertyIterator, $arIblockNames, $arIblockIDs);


      $propList = array();
      foreach ($arProps as &$property)
      {
         $iblockList = '';
         if ($property['COUNT'] > 1)
         {
            $iblockList = ($property['COUNT'] > 2 ? ' ( ... )' : ' ('.implode(', ', $property['IBLOCK_TITLE']).')');
         }
         $propList['PROPERTY_'.$property['CODE']] = $property['TITLE'].$iblockList;
      }
      unset($property, $arProps);


      if (!empty($propList))
         $arColumns = array_merge($arColumns, $propList);
      unset($propList);
   }
}
$arTemplateParameters["COLUMNS_LIST"] = array(
   "NAME"=>GetMessage("SBB_COLUMNS_LIST"),
   "TYPE"=>"LIST",
   "MULTIPLE"=>"Y",
   "VALUES"=>$arColumns,
   "DEFAULT"=>array("NAME", "PRICE", "TYPE", "DISCOUNT", "QUANTITY", "DELETE", "DELAY", "WEIGHT"),
   "COLS"=>25,
   "SIZE"=>7,
   "ADDITIONAL_VALUES"=>"N",
   "PARENT" => "VISUAL",
   'REFRESH' => 'Y',
);
=============
Единственное что я добавил это 'REFRESH' => 'Y'.
И теперь если посмотрим уже визуальные настройки компонента, то параметр "Выводимые колонки" поменяется на наш. Таким образом можно менять логику, значения любого параметра прямо из шаблона.

Далее просто получаем значения, создаём массив и выводим новые параметры для выбора.
====code====
$arrColumn = array();
foreach($arCurrentValues["COLUMNS_LIST"] as $id=>$code){
   $arrColumn[$code] = $arColumns[$code];
}
foreach($arCurrentValues["COLUMNS_LIST"] as $id=>$val){
   $arTemplateParameters['COLUMN_SORT'.$id] = array(
      'NAME' => GetMessage('COLUMN_NAME').($id+1),
      'TYPE' => 'LIST',
      'VALUES' => $arrColumn,
      "PARENT" => "VISUAL",
   );
}
=============
У меня получилось в итоге так:



Далее просто в result_modifier.php получаем наши параметры и меняем массив $arResult["GRID"]["HEADERS"] в зависимости от параметров.
====code====
$newArrHeaders = array();
foreach($arResult["GRID"]["HEADERS"] as $k=>$arHeader){
   $new_id = array_search ($arParams["COLUMN_SORT".$k], $arParams["COLUMNS_LIST"]);
   $newArrHeaders[] = $arResult["GRID"]["HEADERS"][$new_id];
}
ksort($newArrHeaders);
$arResult["GRID"]["HEADERS"] = $newArrHeaders;
=============

PS. Не забываем про языковой файл lang/[язык]/.parameters.php

Автор : bi3ks

Опасный target=»_blank»

Большинство создают внешние ссылки через target=»_blank» и не знают одного интересного нюанса — страница, на которую мы попадем таким образом, получит частичный контроль над ссылающейся на нее страницей через js свойство window.opener. Через window.opener.location мы сможем сделать редирект на, к примеру, фишинговую страницу. Это своего рода tabnabbing, только более продвинутый. Так как жертва … Continue reading

Автор : bi3ks
Теги : SEO

Андрей Рябин: Видеогалерея, почти как в «стиме» (модуль редактор для контент менеджеров)

Selection_008.png
В обновлении 1.1.6 вышел новый блок для редактора - Галерея видеороликов
В публичной части он похож на видеогалерею в сервисе steam - есть центральный блок с видео или картинкой и слайдер с остальными превьюшками.





Видеогалерея адаптивна, она занимает всю ширину блока в котором находится и поэтому очень удобна для встраивания в различные материалы.
На картинке пример двух видеогалерей которые находятся в невидимых блоках разной ширины

Selection_005.png

Помимо видео (сейчас поддерживается только youtube) видеогалеря может отображать и просто картинки, что создают сильную конкуренцию другому блоку - Галерея изображений :)
Selection_123.png

Однако в админке, работа с блоком Галерея видеороликов немного сложнее обычной Галереи изображений.

Из-за того что в слайды можно загружать или видео или картинку (или все вместе), предлагается добавлять сначала кадры слайда, на картинке это небольшие серые блоки, которые можно создать через кнопку "Добавить"

Далее, кликая на слайд (он подсветится красной рамкой) можно отредактировать его содержимое, прикрепить видео или добавить картинку.

Примечательно что модуль загрузит картинку-превью с ютуба если просто указать ссылку на видео.

А удалить слайд можно нажав на кнопку с крестиком у выделенного слайда.

Selection_004.png

Маркетплейс
http://marketplace.1c-bitrix.ru/solutions/sprint.editor/

Документация
https://bitbucket.org/andrey_ryabin/sprint.editor/wiki/Home

Автор : bi3ks

Автопубликация материалов в социальную сеть одноклассники

Недавно понадобилось для одного проекта сделать автоматическую публикацию материалов в основные социальные сети: вконтакте, facebook, twitter и одноклассники.

С первыми 3-мя проблем не возникло, т.к. есть хороший модуль с гибкой настройкой http://marketplace.1c-bitrix.ru/solutions/vettich.autoposting/

Для публикации в одноклассники и другие социальные сети у разработчика есть платная версия модуля http://marketplace.1c-bitrix.ru/solutions/vettich.autopostingplus/
Но, судя по обсуждениям и реакции разработчика на вопросы, данный модуль длительное время не обновлялся и публикация в одноклассники не работает. Длительное ожидание ответа от разработчика и ручная публикация ссылок в группе в одноклассниках, заставили подумать о собственном решении данного вопроса.

Покопался в интернете и нашел несколько полезных статей:

http://shtyrlyaev.ru/all/skript-avtopostinga-v-gruppu-odnoklassnikov/ - о том как создать приложение и произвести необходимые настройки.
http://dampi.ru/posting-v-gruppu-v-odnoklassnikah-avtomaticheski-s-sayta - непосредственно сам код для публикации.

Задача следующая:
После добавления материала в инфоблок по событию OnAfterIBlockElementAdd проверять на соответствие разрешенному IBLOCK_ID и производить публикацию.

Сам код необходимо разместить в файле /bitrix/php_interface/init.php: ====code====

AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("AutoPostingOK", "Posting"));

Class AutoPostingOK
{
   const OK_ACCESS_TOKEN    = "";  // Наш вечный токен
   const OK_PRIVATE_KEY     = "";  // Секретный ключ приложения
   const OK_PUBLIC_KEY      = "";  // Публичный ключ приложения
   const OK_GROUP_ID        = "";  // ID нашей группы

   // Запрос
   function getUrl($url, $type = "GET", $params = array(), $timeout = 30, $image = false, $decode = true)
   {
      if ($ch = curl_init())
      {
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_HEADER, false);

         if ($type == "POST")
         {
            curl_setopt($ch, CURLOPT_POST, true);

            // Картинка
            if ($image) {
               curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            }
            // Обычный запрос       
            elseif($decode) {
               curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
            }
            // Текст
            else {
               curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
            }
         }

         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
         curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot');
         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

         $data = curl_exec($ch);

         curl_close($ch);

         // Еще разок, если API завис
         if (isset($data['error_code']) && $data['error_code'] == 5000) {
            $data = AutoPostingOK::getUrl($url, $type, $params, $timeout, $image, $decode);
         }

         return $data;

      }
      else {
         return "{}";
      }
   }

   // Массив аргументов в строку
   function arInStr($array)
   {
      ksort($array);

      $string = "";

      foreach($array as $key => $val) {
         if (is_array($val)) {
            $string .= $key."=".arInStr($val);
         } else {
            $string .= $key."=".$val;
         }
      }

      return $string;
   }
   
   function Posting(&$arFields)
   {
      define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/upload/posting_ok.txt");//путь для записи log-файла
      $POSTING_IBLOCK = Array(1,2);//ID инфоблоков, для которых надо публиковать материалы
      
      if($_SERVER["HTTPS"])
         $PROTOCOL = 'https';
      else
         $PROTOCOL = 'http';
      
      
      if(in_array($arFields["IBLOCK_ID"], $POSTING_IBLOCK) && $arFields["RESULT"]==true)
      {
         $ok_access_token = AutoPostingOK::OK_ACCESS_TOKEN;
         $ok_private_key = AutoPostingOK::OK_PRIVATE_KEY;
         
         CModule::IncludeModule("iblock");
         $res = CIBlockElement::GetByID($arFields["ID"]);
         if($ar_res = $res->GetNext())
         {
            $arFields["DETAIL_PAGE_URL"] = $ar_res["DETAIL_PAGE_URL"];
         }
         
         $params = array(
            "application_key"   =>  AutoPostingOK::OK_PUBLIC_KEY,
            "method"            =>  "mediatopic.post",
            "gid"               =>  AutoPostingOK::OK_GROUP_ID,
            "type"              =>  "GROUP_THEME",
            "attachment"      =>   '{"media": [{"type": "link","url": "'.$PROTOCOL.'://'.$_SERVER["SERVER_NAME"].$arFields["DETAIL_PAGE_URL"].'"}]}',
            "format"=>"json"
         );
         
         $sig = md5(AutoPostingOK::arInStr($params).md5("{$ok_access_token}{$ok_private_key}"));
         $params["access_token"]=$ok_access_token;
         $params["sig"]=$sig;
         
         $result = json_decode(AutoPostingOK::getUrl("https://api.ok.ru/fb.do", "POST", $params), true);
         
         if (isset($result['error_code']) && $result['error_code'] == 5000) {
            AutoPostingOK::getUrl("https://api.ok.ru/fb.do", "POST", $params);
         }
         
         if (isset($result['error_code'])) {
            AddMessage2Log("Публикация элемента ID:{$arFields["ID"]} прошла с ошибкой: ".$result['error_code'].'. Текст ошибки: '.$result['error_code'].'. Ошибка данных: '.$result['error_data'], "iblock");
         }
      }
   }
} 
============= Обязательно укажите значение констант: OK_ACCESS_TOKEN, OK_PRIVATE_KEY, OK_PUBLIC_KEY, OK_GROUP_ID.
Укажите, элементы каких инфоблоков необходимо публиковать в одноклассники. Переменная $POSTING_IBLOCK.
Отчет об ошибках будет падать в файл /upload/posting_ok.txt

Публикация происходит успешно, ошибок не вываливает. Всем удачи!

Автор : bi3ks

Статус заказа в Одноклассниках

Автоматические оповещения ваших пользователей об изменениях статуса заказа через сообщения вашего сообщества в Одноклассниках.
Оповещения об изменении статусов заказа через сообщества в Одноклассниках, могут стать дополнительным удобством для Ваших пользователей и даже заменить оповещения через СМС сообщения. В отличии от оповещения через СМС, у пользователей появляется возможность для обратной связи с Вами через сообщения в Одноклассниках, что позволит улучшить сервис и быстрее реагировать на возникающие проблемы.
Преимущества оповещений через Одноклассники:
  • Низкая цена оповещений, по сравнению с СМС.
  • Возможность получения обратной связи через сообщения в Одноклассниках.
  • Оповещения через Одноклассники сочетают в себе доступность почтовой рассылки с эффективностью СМС сообщений.


Категория: Для интернет-магазина, Подписки и рассылки, Работа с заказами, Поддержка клиентов
Бесплатный модуль
Разработчик: Happy Santa

Категории : Новости Marketplace
Автор : bi3ks

Аспро: Некст — интернет-магазин


Аспро: Next – это универсальный интернет-магазин для товаров любой тематики с полноценной мультирегиональностью и посадочными страницами для каталога. Создан с учетом особых потребностей проектов, которые планируют развиваться и масштабироваться. Используйте безграничные возможности, чтобы создать свой уникальный интернет-магазин на основе готового решения!

Основные преимущества Аспро: Next:

  1. Ваш уникальный интернет-магазин на готовом решении. Легко и быстро изменяйте внешний вид главной страницы, каталога, разделов и отдельных элементов благодаря новым настройкам оформления.

  2. Заряжен на высокие продажи. Интеграция с 1С, службами доставки, системами оплаты, Яндекс.Метрикой и набор инструментов для повышения конверсии – все для того, чтобы продажи стартовали с первого дня запуска.

  3. Улучшенная адаптивность для идеального отображения на любых устройствах. Отдельные настройки для мобильной версии со свайп-меню и вариантами отображения шапки сайта.

  4. Расширенные возможности для SEO-продвижения. Настраиваемые блоки для SEO-текста, чистая микроразметка, автоматическая генерация метатегов, дополнительные возможности в виде посадочных страниц и мультирегиональности с отдельными метками для наименований и настройками для каждого региона. Выйти в топ будет легко!

  5. Инструменты для роста и масштабирования. Встроенная мультирегиональность и новая технологическая платформа позволят вам быстро и с минимальными затратами внедрять новый функционал и открывать новые представительства.

  6. Удобство для разработчиков. Аспро: Next станет отличной основой для разработки интернет-магазина. Благодаря новой технологической платформе и архитектуре вы сможете дорабатывать решение без костылей и страха потерять изменения при очередном обновлении.


====quote====
Впервые в решениях Аспро!
Мультирегиональность и конструктор посадочных страниц
Функционал, доступный на крупных проектах и в виде индивидуальных доработок, теперь есть и в готовом решении.
  • Конструктор посадочных страниц для SEO и рекламы. Создавайте неограниченное количество лендингов без программиста! Повышайте эффективность рекламы и получайте бонус в виде экономии на SEO-продвижении.
  • Продвинутая мультирегиональность для интернет-магазинов с представительствами в нескольких городах и регионах. Ваши посетители увидят не только актуальные контакты – в зависимости от их местоположения могут изменяться заголовки страниц, разделов, цены и остатки товаров! А благодаря автогенерации файлов robots.txt и sitemap.xml для региональных поддоменов ручной работы будет в разы меньше.


=============
Защитите себя от штрафов Роскомнадзора!

В Аспро: Next решена проблема соответствия интернет-магазина 152-ФЗ. Опция "Я согласен на обработку персональных данных» есть везде, где пользователь оставляет свои данные. Текст типового соглашения включен в поставку и расположен на отдельной странице.

Аспро: Next – универсальный интернет-магазин нового поколения. Адаптируется под любую тематику:

  • гаджеты и электроника
  • строительные материалы
  • бытовая техника
  • товары для активного отдыха и спорта
  • одежда, косметика и парфюмерия
  • сантехника
  • промышленные товары и запчасти
  • зоотовары и многое другое.
Хотите узнать, как будет выглядеть ваш интернет-магазин на основе Аспро: Next? Получите демо-доступ к тестовой версии решения и примерьте свой контент!

Категория: Готовые интернет-магазины, Бытовая техника и электроника, Одежда
Цена: 29900 руб.
Разработчик: Аспро

Категории : Новости Marketplace
Автор : bi3ks
Теги : marketplace

ФЗ-152, «Пользовательское соглашение на обработку персональных данных» в форме восстановления пароля

В процессе добавления галочек "Пользовательского соглашения..." во все формы на сайте, столкнулся с некоторой особенностью формы восстановления пароля.
Учитывая неопределённость законодательства, решил добавить галочку и в эту форму, поскольку пользователь отправляет в ней свой e-mail, а в данном проекте ещё и телефон.
Особенность заключалась в том, что даже переместив компонент system.auth.forgotpasswd в свой неймспейс добраться до самой отправки письма с контрольной строчкой нельзя. В компоненте этого ничего нет.
Соответственно и запретить отправку данных, если в форме не отмечена галочка компонент тоже никак не позволяет.
Решением было сделать свой обработчик на событие OnBeforeUserSendPassword - он вызывается как раз перед отправкой письма восстановления
Далее в нём достаточно проверить, передана ли галочка и вызвать исключение, если не передана с соответствующим сообщением.
Примерный код обработчика:
====code====

function OnBeforeUserSendPassword(&$arFields) {

    //Проверяем, установлена ли галочка на чекбоксе согласия
    if ((!isset($_POST["accept_agreement"])) || ($_POST["accept_agreement"] != 1)) {
        global $APPLICATION;
        $APPLICATION->throwException("Подтвердите согласие с "Пользовательским соглашением об обработке персональных данных"");
        return false;
    }

}
=============

Автор : bi3ks

Проблемы производительности сайтов на «1С-Битрикс»

Мы провели более ста аудитов производительности сайтов, и проблемы, которые мы находим в проектах, довольно типичны. В сегодняшней статье мы расскажем не только об этих распространенных проблемах, но еще и об интересных редких ситуациях, с которыми приходилось сталкиваться. С 2015 года компания ITSumma  выполняем официальную услугу «1С-Битрикс» — аудит производительности сайтов. … Continue reading

Категории : Статьи
Автор : bi3ks

Формы, персональные данные и закон ФЗ-152

create.png
Добрый день, коллеги!

С 1 июля 2017 года существенно ужесточена административная ответственность за нарушения при взаимодействии с персональными данными физических лиц.
Поправки касаются, в том числе, разработчиков, чьи компоненты собирают персональные данные о посетителях.

Каждая форма, которая собирает, к примеру, имя, фамилию, email или телефон, должна запрашивать согласие пользователя на обработку персональных данных.

Мы в обновлении главного модуля 17.0.9 выпустили набор инструментов, который поможет вам соответствовать закону ФЗ-152 о персональных данных.
Начну с того, что в административном разделе в меню появился новый пункт:
Настройки -> Настройки продукта -> Соглашения



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

Мы рассмотрим как включить поддержку соглашений в ваших компонентах на примере компонента подписки на рассылку sender.subscribe.


1. Выбор.

Сделаем в параметрах компонента выбор соглашения для вывода.
Для этого в файле параметров вашего компонента .parameters.php достаточно объявить параметр "USER_CONSENT" => array() и появится раздел с параметрами настройки:
====code====
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arComponentParameters = array(
    "GROUPS" => array(
    ),
    "PARAMETERS" => array(
     "AJAX_MODE" => array(),
     "USER_CONSENT" => array(),
    )
); 
=============
Теперь в настройках компонента появились вот такие настройки:

parametry komponenta.png



2. Вывод в форме.

Для вывода нужно использовать компонент main.userconsent.request.
Он выводит чекбокс с подписью, по нажатию на которую выводится окно с текстом соглашения.
Окно с текстом адаптивное и уже сделано и под мобильные устройства.

vyvod.png

Также, компонент умеет сохранять полученное согласие.
Само согласие будет в списке, показываемым в по клику в пункте "Полученные согласия" в контекстом меню соглашения на списке.

Компонент main.userconsent.request нужно подключить в шаблоне вашего компонента перед кнопкой отправки формы.
Есть два вида форм:
- один стандартная get/post отправка формы с событием submit;
- отправка через ajax и иные механизмы, реализованные в js, то есть без события submit у формы.
Для них нужно по разному использовать компонент.

1) Простая форма с событием submit.

Подключаем компонент main.userconsent.request перед кнопкой отправки формы
====code====
<fo rm method="POST">
    <input name="EMAIL" placeholder="Email">
    <input name="PHONE" placeholder="Телефон">
    <input name="NAME" placeholder="Имя">
    <br>
    <?if ($arParams['USER_CONSENT'] == 'Y'):?>
     <?$APPLICATION->IncludeComponent(
      "bitrix:main.userconsent.request",
      "",
      array(
          "ID" => $arParams["USER_CONSENT_ID"],
          "IS_CHECKED" => $arParams["USER_CONSENT_IS_CHECKED"],
          "AUTO_SAVE" => "Y",
          "IS_LOADED" => $arParams["USER_CONSENT_IS_LOADED"],
          "REPLACE" => array(
           'button_caption' => 'Подписаться!',
           'fields' => array('Email', 'Телефон', 'Имя')
          ),
      )
     );?>
    <?endif;?>
    <input type="submit" name="subscribe" value="Подписаться!">
</form> 
=============
Указанные в примере параметры $arParams появятся в шаблоне вашего компонента при наличии
в .parameters.php блока "USER_CONSENT" => array()

В параметре REPLACE передается
- button_caption, название кнопки отправки формы;
- fields, массив названий полей, которые попадут в текст соглашения.


2) Форма без события submit(ajax и пр).

В компонент нужно передать в параметре SUBMIT_EVENT_NAME название события, при котором появится окно запроса согласия.
Далее, нужно добавить обработчик события принятия соглашения.
Если обработчик поймает событие - значит, согласие получено и можно отправлять форму/данные или выполнять какое-то действие.
====code====
<div id="my_container">
    <input type="text" placeholder="Электронный адрес" name="EMAIL">
    <input type="submit" id="fire_event" value="Отправить">
    <br>
    <?if ($arParams['USER_CONSENT'] == 'Y'):?>
        <?$APPLICATION->IncludeComponent(
            "bitrix:main.userconsent.request",
            "",
            array(
                'ID' => $arParams["USER_CONSENT_ID"],
                "IS_CHECKED" => $arParams["USER_CONSENT_IS_CHECKED"],
                "IS_LOADED" => "Y",
                "AUTO_SAVE" => "N",
                'SUBMIT_EVENT_NAME' => 'my-event-name',
                'REPLACE' => array(
                    'button_caption' => 'Отправить',
                    'fields' => array('Электронный адрес')
                ),
            )
        );?>
    <?endif;?>
</div>
    
<sc ript type="text/javascript">
BX.ready(function () {

    var submitBtn = BX('fire_event');
    BX.bind(submitBtn, 'click', function(){
        BX.onCustomEvent('my-event-name', []);
    });

    if (!BX.UserConsent)
    {
        return;
    }
    var control = BX.UserConsent.load(BX('my_container'));
    if (!control)
    {
        return;
    }
    
    BX.addCustomEvent(
        control,
        BX.UserConsent.events.save,
        function (data) {
            console.log('js event:', 'save', data);
            // успешно!
            // отправляем ajax 
            // или другие действия
        }
    );
    
});
</sc ript>
=============

3. Сохранение согласия.

В параметрах компонента есть параметр AUTO_SAVE.
Если его значение равно Y, то согласие автоматически сохраняется компонентом.

Если вам нужно сохранить согласие самим, то передайте значение N.
А для ручного добавления согласия вызовите следующий код:
====code====
   BitrixMainUserConsentConsent::addByContext( 
       $arParams["USER_CONSENT_ID"]
   );
=============

Теперь у вас есть инструмент, с помощью которого вы можете быстро привести свои компоненты в соответствие закону, а также помочь соответствовать вашим клиентам.

Есть еще то, что не описал:
- добавление своего источника данных;
- при просмотре согласий вывод связи со своей сущностью;
- кейс использования в виде ссылок;
- дополнительные компоненты выбора и просмотра.

Если вам эта тема интересна - пишите в комментариях, добавим в статью доп информацию.


.
Подробнее...

Категории : Новости Битрикс
Автор : bi3ks
Теги : новости
1 2 3 6
Страница 1 из 6