• Почему перестало корректно работать поиск по заголовкам битрикс?

    Real_Fermer
    @Real_Fermer
    Программист PHP
    /bitrix/modules/error.log там скорее всего ответ
    Ответ написан
    5 комментариев
  • Как парсить большое количество сайтов?

    @alexalexes
    Помещаете свой массив с 4000 элементами в таблицу базы данных.
    Добавляете еще несколько атрибутов для записи таблицы:
    1. статус обработки парсинга, значения: 1 - добавлен в очередь на обработку, 2 - в обработке, 3 - обработка завершена.
    2. Дата и время изменения статуса обработки.
    Теперь ваш скрипт должен взять запросом из таблицы базы одну запись (один сайт) со статусом 1 (или со статусами 2 или 3, с разницей времени больше периода повторной обработки парсинга) и перевести в статус 2 и начать обработку. По окончании обработки выставить статус 3. При смене статуса обновлять его время изменения.
    Анализировать статус и переводить его в статус 2 нужно одной транзакцией, а в статус 3 - другой транзакцией.
    Если время выполнения персинга с момента старта скрипта небольшое (определяете предельное время работы одного потока и с ним сравниваете), то можно взять следующую запись в работу.

    Все, теперь вы написали простетский планировщик задач и можете параллельно запустить несколько скриптов через браузер или через cron на сервере. Каждый поток выполнения скрипта запросом в базу будет брать задачи, поставленные в обработку, либо перезапускать давно не запускавшиеся задачи, либо перезапускать зависшие в обработке.
    Ответ написан
    Комментировать
  • Как добавить массив в get параметр битрикс?

    @koder_1
    Битрикс программист
    Вы просто для теста в форме задайте
    <input type="text" name="recipes[]" value="1"><input type="text" name="recipes[]" value="2">
    отправьте ее и посмотрите как формируется в get-строке такой параметр, а потом сделайте в вашей get-строке так же.

    recipes=22&recipes=845 вот эта строка даст в $_GET только recipes = 845, более позднее значение ключа recipes затрет более раннее.
    Ответ написан
    1 комментарий
  • Как добавить массив в get параметр битрикс?

    <?=$APPLICATION->GetCurPageParam("recipes[]=".$item);?>

    Это как-то топорно. Попробуйте так:
    $addParams = [
        'recipe' =>[18, 25],
    ];
    echo $APPLICATION->GetCurPageParam( http_build_query($addParams), array_keys($addParams) );
    Ответ написан
    Комментировать
  • Почему не меняются местами координаты при получении?

    XanXanXan
    @XanXanXan
    let tmp = arr[0][j][1];
    arr[0][j][1] = arr[0][j][0];
    arr[0][j][0] = tmp;

    let tmp = arr[j][1];
    arr[j][1] = arr[j][0];
    arr[j][0] = tmp;


    Или проще:
    function rotXY(arr) {
      return arr.map(coordinates => coordinates.reverse());
    }
    Ответ написан
    1 комментарий
  • Как вывести товары со скидками в корзине битрикс с помощью АПИ?

    @symply_rabbit Автор вопроса
    2 варианта ответа найдено: 1)
    <?$fuserId = CSaleBasket::GetBasketUserID();
    
    $dbBasketItems = CSaleBasket::GetList(
       array("ID" => "ASC"),
       array(
           "FUSER_ID" => $fuserId,
           "LID" => SITE_ID,
           "ORDER_ID" => "NULL",
           "DELAY"=>"N"
       ),
       false,
       false,
       array(
           "ID", "NAME", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "PRODUCT_PRICE_ID", "QUANTITY", "DELAY", "CAN_BUY",
           "PRICE", "WEIGHT", "DETAIL_PAGE_URL", "NOTES", "CURRENCY", "VAT_RATE", "CATALOG_XML_ID",
           "PRODUCT_XML_ID", "SUBSCRIBE", "DISCOUNT_PRICE", "PRODUCT_PROVIDER_CLASS", "TYPE", "SET_PARENT_ID"
       )
    );
    
    
    while ($arBasketItems = $dbBasketItems->Fetch())
    {
       $allSum = ($arBasketItems["PRICE"] * $arBasketItems["QUANTITY"]);
       $allWeight = ($arBasketItems["WEIGHT"] * $arBasketItems["QUANTITY"]);
       $arResult[] = $arBasketItems;
    }
    
    $arOrder = array(
       'SITE_ID' => SITE_ID,
       'USER_ID' => $GLOBALS["USER"]->GetID(),
       'ORDER_PRICE' => $allSum, // сумма всей корзины
       'ORDER_WEIGHT' => $allWeight, // вес всей корзины
       'BASKET_ITEMS' => $arResult // товары сами
    );
    
    $arOptions = array(
       'COUNT_DISCOUNT_4_ALL_QUANTITY' => "Y",
    );
    
    $arErrors = array();
    
    CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors);
    
    
    echo $arOrder["ORDER_PRICE"];?>


    2)
    <?$basket = \Bitrix\Sale\Basket::loadItemsForFUser(
      \Bitrix\Sale\Fuser::getId(),
      \Bitrix\Main\Context::getCurrent()->getSite()
    ); // текущая корзина
    $fuser = new \Bitrix\Sale\Discount\Context\Fuser($basket->getFUserId(true));
    $discounts = \Bitrix\Sale\Discount::buildFromBasket($basket, $fuser);
    $discounts->calculate();
    $result = $discounts->getApplyResult(true);
    $prices = $result['PRICES']['BASKET']; // цены товаров с учетом скидки
    print_r($prices);
    
    
    
    foreach ($prices as $price):
    
    //echo $price[PRICE];?><br>
    <?
    $summs[]=$price[PRICE];
    ?>
    <?endforeach;?>
    
    
    
    <?
    $a = array($summs);
    $summsss = array_sum($summs);
    echo $summsss;?>


    Об варианта рабочие
    Ответ написан
    Комментировать
  • Как оправить ссылку с во такими данными на почту яндекс или гугл?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    $link = "<a href='https://securepayments.sberbank.ru/payment/docsite/payform-1.html?token=ТОКЕН&amp;def=".urlencode("{'amount':'".$arResult["ORDER"]["PRICE"]."'}")."&amp;def=".urlencode("{'description':'Оплата по заказу ".$arResult["ORDER"]["ACCOUNT_NUMBER"]." от ".$arResult["ORDER"]["DATE_INSERT"]->toUserTime()->format('d.m.Y H:i')."'}")."&amp;def=".urlencode("{'email':'".$USER->GetEmail()."'}")."&amp;lang=ru'>Ссылка на оплату</a>";


    P.S. А вы в курсе, что в ссылке передаётся 3 (три!) одинаковых аргумента с именем 'def'?
    Ответ написан
    1 комментарий
  • Иногда форма отправляет данные множество раз. Где ошибка, можете объяснить?

    Shlop
    @Shlop
    Full Stack Developer (PHP/Laravel/JavaScript)
    Могу предположить из-за того что пользователь может быстро несколько раз нажать на кнопку "Отправить" в результате будет отправлено несколько ajax запросов.

    Можно попробовать сделать вот так:
    Когда событие "submit" выполнится в первый раз кнопка "Отправить" заблокируется, и если пользователь сразу нажмёт её ещё раз то событие уже не будет запущенно т.к. кнопка будет заблокирована до тех пор пока ajax запрос не завершится. Пример скрипта ниже, я его не проверял, если будите использовать то протестируйте, не ломается ли ничего. На кнопку в html нужно будет добавить класс: btn-form-submit.

    Либо может что-то в php скрипте, или на форме устанавливается несколько событий которое отправляет ajax запрос.

    $(function () {
        $("form[data-ajax]").on("submit", function (e) {
            e.preventDefault();
            var $form = $(this);
            var btn = $form.find(".btn-form-submit");
            // Заблокируем кнопку отправить
            $(btn).prop("disabled", true);
            $form.find(".input--error").removeClass("input--error");
            $.post($form.attr("action"), $form.serialize(), function (json) {
                if (json.result == "error") {
                    for (var x in json.errors) {
                        $form.find('[name="' + x + '"]').addClass("input--error");
                    }
                } else if (json.result == "redirect") {
                    window.location.href = json.url;
                } else {
                    $form.html(json.html);
                }
            }, "json").always(function () {
                if (btn.length) {
                    // Разблокируем кнопку отправить когда ajax запрос завершится будь то успех или ошибка
                    $(btn).prop("disabled", false);
                }
            });
        })
    });

    Небольшой совет, лучше давать обратную связь пользователю, когда он отправил форму показывать какую нибудь загрузку/крутяшку/прилоуд, что бы пользователь понимал что какое-то действие происходит.
    Ответ написан
    2 комментария
  • Почему json_decode() возвращает тип данных "строка"?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    я так понимаю, это строка и есть
    console.log(typeof this.dataTest); // string
    далее вы ее пакуете в данные и отправляете
    formData.append('obj', this.dataTest);

    потом на сервере получаете эту строку и декодируете ее
    json_decode($_POST['obj'], true);

    Что получается: отправляем строку, получаем строку и удивляемся, а почему же не массив?

    --------

    Видимо проблема в том, каким образом вы сохраняете данные в локальном хранилище браузера. Ну и понимать бы, какие там данные. Код выкладывайте.

    --------

    Решение
    - this.dataTest = JSON.stringify(localStorage.localStorage);
    + this.dataTest = localStorage.localStorage;
    Ответ написан
  • Почему json_decode() возвращает тип данных "строка"?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. localStorage хранит только строки.
    2. localStorage.localStorage - строка.
    3. JSON.stringify(localStorage.localStorage) - JSON, кодирующий строку.
    4. json_decode($_POST['obj'], true) декодирует JSON в исходную строку, которая была в localStorage.localStorage.
    Ответ написан
    1 комментарий
  • Telegram Bot Api Как отправить сообщение в приватный канал через бота?

    @Islamfon
    Знаю как это сделать!

    1. Сделай канал публичным, установи для него username.
    2. Добавь в канал любого бота.
    3. Перейди по ссылке
    https://api.telegram.org/bot[ТОКЕН_БОТА]/sendMessage?chat_id=@[USERNAME_КАНАЛА]&text=тест
    . После перехода по ссылке будет выведен id канала, сохрани его.
    4. Сделай канал приватным.
    5. Отправляй сообщения вот так:
    https://api.telegram.org/bot[ТОКЕН_БОТА]/sendMessage?chat_id=@[ID_КАНАЛА]&text=тест.
    Ответ написан
    1 комментарий
  • Как вычесть дату?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Если нужно время исполнения скрипта используйте функцию time:

    <?php
    $start = microtime(TRUE);
    
    sleep(3);
    
    $diff = microtime(TRUE) - $start;
    
    printf('Execution time: %s s', $diff);


    PHP time online
    Ответ написан
    2 комментария
  • Почему вылетает ошибка агента битрикс?

    @PetrPo
    Предположу, что вызывается $USER->GetID(), в документации указано, что Переменная $USER в агентах отсутствует.. По всей видимости, в этом модуле есть событие на добавление элемента инфоблока, в котором вызывается $USER->GetID() и т.к. $USER=null, а не объект класса CUser получаешь ошибку.
    Ответ написан
    Комментировать
  • :after Не отображается, сафари, на айфонах?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Нужно задать координаты top, left и т.д., чтобы браузер знал, куда нужно спозиционировать псевдоэлемент.
    Ответ написан
    Комментировать
  • Как переехать на новый домен 301 редидрект?

    @dodo512
    Страница выдала "слишком много перенаправлений"

    RewriteEngine On
    RewriteRule ^(.*)$ https://new-domain.ru/$1 [R=301,L]

    Если два домена ссылаются на одну папку, то нужно добавить проверку %{HTTP_HOST}
    RewriteEngine On
    RewriteCond %{HTTP_HOST}  ^(www\.)?old-domain\.ru$  [NC]
    RewriteRule ^(.*)$ https://new-domain.ru/$1 [R=301,L]


    И ещё в остальных RewriteRule заменить https://old-domain.ru на https://new-domain.ru
    Ответ написан
    2 комментария
  • CIBlockElement::Add - как добавить свойство типа список?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Если у Вас нет возможности передать в качестве входных данных именно ID списочных элементов (внешний импорт или файл какой ни-будь), то делайте поиск по списочным значениям и уже из найденных элементов подставляйте их ID

    $iblockId = 1;//id инфоблока
    $inputValues = [44, 45, 46];//Ваши входные данные
    
    $enumIds = array_column(\Bitrix\Iblock\PropertyEnumerationTable::getList([
        "select" => ["ID"],
        "filter" => [
            "PROPERTY.CODE" => "mylist",
            "PROPERTY.IBLOCK_ID" => $iblockId,
            "VALUE" => $inputValues
        ],
        "cache" => [
            "ttl" => 86400
        ]
    ]->fetchAll()), "ID");

    $enumIds - будет массив с ID списочных значений, который нужен Вам в CIblockElement::Add
    Стоит обратить внимание на то что в примере в метод getList передан параметр cache. Это позволит каждый раз не обращаться к БД, а взять значение из кеша.
    Ответ написан
    1 комментарий
  • Bitrix api Как добавить торговых предложений к товару?

    Bankir77
    @Bankir77
    Для этого нужно иметь два инфоблока: товары и торговые предложения, инфа по настройке тут https://dev.1c-bitrix.ru/learning/course/?COURSE_I...

    Рабочий пример:
    CModule::IncludeModule('iblock');
    CModule::IncludeModule('sale');
    
    $ciBlockElement = new CIBlockElement;
    
    // Добавляем товар-родитель, у которго будут торг. предложения
    $product_id = $ciBlockElement->Add(
        array(
            'IBLOCK_ID' => 13, // IBLOCK товаров
            'NAME' => "Товар 1",
            "ACTIVE" => "Y",
            // Прочие параметры товара
        )
    );
    // проверка на ошибки
    if (!empty($ciBlockElement->LAST_ERROR)) {
        echo "Ошибка добавления товара: ". $ciBlockElement->LAST_ERROR;
        die();
    }
    // добавляем нужное кол-во торговых предложений
    $arLoadProductArray = array(
        "IBLOCK_ID"      => 14, // IBLOCK торговых предложений
        "NAME"           => "Торговое предложение 1",
        "ACTIVE"         => "Y",
        'PROPERTY_VALUES' => array(
            'CML2_LINK' => $product_id, // Свойство типа "Привязка к товарам (SKU)", связываем торг. предложение с товаром
        )
        // Прочие параметры товара 
    );
    $product_offer_id = $ciBlockElement->Add($arLoadProductArray);
    // проверка на ошибки
    if (!empty($ciBlockElement->LAST_ERROR)) {
        echo "Ошибка добавления торгового предложения: ". $ciBlockElement->LAST_ERROR;
        die();
    }
    // Добавляем параметры к торг. предложению
    CCatalogProduct::Add(
        array(
            "ID" => $product_offer_id,
            "QUANTITY" => 9999
        )
    );
    // Добавляем цены к торг. предложению
    CPrice::Add(
        array(
            "CURRENCY" => "RUB",
            "PRICE" => 999,
            "CATALOG_GROUP_ID" => 1,
            "PRODUCT_ID" => $product_offer_id,
        )
    );
    Ответ написан
    2 комментария