четверг, 23 сентября 2021 г.

Bitrix Генерация sitemap из highloadblock

 Появилась задача добавить в карту сайта ссылки из HL

<?php

use \Bitrix\Main\Application;

use \Bitrix\Main\IO\File;

use \Bitrix\Seo\SitemapRuntime;

use \Bitrix\Seo\SitemapIndex;

use Bitrix\Highloadblock\HighloadBlockTable as HLBT;

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


$arSitemapSettings = array('SITE_ID' => 's1', 'PROTOCOL' => 'https', 'DOMAIN' => 'vash_site.ru');


$sitemapFile = new SitemapRuntime(1, 'sitemap-hl.xml', $arSitemapSettings );//создание нового xml


CModule::IncludeModule('highloadblock');

function GetEntityDataClass($HlBlockId) {

if (empty($HlBlockId) || $HlBlockId < 1) {return false; }

$hlblock = HLBT::getById($HlBlockId)->fetch();

$entity = HLBT::compileEntity($hlblock);

$entity_data_class = $entity->getDataClass();

return $entity_data_class;

}

$entity_data_class = GetEntityDataClass(6);//нужный hl

$rsData = $entity_data_class::getList(array('order' => array('ID'=>'ASC'), 'select' => array('UF_URL')));


while($el = $rsData->fetch()){

$sitemapFile->appendIBlockEntry($el['UF_URL'], getmicrotime());//добавляем url в xml

$sitemapFile->finish();

}


//Добавим новый xml в sitemap.xml

$sitemapFile = new SitemapIndex('sitemap.xml', $arSitemapSettings);

$arFiles = new \Bitrix\Main\IO\File($_SERVER["DOCUMENT_ROOT"] . '/sitemap-hl.xml', 's1');

$sitemapFile->appendIndexEntry($arFiles);

Теперь можно запихнуть это в крон или нужное вам место 

среда, 22 сентября 2021 г.

Bitrix оплата половины заказа баллами

 Итак задача: при заказе если человек использует внутренний счёт можно оплатить только половину заказа без учёта доставки
например заказан товар на 120р
доставка 270
итого 390руб

пользователь может оплатить баллами не больше половины заказа т.е. 60руб от 120руб

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

/bitrix/components/bitrix/sale.order.ajax/
к себе например
/bitrix/components/my/sale.order.ajax/
*my вы создаёте сами

дальше чтобы не путаться переименовал шаблон .default в custom

/bitrix/components/my/sale.order.ajax/templates/.default
в
/bitrix/components/my/sale.order.ajax/templates/custom

в файле .parameters.php добавляем поле для управления сколько процентов пользователь может потратить на заказ

$arTemplateParameters["MAXPAYINNER"] =  array(

"NAME" => 'Максимальный % оплатой баллами',

"TYPE" => "STRING",

"DEFAULT" => 100

);

тут можно сразу указать процент в нашем случае это будет 50


дальше открываем файл /bitrix/components/my/sale.order.ajax/ajax.php внизу прописываем наш шаблон должно получиться так

$APPLICATION->IncludeComponent(

'my:sale.order.ajax',

'custom',

$params

);

и последний файл /bitrix/components/my/sale.order.ajax/class.php собственно из за него и пришлось копировать весь компонент

ищем protected function obtainPaySystem()

меняем 

$arResult['PAYED_FROM_ACCOUNT_FORMATED'] = SaleFormatCurrency($innerPayment->getSum(), $this->order->getCurrency());

$arResult['ORDER_TOTAL_LEFT_TO_PAY'] = $this->order->getPrice() - $innerPayment->getSum();

$arResult['ORDER_TOTAL_LEFT_TO_PAY_FORMATED'] = SaleFormatCurrency($this->order->getPrice() - $innerPayment->getSum(), $this->order->getCurrency());

на

$maxPayInner = ($this->arParams['MAXPAYINNER'] > 0)? $this->arParams['MAXPAYINNER'] : 100;

$halfTotalPrice = ($this->order->getPrice()-$this->order->getDeliveryPrice())*$maxPayInner/100;

