Битрикс набор функций ч.2

Ресайз картинок

$path = CFile::GetPath($arFields['UF_FILE']);
$arFileArr = CFile::MakeFileArray($path);
 $img_new = CAllFile::ResizeImage($arFileArr, array( "width" => 100, "height" => 100 ), BX_RESIZE_IMAGE_EXACT, false);
   $fileId = CFile::SaveFile($arFileArr,  '/new_imgs/' );
 $new_arr = CFile::MakeFileArray($fileId);

Файлы в поле со свойством Множественное

$file1 = $_FILES['fileselect'];
$files = [];
if(count($file1['name']) > 0){
	foreach ($file1['error'] as $key => $err) {
		if($err ==  UPLOAD_ERR_OK){
			$name = basename($file1['name'][$key]);
			$path = $_SERVER["DOCUMENT_ROOT"].'/upload/my_files/'.$name;
			$res2 = move_uploaded_file($file1['tmp_name'][$key], $path);
			if($res2 == true)
				$files[] = cfile::makefilearray($path);
		}

	}
}

JSON в тег

<div class="" data-gabarites-sum='<?=json_encode($arResult['GABARITES_SUM'], false); ?>'>

Куки

// должен быть подключен хедер, иначе не запишеться
$APPLICATION->set_cookie("user_profile_open", 'reg,personal,work,admin,user_properties', time()+60*60*24*30*12*2, "/");

$arResult["COOKIE_PREFIX"] = COption::GetOptionString("main", "cookie_name", "BITRIX_SM");
if (strlen($arResult["COOKIE_PREFIX"]) <= 0) 
	$arResult["COOKIE_PREFIX"] = "BX";
var_dump($_COOKIE[$arResult["COOKIE_PREFIX"]."_user_profile_open"]);

Количество записей

CDBResult::SelectedRowsCount()

Купоны и скидки

\Bitrix\Main\Loader::includeModule('sale');

\Bitrix\Sale\DiscountCouponsManager::clear(true);
\Bitrix\Sale\DiscountCouponsManager::clearApply(true);

$sCoupon = $_REQUEST['COUPON'];
\Bitrix\Sale\DiscountCouponsManager::add($sCoupon);
$oBasket = \Bitrix\Sale\Basket::loadItemsForFUser(
     \Bitrix\Sale\Fuser::getId(),
     \Bitrix\Main\Context::getCurrent()->getSite()
);
$oDiscounts = \Bitrix\Sale\Discount::loadByBasket($oBasket);
$oBasket->refreshData([ 'PRICE' ,  'COUPONS']);
$oDiscounts->calculate();
$result = $oDiscounts->getApplyResult();
$oBasket->save();

Обновление basket.basket.line

BX.onCustomEvent('OnBasketChange');

Кеширование

$obCache = new CPHPCache();
$cacheLifetime = 86400*7; 
$cacheID = 'AllItemsIDs'; 
$cachePath = '/'.$cacheID;

// удалить кеш
// $obCache->CleanDir($cachePath);

if( $obCache->InitCache($cacheLifetime, $cacheID, $cachePath) )
{
   $vars = $obCache->GetVars();
   extract($vars);
   // или же 
   $arAllItemsIDs = $vars['arAllItemsIDs'];
}
elseif( $obCache->StartDataCache()  )
{
   $rs = CIBlockElement::GetList(array(), array(), false, false, array('ID'));
   while( $ar = $rs->Fetch() )
      $arAllItemsIDs[] = $ar['ID'];
   $obCache->EndDataCache(array('arAllItemsIDs' => $arAllItemsIDs));
}

print_r(count($arAllItemsIDs));

Ядро

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_after.php");

Передать переменные из result_modifier.php в component_epilog.php

$this->__component->arResultCacheKeys = array_merge($this->__component->arResultCacheKeys, array('PROPERTIES') );

Динамическая область в композитном режиме (отмена кеша)

https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=39&TYPE=Y

$frame = new \Bitrix\Main\Page\FrameBuffered("my_dynamic"); // или $this->createFrame() в шаблоне
$frame->begin();
  // Содержание динамической области
$frame->beginStub();
  // Заглушка
$frame->end();

или полная отмена

\Bitrix\Main\Data\StaticHtmlCache::getInstance()->markNonCacheable();

Удалить композитный кеш

$staticHtmlCache = \Bitrix\Main\Data\StaticHtmlCache::getInstance();
$staticHtmlCache->deleteAll();

Встроенная функция MobileDetect

