Отмена наследования в разделах Битрикс

Подстановка имени раздела в базовый шаблон инфоблока. Для других свойств нужно дорабатывать.

if(intval($intSectionID) > 0){
    
    
    $arSection = CIBlockSection::GetByID($intSectionID)->GetNext();
	$sectionName = $arSection["NAME"];
    /*Отмена наследования для разделов*/
        $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues(
           $arParams["IBLOCK_ID"],
           $intSectionID // отдается компонентом bitrix:catalog.section
       );
       $iprops = $ipropValues->queryValues();
       $parents = $ipropValues->getParents();
       $parentId = $parents[0]->getId();
       $ipropParentValues = new \Bitrix\Iblock\InheritedProperty\SectionValues(
           $arParams["IBLOCK_ID"],
           $parentId
       );
       $iparentprops = $ipropParentValues->queryValues();
       
       $ipropMainValues = new \Bitrix\Iblock\InheritedProperty\SectionValues(
           $arParams["IBLOCK_ID"],
           0
       );
       $imainprops = $ipropMainValues->queryValues();
       
	   //echo "<pre>";
		//print_r($imainprops);
		//echo "</pre>";
        
       $metaTitle = $iprops["SECTION_META_TITLE"]["VALUE"];
       $metaTitleType = $iprops["SECTION_META_TITLE"]["ENTITY_TYPE"];
       if($metaTitleType!="B"){
		   
           if($metaTitle == str_replace("{=this.Name}",$sectionName,$iparentprops["SECTION_META_TITLE"]["TEMPLATE"])){
               $metaTitle = str_replace("{=this.Name}",$sectionName,$imainprops["SECTION_META_TITLE"]["TEMPLATE"]);
           }
           $APPLICATION->SetPageProperty("title",$metaTitle);
       }
       $metaH1 = $iprops["SECTION_PAGE_TITLE"]["VALUE"];
       $metaH1Type = $iprops["SECTION_PAGE_TITLE"]["ENTITY_TYPE"];
           if($metaH1 == str_replace("{=this.Name}",$sectionName,$iparentprops["SECTION_PAGE_TITLE"]["TEMPLATE"])){
			   
               $metaH1 = str_replace("{=this.Name}",$sectionName,$imainprops["SECTION_PAGE_TITLE"]["TEMPLATE"]);

           }
           $APPLICATION->SetTitle($metaH1);
		   
		   
       $metaDesc = $iprops["SECTION_META_DESCRIPTION"]["VALUE"];
       $metaDescType = $iprops["SECTION_META_DESCRIPTION"]["ENTITY_TYPE"];
       
       if($metaDescType!="B"){
           if($metaDesc == str_replace("{=this.Name}",$sectionName,$iparentprops["SECTION_META_DESCRIPTION"]["TEMPLATE"])){
               $metaDesc = str_replace("{=this.Name}",$sectionName,$imainprops["SECTION_META_DESCRIPTION"]["TEMPLATE"]);
           }
           $APPLICATION->SetPageProperty("description",$metaDesc);
       }
       $metaKey = $iprops["SECTION_META_KEYWORDS"]["VALUE"];
       $metaKeyType = $iprops["SECTION_META_KEYWORDS"]["ENTITY_TYPE"];
       if($metaKeyType!="B"){
           if($metaKey == str_replace("{=this.Name}",$sectionName,$iparentprops["SECTION_META_KEYWORDS"]["TEMPLATE"])){
               $metaKey = str_replace("{=this.Name}",$sectionName,$imainprops["SECTION_META_KEYWORDS"]["TEMPLATE"]);

           }
           $APPLICATION->SetPageProperty("keywords",$metaKey);
       }
/*Отмена наследования для разделов*/
}

Отправка данных чеков в Яндекс.Кассе 3.x

