Вот и все. На редакции "Малый Бизнес" 11.0.4 все работает. По аналогии можно сделать и с компонентом "bitrix:sale.order.full". Если вы используете модуль "Расширенные уведомления о заказах", то править придется /bitrix/modules/bestrank.salemail/include.php, надеюсь ребята не обидятся, что я влез в их код
Добрый день Егор. На сегодня (05,02,2019) Ваше решение устарело. Файл component.php - это старый код компонента bitrix:sale.order.ajax, сейчас используются class.php и ajax.php Не подскажете как сейчас решить данный вопрос(Артикул в уведомлении о заказе)? Модуль выше у меня не пошел.
Недавно понадобилось для одного проекта сделать автоматическую публикацию материалов в основные социальные сети: вконтакте, facebook, twitter и одноклассники.
Для публикации в одноклассники и другие социальные сети у разработчика есть платная версия модуля http://marketplace.1c-bitrix.ru/solut...stingplus/ Но, судя по обсуждениям и реакции разработчика на вопросы, данный модуль длительное время не обновлялся и публикация в одноклассники не работает. Длительное ожидание ответа от разработчика и ручная публикация ссылок в группе в одноклассниках, заставили подумать о собственном решении данного вопроса. Покопался в интернете и нашел несколько полезных статей: http://shtyrlyaev.ru/all/skript-avtop...lassnikov/ - о том как создать приложение и произвести необходимые настройки. http://dampi.ru/posting-v-gruppu-v-od...ki-s-sayta - непосредственно сам код для публикации.
Задача следующая: После добавления материала в инфоблок по событию OnAfterIBlockElementAdd проверять на соответствие разрешенному IBLOCK_ID и производить публикацию.
Сам код необходимо разместить в файле /bitrix/php_interface/init.php:
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);
AddMessage2Log("Повторная попытка публикации элемента ID:{$arFields["ID"]}", "iblock");
}
if (isset($result['error_code'])) {
AddMessage2Log("Публикация элемента ID:{$arFields["ID"]} прошла с ошибкой: ".$result['error_code'].'. Текст ошибки: '.$result['error_msg'].'. Ошибка данных: '.$result['error_data'], "iblock");
}
}
}
}
Обязательно укажите значение констант: OK_ACCESS_TOKEN, OK_PRIVATE_KEY, OK_PUBLIC_KEY, OK_GROUP_ID. Укажите, элементы каких инфоблоков необходимо публиковать в одноклассники. Переменная $POSTING_IBLOCK. Отчет об ошибках будет падать в файл /upload/posting_ok.txt
Публикация происходит успешно, ошибок не вываливает. Всем удачи!
1. Что за костыль с обработкой 5000 ошибки? 2. Почему отправка повторного запроса в случае этой ошибки никак не фиксируется в итоговом $result 3. Описание ошибки не приходит или у вас просто опечатка при логировании номера и текста ошибки?
1. Что за костыль с обработкой 5000 ошибки? 2. Почему отправка повторного запроса в случае этой ошибки никак не фиксируется в итоговом $result 3. Описание ошибки не приходит или у вас просто опечатка при логировании номера и текста ошибки?
1. На случай, если ок тупанет внутри себя. 2. Добавил строку. 3. Поправил.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».