$isMobile=\Bitrix\Main\Loader::includeModule('conversion') && ($md=new \Bitrix\Conversion\Internals\MobileDetect) && $md->isMobile();

Все поля пользователя

$res1 = CUser::GetList($by = 'name', $order = 'desc', ['ID' => $USER->GetID()], ['SELECT' => array('UF_*')]);
$user_fields = $res1->getnext();

Дата на русском

<?echo FormatDate("j F Y", MakeTimeStamp($element[0]['ACTIVE_FROM']));?>

bitrix яндекс карты

использую обратное геокодирование от яндекса для получения координат из адреса

https://tech.yandex.ru/maps/geocoder/doc/desc/concepts/input_params-docpage/

ключ апи обязателен

https://developer.tech.yandex.ru/

$arResult['POSITION']['yandex_scale']='18'; // масштаб карты
function my_curl_fun($url) {
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 $data = curl_exec($ch);
 curl_close($ch);
 return $data;
}
// внимание данный апи-ключ не работает!!!
$url = 'https://geocode-maps.yandex.ru/1.x/?format=json&geocode=' . urlencode($addr['TEXT']) . '&apikey=' . urlencode('baa57f62-1234-4afc-927b-13db42815ed9');
$response = my_curl_fun($url);

//var_dump($response);
$response = json_decode($response, true);
//pr($response);
$geo_object = $response['response']['GeoObjectCollection']['featureMember'];
$coord = isset($geo_object[0]) ? $geo_object[0]['GeoObject']['Point']['pos'] : $geo_object['GeoObject']['Point']['pos'];
var_dump($coord);
$coord = explode(' ', $coord);

$arResult['POSITION']['yandex_lon'] = $coord[0]; // долгота
$arResult['POSITION']['yandex_lat'] = $coord[1]; // широта

$APPLICATION->IncludeComponent(
	"bitrix:map.yandex.view", 
	".default", 
	array(
		"INIT_MAP_TYPE" => "MAP",
		"MAP_DATA" => serialize($arResult['POSITION']),
		"MAP_WIDTH" => "100%",
		"MAP_HEIGHT" => "350",
		"CONTROLS" => array(
			0 => "ZOOM",
			1 => "MINIMAP",
			2 => "TYPECONTROL",
			3 => "SCALELINE",
		),
		"OPTIONS" => array(
			0 => "ENABLE_SCROLL_ZOOM",
			1 => "ENABLE_DBLCLICK_ZOOM",
			2 => "ENABLE_DRAGGING",
		),
		"MAP_ID" => "MyMap".$_GET["id"],
	),
	false
);

Bitrix элементы инфоблока в меню

Добавить элементы инфоблока в меню как пункты не сложно.

<?

$arSelect = ["NAME", "DETAIL_PAGE_URL"];
$res = CIBlockElement::GetList(
 Array("SORT"=>"ASC"), // arOrder
 Array("IBLOCK_ID"=>IntVal(59)  , "ACTIVE" => "Y" ), // arFilter
 false, // arGroupBy
 false, // arNavStartParams
 $arSelect // arSelectFields 
);

while($ob = $res->GetNextElement(true, false)){ 
	 $arResult["ITEMS"][] = $ob->GetFields();  
	$aMenuLinks_child[] =  	Array(
		$ob->GetFields()['NAME'], 
		$ob->GetFields()['DETAIL_PAGE_URL'], 
		Array($ob->GetFields()['DETAIL_PAGE_URL']), 
		Array(
			"FROM_IBLOCK" => 1,
			"IS_PARENT" => 0,
			"DEPTH_LEVEL" => 2
		)
	);
}

$aMenuLinks = Array(
	Array(
		"Пункт меню", 
		"/punkt_link/", 
		Array("/punkt_link/"), 
		Array(
			"FROM_IBLOCK" => 1,
			"IS_PARENT" => 1,
			"DEPTH_LEVEL" => 1
		)
	),
);

$aMenuLinks = array_merge($aMenuLinks, $aMenuLinks_child);

где IS_PARENT, DEPTH_LEVEL задают вложенность.

Bitrix поиск по релевантности

Как вывести каталог на стр. поиска писал в прошлой статье /2018/09/12/выводим-каталог-на-странице-поиска-би/

  1. Для результата с учетом релевантности в компоненте bitrix:search.page убираем сортировку и оставляем по
    "USE_TITLE_RANK" => "Y",
    "DEFAULT_SORT" => "rank",