if ($halfTotalPrice >= $innerPayment->getSum()) {

$arResult['PAYED_FROM_ACCOUNT_FORMATED'] = SaleFormatCurrency($innerPayment->getSum(), $this->order->getCurrency());

$arResult['ORDER_TOTAL_LEFT_TO_PAY'] = $this->order->getPrice() - $innerPayment->getSum();

$arResult['ORDER_TOTAL_LEFT_TO_PAY_FORMATED'] = SaleFormatCurrency($this->order->getPrice() - $innerPayment->getSum(), $this->order->getCurrency());

}else{

$arResult['PAYED_FROM_ACCOUNT_FORMATED'] = SaleFormatCurrency($halfTotalPrice, $this->order->getCurrency());

$arResult['ORDER_TOTAL_LEFT_TO_PAY'] = $halfTotalPrice + $this->order->getDeliveryPrice();

$arResult['ORDER_TOTAL_LEFT_TO_PAY_FORMATED'] = SaleFormatCurrency($halfTotalPrice + $this->order->getDeliveryPrice(), $this->order->getCurrency());

}

 теперь ищем 

$remainingSum = empty($innerPayment) ? $order->getPrice() : $order->getPrice() - $innerPayment->getSum();

заменяем на

if (!empty($innerPayment)) {

$maxPayInner = ($this->arParams['MAXPAYINNER'] > 0)? $this->arParams['MAXPAYINNER'] : 100;

$halfTotalPrice = ($order->getPrice()-$order->getDeliveryPrice())*$maxPayInner/100;

if ($halfTotalPrice >= $innerPayment->getSum()) {

$remainingSum = $order->getPrice() - $innerPayment->getSum();

}else{

$remainingSum = $halfTotalPrice + $order->getDeliveryPrice();

}

}else{

$remainingSum = $order->getPrice();

Всё применяем новый шаблон, устанавливаем максимальный процент(если процент не установлен или равен 0 то пользователь может оплатить полный заказ без учета доставки) 

четверг, 25 февраля 2021 г.

bitrix получить телефон пользователя PHONE_NUMBER

 Получить телефон пользователя по которому он регистрировался

$phone = \Bitrix\Main\UserPhoneAuthTable::getList([

'filter' => ['=USER_ID' => $id_пользователя ],

'select' => ['USER_ID', 'PHONE_NUMBER'],

])->fetch();

echo $phone['PHONE_NUMBER'];

вторник, 16 февраля 2021 г.

bitrix Обновление компонента в режиме ajax извне

 Задача у меня стояла связать умный фильтр и вывод списка новостей

в первом компоненте bitrix:catalog.smart.filter

добавляем

"INSTANT_RELOAD" => "Y",//обновлять при выборе

"AJAX_MODE" => "Y",//использовать ajax


во втором компоненте bitrix:news.list

"AJAX_MODE" => "Y",

в шаблоне компонента вверху добавляю id="compare-refresh"

...

$this->setFrameMode(true);

?>

<span id="compare-refresh"></span>

...

и теперь идём в шаблон  bitrix:catalog.smart.filter и открываем script.js, ищем функцию JCSmartFilter.prototype.postHandler = function (result, fromCache) (примерно 160 строка у меня)


после this.cacheKey = ''; перед закрытием функции добавляем

        let componenturl = removeParam('bxajaxid', url);//удаляем из url параметр bxajaxid

let compid = $("#compare-refresh").parent().prop('id');//ищем у второго компонента id там запсан его bxajaxid BX.ajax.insertToNode(componenturl+'&bxajaxid='+compid.replace("comp_", ""), compid);//собственно сам запрос который обновит компонент

и ниже добавляем функцию очистки параметра из url

function removeParam(key, sourceURL) {

  var splitUrl = sourceURL.split('?'),

    rtn = splitUrl[0],

    param,

    params_arr = [],

    queryString = (sourceURL.indexOf("?") !== -1) ? splitUrl[1] : '';

  if (queryString !== '') {

    params_arr = queryString.split('&');

    for (var i = params_arr.length - 1; i >= 0; i -= 1) {

      param = params_arr[i].split('=')[0];

      if (param === key) {

        params_arr.splice(i, 1);

      }

    }

    rtn = rtn + '?' + params_arr.join('&');

  }

  return rtn;

}

вот как выглядит у меня