В файл /bitrix/modules/sale/handlers/paysystem/yandexcheckout/handler.php в метод getYandexPaymentQueryParams добавить строчки (в начало):

    $contact = "--";

    $collection = $payment->getCollection();
    $order = $collection->getOrder();
    $userEmail = $order->getPropertyCollection()->getUserEmail();
    $contact = ($userEmail) ? $userEmail->getValue() : '';
    $receipt = array(
        'email' => $contact,
        'items' => array(),
    );

    $basket = $order->getBasket();
    $basketItems = $basket->getBasketItems();
    foreach ($basketItems as $basketItem) {

        $receipt['items'][] = array(
            'quantity' => $basketItem->getQuantity(),
            'description' => substr($basketItem->getField('NAME'), 0, 128),
            'vat_code' => 1,
            'amount' => array(
                'value' => number_format($basketItem->getPrice(), 2, '.', ''),
                'currency' => 'RUB'
            ),
            'payment_mode' => 'full_prepayment',
            'payment_subject' => 'commodity'
        );
    }
    if ($order->getDeliveryPrice() > 0) {
        $receipt['items'][] = array(
            'quantity' => 1,
            'description' => substr('Доставка', 0, 128),
            'vat_code' => 1,
            'amount' => array(
                'value' => number_format($order->getDeliveryPrice(), 2, '.', ''),
                'currency' => 'RUB'
            ),
            'payment_mode' => 'full_prepayment',
            'payment_subject' => 'service'
        );
    }


Далее в массив $query добавить 'receipt' => $receipt

Все!

Как убрать одинаковые bxajaxid у компонентов в 1С-Битрикс

Столкнулся с необходимостью разместить кучу одинаковых компонентов на странице, и чтобы у всех работала постраничная навигация. В ajax, конечно. И опа — id у всех компонентов одинаковые; ясное дело — ничего не работает.

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

Сброс всего кеша сайта через API в 1С-Битрикс

// >= iblock 15.0.7
if (method_exists(‘\CIBlock’, ‘clearIblockTagCache’)) {

\CIBlock::enableClearTagCache();

foreach ($iblockIds as $iblockId) {
\CIBlock::clearIblockTagCache($iblockId);
}

\CIBlock::DisableClearTagCache();
} else {

BXClearCache(true);

(new \Bitrix\Main\Data\ManagedCache())->cleanAll();

(new \CStackCacheManager())->CleanAll();
}

if (
method_exists(‘\CHTMLPagesCache’, ‘IsCompositeEnabled’)
&& \CHTMLPagesCache::IsCompositeEnabled()
) {
\CHTMLPagesCache::CleanAll();
}

Авторизация и регистрация через Facebook в Битрикс

Invalid Scopes: user_friends. This message is only shown to developers. Users of your app will ignore these permissions if present. Please read the documentation for valid permissions at: https://developers.facebook.com/docs/facebook-login/permissions

Знакомо? А все вроде правильно?

По состоянию на 30.11.2018, Битрикс не выпустил соответствующего обновления модуля социальных сервисов.

Facebook опять что-то поменял, и теперь нужно изменить 1 строку в файле /bitrix/modules/socialservices/classes/general/facebook.php:

Было:

protected $scope = array(
«email»,
«user_friends»,
);

Стало:

protected $scope = array(
«email»,
«public_profile»,
);

Отображение изображений в умном фильтре для свойства «Привязка к элементам» в Битрикс

Копируем компонент в свое пространство имен

Передаем параметром массив тех свойств, что будут подменяться:

$arCustomProps = $arParams[«CUSTOM_PICTURE_PROPERTIES»];

if (!empty($arCustomProps) && !is_array($arCustomProps)) {
$arCustomProps = array($arCustomProps);
}

У меня в компонент передаются следующий массив:  «SMART_FILTER_CUSTOM_PICTURE_PROPERTTIES» => array(«TSVET_IMAGES»),

