вторник, 4 октября 2022 г.

send telegram




function t_me($tgText, $files=false, $chats_id = ["-xxx"]){

$token = "11111:aaaaa";
$site = $_SERVER['SERVER_NAME'];//$_SERVER['HTTP_ORIGIN']

foreach ($chats_id as $chat) {
$url = "https://api.telegram.org/bot{$token}/sendMessage";

$arrayQuery = [
"chat_id" => $chat,
"text" => $tgText.$site . $files[0],
"parse_mode" => "html",
"message_thread_id"=> 2//id нужного топика
];

if (is_array($files)) {
if(count($files) == 1) {
$url = 'https://api.telegram.org/bot' . $token . '/sendDocument';
$arrayQuery['document'] = $site . $files[0];
$arrayQuery["caption"] = $tgText;
}else {
$arMedia = array();
$url = 'https://api.telegram.org/bot' . $token . '/sendMediaGroup';
foreach ($files as $key => $path) {
if($key == 0) {
$arMedia[] = array('type' => 'photo', 'media' => $site.$path, "caption" => $tgText, "parse_mode"=>"html");
}else{
$arMedia[] = array('type' => 'photo', 'media' => $site.$path);
}
}
$arrayQuery['media'] = json_encode( $arMedia );
}
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close ($ch);

return $res;
}
}

среда, 20 июля 2022 г.

вторник, 31 мая 2022 г.

bitrix парсер телефона

 подключаем 

use Bitrix\Main\UserPhoneAuthTable;

use Bitrix\Main\Analytics\Catalog;

$phone = '+7 999 999-99-99';

var_dump(Bitrix\Main\UserPhoneAuthTable::normalizePhoneNumber($phone, 'ru'));//+79999999999

var_dump(Bitrix\Main\Analytics\Catalog::normalizePhoneNumber($phone));//79999999999

понедельник, 25 апреля 2022 г.

универсальный print_r для bitrix

пихаем в inti 

/**************************** универсальный print_r**********************************/
function printr($array) {
    //GLOBAL $USER;
    //if (!$USER->IsAdmin()) return false;
    if (!is_array($array)) return false;
    $args = func_get_args();
    if (count($args) > 1) {
            foreach ($args as $values)
                    printr($values);
    } else {
            echo "<pre>";
            print_r($array);
            echo "</pre>";
    }
}
// printr($arr1,$arr2);
/**************************** КОНЕЦ универсальный print_r**********************************/

четверг, 24 марта 2022 г.

Шпора по JS

загрузка документа

(() => {

})(); 

 слушать click, keyup, change и др

document.addEventListener('click', async (event) => {

    if (event.target.closest('.set-item__add')) {

if (!event.target.closest('.set-item__add')) return;

const block = event.target.closest('.set-item');

        const elem = block.getAttribute('data-elem');

    }

})

 Подниматься выше по дереву пока не встретишь родителя

const block = event.target.closest('.set-item');

ajax

$.ajax({

url: "json/save_global_box.php",

type: "POST",

dataType: "json",

data: { 'global_box_id': global_box_id, 'title': title, "box_id": box_id },

success: function (datajson) {

$.fancybox.close();

if (!datajson.status) {

document.location.href = "?ID=" + datajson.id;

}

}

}); 

fetch

 const form = document.querySelector(".form-dialog-content");

let url = "/ajax/forms/add_protocol_post.php";

let successUrl =  "/ajax/forms/custom_success.php";


form.addEventListener('submit', function (e){

   e.preventDefault();

const formData  = new FormData(e.target)

        formData.append('key1', 'value1');

fetch(url,{

method:'post',

body:formData

})

.then((response)=>response.json())

.then((result)=>{

console.log(result);

if(result.status === 200){

setTimeout(window.location.reload(), 3000);

}else{

document.getElementById("err_form").innerHTML = result.error;

}

})

})


четверг, 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 то пользователь может оплатить полный заказ без учета доставки)