Настройки формы инфоблоков для пользователя находятся в табличке
b_user_option
Настройки формы инфоблоков для пользователя находятся в табличке
b_user_option
Создание своего модуля на битрикс
Была задача, составить список популярный страниц на сайте и вывести их как рекомендованные для пользователя.
На сайте стоит яндекс метрика, а яндекс через api предлагает получить список популярных страниц.
Написал две функции, которые справляются с поставленной задачей.
// отправляем запрос курлом
function getTokenYandex2($url,$peremen,$headers) {
$post_arr=array();
foreach ($peremen as $key=>$value) {
$post_arr[]=$key."=".$value;
}
$data=implode('&',$post_arr);
$handle=curl_init();
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
$response=curl_exec($handle);
$code=curl_getinfo($handle, CURLINFO_HTTP_CODE);
return array("code"=>$code,"response"=>$response);
}
function getInfoYandex($token){
$startTime = strtotime(date('Y-m-d')." -1 month");
$startTime=date("Ymd",$startTime);
$ch = curl_init( 'http://api-metrika.yandex.ru/stat/content/popular?id=____ID___5&per_page=500&date1='.$startTime.'&date2='.date('Ymd', time()));
// получать заголовки
curl_setopt ($ch, CURLOPT_HEADER, 0);
// если ведется проверка HTTP User-agent, то передаем один из возможных допустимых вариантов:
curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');
// авторизация в яндекс по токену
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth '.$token, 'Accept: application/x-yametrika+json', 'Content-Type: application/x-yametrika+json'));
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10 );
curl_setopt ($ch, CURLOPT_TIMEOUT, 10 );
// возвращать результат работы
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
// не проверять SSL сертификат
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
// не проверять Host SSL сертификата
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
// следовать редиректу
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
// выполнить запрос
curl_exec ($ch);
// получить результат работы
$result = curl_multi_getcontent ($ch);
return json_decode($result);
}
первая функция, getTokenYandex2 для получения токена, у вас должна быть учетка в яндекс метрике.
вторая функция getInfoYandex возвращает массив из списка популярных страниц.
Все это вызывается вот так:
// вызываем функцию получения токена
$result=getTokenYandex2("https://oauth.yandex.ru/token",
array(
'grant_type'=> 'password', // тип авторизации
'username'=> '_____ВАШ__ЛОГИН________',
'password'=>'______ВАШ_ПАРОЛЬ_____________',
'client_id'=>'_____КЛИЕНТ_ID__ПОЛУЧАЕМ_В_ЯНДЕКС_API___________',
'client_secret'=>'______ПОЛУЧАЕМ_В_ЯНДЕКС_API___________',
),
array('Content-type: application/x-www-form-urlencoded','Connection: close')
);
$token=json_decode($result['response']);
// спрашиваем у яндекса, какие страницы популярны
$listPageYandex=GetInfoYandex($token->access_token);
в итоге у нас массив из популярных страниц, дальше находил эти страницы в bitrix и менял им вес.
PS. Список популярных страниц запрашивается за последний месяц.
PPS.
В начале я не понял, как получить токен автоматом. Везде на яндекс было написано, что пользователь вроде сам попадает на страницу авторизации яндекса, и там авторизуется, а тебе кэлбеком возвращается токен.
Замутил даже на сокете авторизацию ![]()
$sock=fsockopen('ssl://oauth.yandex.ru', 443); // curl замена
$fields="grant_type=password&username=LOGIN&password=PASSWORD&client_id=400000000000000000000000000000&client_secret=4000000000000000000003";
$msg="POST /token HTTP/1.1\r\nHost: oauth.yandex.ru\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nContent-Length: ".(strlen($fields))."\r\n\r\n".$fields."\r\n\r\n\r\n";
fwrite($sock, $msg);
$resp='';
while (!feof($sock)) {
$resp.=fgets($sock, 128);
};
fclose($sock);
$arr=Array();
preg_match_all("/{.*?}/", $resp, $arr);
$json=json_decode($arr[0][0]);
var_dump($json);
Это в принципе работает, но курлом как то правильнее что-ли.
Тут кстати есть подводные камни, сервер яндекс все никак не хотел закрывать соединения, пока не добавил Connection: close.
Есть задачка, прочитать excel файл, напротив каждого региона есть запись. Нужно регион сопоставить с его ID в bitrix и дальше методом add добавить.
Написал такую функцию
function getNumberRegion($name){
$arrayRegion=array(
38285=>'Брянская область',
38284=>'Владимирская область',
38283=>'Волгоградская область',
38282=>'Вологодская область',
38281=>'Воронежская область',
38280=>'Еврейская автономная область',
38279=>'Ивановская область',
38278=>'Иркутская область',
38277=>'Калининградская облатсь',
38276=>'Калужская область',
38275=>'Кемеровская область',
38274=>'Кировская область',
38273=>'Костромская область',
38272=>'Курганская область',
38271=>'Курская область',
38269=>'Липецкая область',
38268=>'Магаданская область',
38267=>'Москва',
38265=>'Мурманская область',
38264=>'Республика Адыгея',
38263=>'Нижегородская область',
38262=>'Республика Алтай',
38261=>'Республика Башкортостан',
38260=>'Новгородская область',
38259=>'Новосибирская область',
38258=>'Республика Бурятия',
38257=>'Республика Дагестан',
38256=>'Омская область',
38255=>'Республика Ингушетия',
38254=>'Кабардино-Балкарская республика',
38253=>'Оренбургская область',
38252=>'Орловская область',
38251=>'Пензенская область',
38250=>'Псковская область',
38249=>'Ростовская область',
38248=>'Рязанская область',
38247=>'Самарская область',
38246=>'Санкт-Петербург',
38245=>'Саратовская область',
38244=>'Сахалинская область',
38243=>'Свердловская область',
38242=>'Смоленская область',
38241=>'Тамбовская область',
38240=>'Тверская область',
38239=>'Томская область',
38238=>'Тульская область',
38237=>'Тюменская область',
38236=>'Ульяновская область',
38235=>'Челябинская область',
38234=>'Ярославская область',
38233=>'Ханты-Мансийский автономный округ - ЮГРА',
38232=>'Чукотский автономный округ',
38231=>'Ямало-Ненецкий автономный округ',
38230=>'Республика Калмыкия',
38229=>'Карачаево-Черкесская республика',
38228=>'Республика Карелия',
38227=>'Республика Коми',
38226=>'Республика Марий Эл',
38225=>'Республика Мордовия',
38224=>'Республика Саха (Якутия)',
38223=>'Республика Северная Осетия-Алания',
38222=>'Республика Татарстан',
38221=>'Республика Тыва',
38220=>'Удмуртская республика',
38219=>'Республика Хакасия',
38218=>'Чеченская республика',
38217=>'Чувашская республика',
38216=>'Забайкальский край',
38215=>'Камчатский край',
38214=>'Краснодарский край',
38213=>'Красноярский край',
38212=>'Пермский край',
38211=>'Приморский край',
38210=>'Ставропольский край',
38209=>'Хабаровский край',
38208=>'Амурская область',
38207=>'Архангельская область',
38206=>'Астраханская область',
38190=>'Ленинградская область',
38189=>'Белгородская область',
38188=>'Алтайский край',
38185=>'Московская область',
);
// в нижний регистр массив
array_walk_recursive($arrayRegion, function (&$item, $key) { if (is_string($item)) $item = mb_strtolower($item); });
return array_search(mb_strtolower(trim($name)),$arrayRegion,true);
}
function delc2a0($str){
return str_replace("\xc2\xa0", '', $str);
}
подаем на функцию регион, он возвращает его номер, ничего сложного.
PS функция delc2a0 для удаления мусора, когда читаем excel.