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

четверг, 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;

}

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



вторник, 24 сентября 2019 г.

mint не работает колесо мыши

Случилось так, что я не заметил когда, но колесо мышки перестало работать, первая мысль сломалась от времени, но нет подключаю к ноутбуку и всё работает.

Поиски в интернетах особо не помогли, закралась мысль что это всё произошло после обновления. И тут действительно на одном форуме пишут что это может быть баг в ядре.

Загружаюсь с другой версией ядра и колесо снова работает.

редактируем grub
$ sudo nano /etc/default/grub 

прописываем эти строки
GRUB_DEFAULT=saved #это  сохранит выбор и после перезагрузки загрузит эту версию
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT=10 #чтобы успеть зайти в grub

у меня была версия 
4.15.0-64-generic
и мышь корректно заработала только на этой
4.15.0-58-generic

воскресенье, 3 мая 2015 г.

bluetooth гарнитура в ubuntu 14,04

Казалось бы все должно было завестись с коробки и без претензий, взял я потестить Logitech H800. Обычная стереогарнитура, в моем случае было интересно как будут работать уши, что касается микрофона не проверял не знаю что с ним вообще.

В общем включил сделал сопряжение все прошло на ура, но при попытке подключить их звука нету, и пишет странную надпись.

Соединение невозможно или разорвано: Stream setup failed
или
устройство успешно добавлено но соединение с ним невозоможно.
И тут понеслось ставить alsa и сносить pulse както не с руки было.

Решение оказалось простым.

$ pactl load-module module-bluetooth-discover
И вот уже bluemon спокойно подключл их но звук по прежнему идет на колонки. Тут ещё проще открываем pavucontrol и выбираем Вкладку "Устройства Вывода" ставим использовать по умолчанию.

Вот и все.
Решение нашлось тут