2. Создаем компонент с component.php, где будем тупо выводить элементы по найденным c помощью search.page идшникам. А шаблон остается от bitrix:catalog.section

(далее…)

Bitrix создание модуля часть 2 папка lib

Первая часть создания модуля в уроке http://phpjs.ru/2017/02/28/bitrix-создание-модуля/

Автолоад классов модуля довольно полезная вещь. Делается просто — закидываем классы в папку lib, к-я и заинклудиться полностью. Что важно учитывать.

https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=3524&LESSON_PATH=3913.5062.3524

В этом уроке подробно объясняется, как должны именоваться пространства имен класса. А именно, если модуль партнерский, напр. partner.module1 — namespace будет Partner\Module1. Если же не партнеский, а локальный, заменяем на Bitrix\Module1.

Bitrix подарки sale.gift.basket аяксом Часть 2.

Здесь появляется возможность добавить подарок в корзину аяксом, без перехода на сам товар.

Для этого в карточках выведем кнопку «Выбрать», добавим к нему урл и навесим обработчик, к-й аяксом добавит товар в корзину, отрисует позицию и пересчитает всю  сумму.  Согласитесь, не трудно же?

1. Находим в шаблоне sale.gift.basket кнопку BUY_LINK. Добавляем класс add_to_basket ссыль


href="action=add&id=<? echo $arItem['ID']; ?>

Стоит заметить, что кнопок там будет 2 — одна товар, 2-я — торговое предложение.
(далее…)

Bitrix подарки sale.gift.basket аяксом

Подарки выводяться в корзине компонентом sale.gift.basket. Надо выводить их аяксом сразу после применения купона. Шаблон компонента старый old_version_17. Новые .default и bootstrap_v4 написаны на mustache, там данный код не сработает.
1. Создаем спец. файл gifts.php в компоненте корзины. К нему пойдет аякс запрос. В него помещаем тот же компонент корзины, к-й будет выводить не корзину, а подарки. Делается это, потому как массивы $arResult[«APPLIED_DISCOUNT_LIST»] и $arResult[«FULL_DISCOUNT_LIST»] доступны только из-под корзины. Напрямую подарки не подключить. Для этого создадим отдельный шаблон корзины ajax_gift_template. (далее…)

bitrix умный фильтр красивый урл

Умный фильтр выдает урл вида
site.ru/tovars/filter/color-is-8e4e6038-474d-11e6-80e5-94de807e86a2/apply/
А нужен вида
site.ru/tovars/?filter=color-is-red&model-is-jbl
чтобы не индексировался.
Замена в catalog/index.php


		"SEF_URL_TEMPLATES" => Array(
			"smart_filter" => "#SECTION_CODE_PATH#/?filter=#SMART_FILTER_PATH#"

не полное решение.

(далее…)

Битрикс набор функций

Наверно, самый популярный метод — список элементов


$res = CIBlockElement::GetList(
  Array("SORT"=>"DESC") , // $arOrder 
  array('IBLOCK_ID'=>55), // $arFilter 
  false, // $arGroupBy 
  Array("nTopCount"=>10), // $arNavStartParams
        array('ID' , 'NAME') // arSelectFields
); 
while($ob = $res->GetNext(true, false)){
    print_r($ob );
}
(далее…)

Битрикс кастомизация умного фильтра

часто возникает задача поменять шаблон catalog.smart.filter — например, селект сделать картинками, а на range slider цен навесить свои ползунки. Разобраться в битриксовом винегрете из html, php, js можно в этом посте.
Шаблон условно легко поделить на фильтр по св-вам, к-е указали в админке (Магазин — Основной каталог товаров — Настройки каталога), и фильтр по ценам. Это 2 цикла с пометками //prices //not prices

(далее…)

Bitrix google recaptcha для компонентов

Добавим рекапчу от гугл в компоненты


1. blog.post.comment // комментарии в блоге
2. forum.topic.reviews // комментарии к статическим страницам
3. iblock.element.add.form // форма

Как подключать рекапчу писал в статье http://phpjs.ru/2017/07/18/google-captcha-v2/. А также, если не умеете работать с классами и композер, можно проверить капчу 3 строчками кода (см. в конце статьи).
Но это не есть красиво) Вынесем верификацию в ReCaptcha.php


    public function verifyCaptcha()
    {
        if ($_POST["g-recaptcha-response"]) {
            $resp = $rec->verify(
                $_POST["g-recaptcha-response"],
                $_SERVER["REMOTE_ADDR"]
            );
            return $resp->isSuccess();
        }
    }

(далее…)