Точнее, если бы это было так просто, я бы об этом не писал
Задача
Представим такую задачу: нужно разработать форму, изменения из которые будут приняты только в том случае, если пользователь правильно введёт свой текущий пароль. Пример такой формы можно увидеть, к примеру, на free-lance.ru (Настройки → Основные настройки).
Проблема
Предположим, что проблем с у формой у нас не возникло. Но вот беда, как проверить пароль из формы на соответствие текущему паролю пользователя? К сожалению, стандартной функции в API Битрикса я для этого не нашёл.
Всё проблемы имеют решение
Сначала я подумал, что в поле PASSWORD Битрикс хранит простой MD5-хеш от пароля. Но всё оказалось не всё так-то просто
Оказывается, Битрикс прибявляет к паролю так называемую "соль" (подробности — в спец. литературе). Покопавшись в метода CUser::Login() можно узнать и алгорим сверки. А дальше дело за маленьким: реализовать этот алгорим у себя.
Модуль REST в БУСе. Как с ним работать. В 18 версии БУС появился модуль rest открывающий возможность получать с сайта данные по rest api. Как по мне так rest api в БУС не хватало достаточно сильно, особенно учитывая всевозможные fron-end технологии типа react/vue с серверным рендерингом. Вообще кастомизация некоторых компонентов битрикса это ад адский, к примеру компонент оформления заказа. Поэтому разделение back-end и front-end + серверный рендеринг мне кажется очень удобным и гибким подходом. Да, на back-end можно сделать вывод нужных данных в json и этого уже хватит для большинства задач. Но вот когда надо не просто отдать данные о товарах или новостях, а сделать оформление заказа или отслеживание тех-же заказов, то на реализацию подобного потребуется больше времени нежели простой вывод списка новостей в json. У меня скоро стартует проект по разработке мобильного приложения и хотелось уже узнать, как работать с rest в БУСе. Лучше ведь делать на том, что есть «в коробке» т.к. хочется верить, что там все продумано с учетом всех особенностей платформы. В поддержке мне не помогли разобраться с модулем, сказав, что документация в разработке, а принципиально rest бус - это rest b24. Я до этого не работал с b24 api и поэтому не знал, как и что там устроено. Для начала работы с Б24 через rest нужно создать приложение через специальную форму, но вот как создать приложение в БУСе? В админке БУСа нету раздела с приложениями. Я напрямую задал вопрос в поддержку "Как добавить приложение в БУСе (REST) ?" и получил ответ:
Вы можете разместит компонент bitrix:rest.marketplace.localapp на странице и добавлять приложения в БУСе
Что я и сделал. Разместив компонент, мы увидим точно такую же форму добавления приложения, как и в Б24. Указываем название приложения, ставим галочку «Приложение использует только API», указываем права доступа, указываем ссылку на приложение, жмем «сохранить». Для прав доступа я указал только user т.к. почти все остальное из Б24 и для моих целей не подходит и в списке не хватает многого, например sale (как я выяснил позже доступа к iblock, catalog нету в принцепе). В ответ получаем «Код приложения», «Ключ приложения». Теперь все как в Б24 за исключением нескольких мелочей. Отправляем запрос на https://<ваш сайт>/oauth/authorize/?client_id=< Код приложения >. Нас кинет на авторизацию, если мы не авторизованы. Потом нас кинет на url, который мы указали при его создании с GET параметрами. Далее получаем токен как в б24. Получив токен, мы можем работать с rest. Если модуль rest установлен, то уже можно запрашивать url /rest/ к Вашему сайту. В файле /bitrix/modules/rest/services/rest/index.php уже размещен компонент который отвечает за арботу с rest, bitrix:rest.provider с указанием url /rest/ в качестве url для rest. А внутри этого компонента вызывается другой компонент bitrix:rest.server, в котором указано, что он использует класс CRestProvider. В CRestProvider описаны несколько методов для rest напрмиер methods, который выводит список доступных методов согласно вашему уровню доступа, указанному при создании приложения. Если передать этому методу параметр FULL=true, то получим все возможные методы на данным момент. Для того чтобы получить список платежных систем я так понимаю служит метод sale.paysystem.list, но при его вызове получаем ошибку sale.paysystem.list. Для получения списка платежных систем нужно иметь доступ к sale и pay_system. Но в списке уровней доступа нету этих пунктов. А раскуривать коды компонента добавить эти уровни чет уже и не хочется, сложно все это. Похоже, что все это абсолютно не пригодно к использованию.
Добрый день! Большое спасибо за данную статью. А можно ли где то найти более подробное описание данного модуля? Тоже стоит задача реализовать апи, только обращение к сайту будут идти с внешнего сервера. В данном случае с приложения для Windows( НЕ Битрикс24:) ). Или может сможете подсказать более верное решение?
Шевченко Вячеслав, здравствуйте! Помогите, пожалуйста, подключить api на сайте.
По вашей рекомендации добавил bitrix:rest.marketplace.localapp на странице(пробовал и в админку и в публичку). Форма выводится, но при нажатии на кнопку "Добавить" просто обновляется страница.
Этот способ ещё не устарел?
Сообщение вы написали в 2018 году, сейчас 2021, доки по api в бус так и нет 🤦♂️
echo "hello from mail.com.ru." | msmtp --debug -a site.ru test@site.ruгде site.ru - значение account в конфиге .msmtprc
пример конфига для яндекса
# smtp account configuration for site.ru account site.ru logfile /home/bitrix/msmtp_site.ru.log host smtp.yandex.ru port 587 from noreply@site.ru keepbcc on auth on user noreply@site.ru password *********** tls on tls_starttls on tls_certcheck off
Не помогают вариации настроек главного модуля для отправки почты и т.д.
Укажите тут /bitrix/admin/settings.php?lang=ru&mid=main&tabControl_active_tab=tab_mail&back_url_settings= "Дополнительный параметр для передачи функции mail:" -a site.ru (см. скрин)
Чтобы гуглю было проще искать: SUCCESS_EXEC='F' , b_event, не работает почта msmtprc
была у меня в закладках хорошая статейка, а щас вот открыл - а ее нет:( хорошо, хоть у гугла есть сохраненная копия страницы. автор, простите за репост без подписи ...
В веб-окружении Битрикса по-умолчанию стоит msmtp для отправки писем. Если ваш домен привязан к Яндекс.Почте для домена, и вы хотите отправлять почту через реально существующий почтовый ящик с авторизацией, вам придётся внести в файл конфигурации некоторые изменения, чтобы всё работало хорошо.
Файл /home/bitrix/.msmtprc:
account default
logfile /var/log/msmtp.log
host smtp.yandex.ru #(smtp.gmail.com - для гугла) #
port 587 # именно этот порт! #lkz гугля рекомендуют ставить 465, хотя в просторах сети читал, что и 587 подходит ...#
from robot@domain.ru
keepbcc on
auth on
user robot@domain.ru
password <password>
tls on
tls_starttls on # обязательно для Яндекс.ПДД
tls_certcheck off
И не задавайте слишком длинных паролей.
P.S: при работе с GMail вторую строку (tls_starttls) наоборот включать не нужно.
UPDATE 2014-09-08
полный файлик с настройками для gmail:
account default
logfile /var/log/msmtp.log
host smtp.gmail.com
port 587
from user@gmail.com
auth on
user user@gmail.com
password password
tls on
tls_starttls on
tls_certcheck off
keepbcc on
для корректности настройки можно выполнить из сервера команду:
php -r "mail('test@email.com', 'Test', 'Test');"
UPDATE 2014-12-02
Для проверки из сайта, в командную строку можно ввести код:
if (mail("moe_mylo@gmail.com","test subject", "test body","From: otpravitel@bitrix.ru"))
echo "Сообщение передано функции mail, проверьте почту в ящике.";
else
echo "Функция mail не работает, свяжитесь с администрацией хостинга.";
Только email-адресы ставьте ваши
P.P.P.S Перенес инструкцию (вместе с дополнениями) себе на сайт
Похоже отправка через Яндекс накрылась (по крайне мере у нас так - работала годами, теперь - всё - Яндекс против, что слегка завуалированно следует из ответа их техподдержки ). Настроил Гугл - работает, посмотрим, насколько долго это продлится .
В Битриксе, начиная с версии 7.1.3, появилась возможность переопределить стандартный механизм отправки почты.
Когда может быть полезен такой финт ушами? К примеру, когда в конторе есть какой-то централизованный сервис отправки почты, который должны использовать все приложения (SMTP-сервер на другой машине, веб-служба, что угодно). Для примера, рассмотрим GMail в качестве такого сервиса.[spoiler]
Механика простая: везде, где должна вызываться функция mail(), вызывается bxmail(). А уже в этой функции, перед вызовом стандартной функции mail(), Битрикс проверяет, определена ли функция custom_mail() и, если да, вызывает её вместо mail(). Соответственно, чтобы переопределить механизм отправки, нужно всего лишь написать функцию custom_mail() (в /bitrix/php_interface/init.php, к примеру (если хотим, чтобы такой механизм отправки действовал для всех сайтов на данной копии)).
Приступим к делу! Лично мне для отправки почты через GMail ближе всего Zend_Mail, но... Ни эта библиотека, ни другие не позволяют установить "сырые" заголовки для письма. А разбирать $additional_headers мне что-то не очень хочется. Следовательно, выбор перепадает на PEAR::Net_SMTP, как на механизм прямой работы с SMTP-сервером.
Итак, ближе к коду!
require_once 'Net/SMTP.php';
/**
* Отпраляем почту через SMTP-сервер GMail (пользователь: user@gmail.com).
*
* @see CEvent::HandleEvent()
* @see bxmail()
*
* @param string $to Адрес получателя.
* @param string $subject Тема.
* @param string $message Текст сообщения.
* @param string $additionalHeaders Дополнительные заголовки передаются Битриксом почти всегда ("FROM" передаётся здесь).
*
* @return bool
*/
function custom_mail($to, $subject, $message, $additionalHeaders = '')
{
/*
* Настройки можно (нужно) вынести в админку, но это уже домашнее задание :)
*/
$smtpServerHost = 'ssl://smtp.gmail.com';
$smtpServerHostPort = 465;
$smtpServerUser = 'user@gmail.com';
$smtpServerUserPassword = 'password';
if (!($smtp = new Net_SMTP($smtpServerHost, $smtpServerHostPort))) {
return false;
}
if (PEAR::isError($e = $smtp->connect())) {
return false;
}
if (PEAR::isError($e = $smtp->auth($smtpServerUser, $smtpServerUserPassword))) {
return false;
}
preg_match('/From: (.+)\n/i', $additionalHeaders, $matches);
list(, $from) = $matches;
$smtp->mailFrom($from);
$smtp->rcptTo($to);
/*
* Получаем идентификатор конца строки у Битрикса.
*/
$eol = CAllEvent::GetMailEOL();
$additionalHeaders .= $eol . 'Subject: ' . $subject;
if (PEAR::isError($e = $smtp->data($additionalHeaders . "\r\n\r\n" . $message))) {
return false;
}
$smtp->disconnect();
return true;
}
Вынесение настроек в админку, создание статического объекта соединения (чтобы не тратить время при отправке множества писем за раз) — это всё задания на дом
Добрый день. Запутался маленько, получается с помощью данного механизма можно разделить почту по типам. В стиле информация о задачах с 1 почты, информация о событиях календаря с другой?
CRM-формы - инструмент, который многим знаком не понаслышке, в том числе и разработчикам Bitrix24. Порой на сложных сайтах приходится не просто передавать в CRM то, что вобьет в полях формы посетитель, но и различную дополнительную информацию.
Вопросов с тем, как передать в Bitrix24 значения полей, которые не размещены на этой форме, не возникает, это доходчиво описано вот здесь - https://helpdesk.bitrix24.ru/open/6200265/. Непонятно было, как это сделать, если вебформа уже подгружена, а нужные значения вдруг претерпели изменения в процессе действия посетителя сайта.
Конкретный пример на сайте https://dia-box.ru - карточки товаров закрываются без перезагрузки страницы, открываются новые, а форма для передачи заявки на товар, в обязанности которой входит донести до CRM, какой именно товар имеется в виду - уже подгружена.
Осталось скрестить одно с другим - передавать в функцию, которая обновляет параметры для загрузки формы, и пресеты, и значения полей. И вызвать при клике на кнопку.
Итак, функция для переопределения параметров CRM-формы приняла такой вид (добавлены пресеты и значение для полей):
Эти переменные определяются при загрузке карточки товара. По клику на кнопку они передаются в функцию, которая переделывает форму, как в примере выше по ссылке
var reinitForm = function (presets, fields) {
if(!window.Bitrix24FormObject || !window[window.Bitrix24FormObject])
return;
if(!window[window.Bitrix24FormObject].forms)
return;
Bitrix24FormLoader.unload(b24paramsload);
b24paramsload = initForm(presets, fields);
Bitrix24FormLoader.params = b24paramsload;
Bitrix24FormLoader.init();
Bitrix24FormLoader.showPopup(b24paramsload);
}
.......
//тем временем при загрузке карточки
presets = {"izdelie": ''+element.ITEM.NAME};
.......
BX.ready(function () {
BX.bind(
BX('portfolio_detail_form_open'),
'click',
BX.delegate(
function(e){
e.preventDefault();
//console.log(e); //посмотреть на Иван Иваныча
reinitForm(presets, {"values": { "LEAD_COMMENTS" : 'Хочу такое же - ' +presets.izdelie}});
}, this
)
);
});
Настройка CRM-формы и что получаем в результате (со всеми вытекающими):
У нас клиент заметил это обновление - все кнопки "купить/заказать" стали нерабочими. И документации толком никакой нет, записки блогеров только, ну кнопочку там какую нажать только можно узнать.
Отсутствие электронной почты у посетителя сайта может стать причиной несовершившегося заказа в интернет-магазине. да, и такое бывает! Замечательно, давайте сделаем свойство заказа "имейл" необязательным полем. Снимаем галочку, но нет же - компонент sale.order.ajax все-равно ругается, что поле email не заполнено. И даже снятая галочка в настройках главного модуля "E-mail является обязательным полем:" не помогает. Что делать? Лезем в код компонента sale.order.ajax, узнаем что разработчики догадались впихнуть туда обработчики событий, на которых мы бы с радостью и "выехали", но вызовы обработчиков находятся после проверки $_POST в компоненте, поэтому и тут разочарование. Придется либо кастомить логику компонента, либо говнохардкодить прямо в init.php. Из двух зол, я выбрал второе, поскольку уж очень не хочется один из важнейших компонентов оставлять не обновляемым системой.
Итак, намутил вот такой кондовый способ, который особо не тестировал, поэтому собираем консилиум, критикуем и предлагаем: init.php:
// ORDER_PROP_2 - свойство заказа "телефон"
// ORDER_PROP_3 - свойство заказа "email"
global $APPLICATION;
if ('/personal/order/make/' == $APPLICATION->GetCurDir()) // урл страницы оформления заказа
{
$sOrderPropPhone = '';
if (isset($_POST['ORDER_PROP_2'])) // эту секцию if можно вообще удалить, если у вас телефон не обязательное поле
{
$sOrderPropPhone = filter_var($_POST['ORDER_PROP_2'], FILTER_SANITIZE_NUMBER_INT); // аналог preg_replace("/[^0-9,+,-]/","",$string);
}
// если и телефон не заполнен, тогда вместо него в мыле будет значение unix времени
// это нужно только для того чтобы не выводить ошибку "имейл не заполнен", т.к. телефон у нас все-равно обязательное поле
if (0 == strlen($sOrderPropPhone))
{
$sOrderPropPhone = time();
}
if ((!isset($_POST['ORDER_PROP_3']) || empty($_POST['ORDER_PROP_3'])))
{
$_POST['ORDER_PROP_3'] = $sOrderPropPhone."@mysite.ru";
}
}
Для универсальности невозбраняется предварительно узнать актуальный ORDER_PROP_ID и option SERVER_NAME.
Ну, а в шаблоне компонента sale.order.ajax, файл props.php
Т.е. проверяем, если выводится инпут для имейла и значение имейла содержит в себе наше фейкомыльце, то подменяем его на пустую строку, чтобы юзер внедоумении не видел под каким имейлом он будет в БД.
и чуть выше по коду файла props.php место где выводится label для инпута:
Мишин Евгений, в этом движке реализована целая куча других мелочей Не переживайте, вы правильно вложили свои средства. 10 лет работаю с этим движком, он того стоит
Сегодня пробовал снять галочку в главном модуле, убрать галочку обязательности в настройках свойств заказа у свойства "емайл", после чего заказы стали оформляться без емайла свободно через компонент sale.order.ajax. Никакого кодирования не понадобилось!!! Все заработало само, после нужных настроек системы.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».