Вставляем в код компонента перед «if ($arParams[«XML_EXPORT»] === «Y») {» следующие строки:

if (!empty($arCustomProps)) {

$arPropsValsToLoad = array();
foreach ($arResult[«ITEMS»] as $PID => $arItem) {

if (in_array($arItem[«CODE»], $arCustomProps)) {
$arResult[«ITEMS»][$PID][«DISPLAY_TYPE»] = «G»;//подменяем тип отображения
$arPropsValsToLoad = array_keys($arItem[«VALUES»]);
}
}
$arPictures = array();
$query = CIBlockElement::GetList(array(), array(«ID» => $arPropsValsToLoad), false, false, array(«ID», «PREVIEW_PICTURE»));
while ($res = $query->GetNext()) {
$arPictures[$res[«ID»]] = CFile::GetFileArray($res[‘PREVIEW_PICTURE’]);//берем картинки
}
foreach ($arResult[«ITEMS»] as $PID => $arItem) {

if (in_array($arItem[«CODE»], $arCustomProps)) {
foreach ($arItem[«VALUES»] as $valID => $arValue) {
if ($arPictures[$valID] != «») {
$arResult[«ITEMS»][$PID][«VALUES»][$valID][«FILE»] = $arPictures[$valID];
}
}
}
}
}

 

Результат:

Вычисление собственных свойств в SEO шаблонах инфоблока Битрикс

<? //Подключаем модуль инфоблоков
if (\Bitrix\Main\Loader::includeModule(‘iblock’))
{
//регистрируем обработчик события
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
«iblock»,
«OnTemplateGetFunctionClass»,
array(«FunctionMyPriceFormat», «eventHandler»)
);
//подключаем файл с определением класса FunctionBase
//это пока требуется т.к. класс не описан в правилах автозагрузки
include_once($_SERVER[«DOCUMENT_ROOT»].»/bitrix/modules/iblock/lib/template/functions/fabric.php»);
class FunctionMyPriceFormat extends \Bitrix\Iblock\Template\Functions\FunctionBase
{
//Обработчик события на вход получает имя требуемой функции
//парсер её нашел в строке SEO

public static function eventHandler($event)
{
$parameters = $event->getParameters();
$functionName = $parameters[0];
if ($functionName === «my_price_format»)
{
//обработчик должен вернуть SUCCESS и имя класса
//который будет отвечать за вычисления
return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS,
«\\FunctionMyPriceFormat»
);
}
}
//собственно функция выполняющая «магию»
public function calculate($price)// эта функция лежит в fabric.php, она пустая, и всякие toUpper и toLower ее переопределяют
{
$price = $this->parametersToString($price);
$price = str_replace(«,»,».»,$price);
return round( $price, 2);
}
}
}
?>

Отдача файлов с другим именем в Битрикс

В htaccess добавить:

RewriteCond %{REQUEST_URI} !\/get_file.php$
RewriteCond %{QUERY_STRING} ^name=
RewriteRule ^(.*)$ /get_file.php? [R=301,L,QSA]

Содержимое файла get_file.php:

 

<?php
if($_REQUEST[«name»]!=»»){
if($_REQUEST[«path»]!=»»){
$name = urldecode($_REQUEST[«name»]);
$path = $_SERVER[«DOCUMENT_ROOT»].urldecode($_REQUEST[«path»]);
file_force_download($path,$name);
}
}

function file_force_download($file,$name=»») {
if (file_exists($file)) {
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
// если этого не сделать файл будет читаться в память полностью!
if (ob_get_level()) {
ob_end_clean();
}
// заставляем браузер показать окно сохранения файла

$filename = basename($file);
if(end(explode(«.»,$filename))!=»php»){
if($name!=»»){
$filename = $name.».».end(explode(«.»,$filename));
}
header(‘Content-Description: File Transfer’);
header(‘Content-Type: application/octet-stream’);
header(‘Content-Disposition: attachment; filename=’ . $filename);
header(‘Content-Transfer-Encoding: binary’);
header(‘Expires: 0’);
header(‘Cache-Control: must-revalidate’);
header(‘Pragma: public’);
header(‘Content-Length: ‘ . filesize($file));
// читаем файл и отправляем его пользователю
readfile($file);
}else{
die(«Не шали!»);
}
exit;
}
}
?>

 

В шаблоне вывода свойств у элементов:

$res = CFile::GetList(array(«ORIGINAL_NAME»=>»asc»), array(«@ID»=>$arResult[‘PROPERTIES’][‘FILES’][‘VALUE’]));
while($arr_res = $res->Fetch())
{
$files[] = $arr_res;
}

foreach($files as $key => $file):

$path = CFile::GetPath($file[«ID»]);

$file[«CONTENT_TYPE»] = (mime_content_type($_SERVER[‘DOCUMENT_ROOT’].$path));

<a href=»<?=$path?><?if (!empty($file[‘DESCRIPTION’])){ echo «?name=».$file[‘DESCRIPTION’].»&path=».urlencode($path);}?>» class=»arr_r» download></a>

endif;