Какие-то глюки в Битрикс, может кто подскажет?

Тема в разделе "PHP", создана пользователем Menro, 28 апр 2020.

XEvil 4.0 Релиз Состоялся!
Модераторы: latteo
  1. Menro

    Menro web, seo, email, hack

    Регистр.:
    27 янв 2008
    Сообщения:
    689
    Симпатии:
    132
    Коллеги, всем привет!
    Сегодня пол дня пытаюсь понять чё за фигня, пробовал сам, просил знакомого программиста глянуть (бегло глянул тоже не понял), вот думаю, может кто-то подскажет или выдвинет сою теории по этому поводу.
    Вот такая функция, которая модифицирует письмо о заказе перед отправкой.
    Код:
    <?php
    
    AddEventHandler("sale", "OnOrderNewSendEmail", "ModifySaleMails");
    function ModifySaleMails($orderID, &$eventName, &$arFields)
    {
        $arOrder = CSaleOrder::GetByID($orderID);
        $order_props = CSaleOrderPropsValue::GetOrderProps($orderID);
        $phone = "";
        $address = "";
        $city_name = "";
        $delivery_name = "";
        $payment_name = "";
        while ($arProps = $order_props->Fetch()){  
          if ($arProps["CODE"] == "PHONE"){
              $phone = htmlspecialchars($arProps["VALUE"]);
              }
          if ($arProps["CODE"] == "ADDRESS"){
             $address = htmlspecialchars($arProps["VALUE"]);
             }
      
          if ($arProps["CODE"] == "CITY") {
            $city = htmlspecialchars($arProps["VALUE"]);
            }
          }
    
        $arDeliv = CSaleDelivery::GetByID($arOrder["DELIVERY_ID"]);
        $arPayment = CSalePaySystem::GetByID($arOrder["PAY_SYSTEM_ID"]);
      
        $delivery_name = htmlspecialchars($arDeliv['NAME']);
        $payment_name = htmlspecialchars($arPayment['NAME']);
    
    
        $arFields["PHONE"] =  $phone;
        $arFields["ADDRESS"] = $address;
        $arFields["CITY"] = $city;
        $arFields["DELIVERY_NAME"] = $delivery_name.'.';
        $arFields["PAYMENT_NAME"] = $payment_name.'.';
    }
    Всё внимание на это:

    Код:
    $arFields["DELIVERY_NAME"] = $delivery_name.'.';
    $arFields["PAYMENT_NAME"] = $payment_name.'.';
    В конце сейчас у меня к значению переменной добавлена точка и в таком случае, письмо приходит и там всё чётко (выводится название способа доставки и оплаты).

    Но если название выводить без точки, то всё, письмо не приходит, ошибок в логе нет.
    Пробовал делать так:

    Код:
    if ($arOrder["DELIVERY_ID"] == 1) {
    $payment_name= 'Курьерская доставка';
    }
    Ну и дальше:

    Код:
    $arFields["DELIVERY_NAME"] = $delivery_name;
    
    Тоже самое. Пока не добавишь любой символ - не отправляет письмо. Причем символ любой, на русском или английском языке.

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

    Любые мысли....
    Хоть проблема и решена точкой, но для себя интересно, что блин не так??
     
  2. borodatych

    borodatych

    Регистр.:
    24 июн 2016
    Сообщения:
    156
    Симпатии:
    92
    Я бы начал копать в сторону шаблона
    Нужно отыскать сперва где и как используется `$arFields["DELIVERY_NAME"]`
     
  3. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    386
    Симпатии:
    137
    А отправится ли письмо если сделать так:
    $arFields["DELIVERY_NAME"] = (string) $delivery_name; $arFields["PAYMENT_NAME"] = (string) $payment_name.'.';

    Или второй тест: а что если точку добавить здесь? Нужно будет внизу конкатенацию делать, или письмо отправится?
    if ($arOrder["DELIVERY_ID"] == 1) {
    $payment_name= 'Курьерская доставка.';
    }

    И третье : какой тип у переменной перед добавлением символа? Можешь её вардампнуть? Может там в строке есть спецсимвол невидимый с которым письмо отправляется (ошибок нет) но не приходит (письмо фильтруется мейл сервером из-за спецсимвола).
     
  4. borodatych

    borodatych

    Регистр.:
    24 июн 2016
    Сообщения:
    156
    Симпатии:
    92
    Вы предполагаете, что конкатенация как-то может решить проблему со спец символом?
    Если что, я без доли иронии, вдруг чего не знаю
     
  5. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    386
    Симпатии:
    137
    Понятия не имею, если символ какой-то бинарный то может и убирает. Я точно знаю что:
    1) конкатенация приводит к строковому типу
    2) битря не выдаёт ошибок - значит письмо вроде как отправляется
    3) письмо не приходит
    4) внешне код нормально выглядит

    Вот и предполагаю, что может быть что-то невидимое, что ломает отправку. Я б ещё порекомендовал посмотреть на длинну строки до конкатенации и после. Точно ли строка увеличивается на единицу?
     
  6. shake1

    shake1

    Регистр.:
    16 янв 2013
    Сообщения:
    531
    Симпатии:
    567
    Спросить у автора шаблона?
    90% что шаблон с маркета, там в комментах и спросить.
     
  7. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    502
    Симпатии:
    1.173
    Взять письмо, которое генерируется и отправить с помощью mail() с того же сервера (это если письма через эту функцию уходят). Либо отправить через то, через что отправляете
     
  8. MAVZ

    MAVZ Писатель

    Регистр.:
    12 фев 2020
    Сообщения:
    4
    Симпатии:
    0
    А какая ошибка при отправке? Иногда почтовый сервер может резать, воспринимать как спам без видимых причин.
     
  9. NickSan

    NickSan Постоялец

    Регистр.:
    23 авг 2012
    Сообщения:
    68
    Симпатии:
    38
    Я бы логи сервера глянул для начала. Вдруг каких то переменных не существует или не всегда находит?
    Можно обернуть в "if(isset($var))", но тогда он будет всегда отправлять скорее всего, так что аккуратней с этим.
    Дампить надо, думаю там не всегда все что нужно приходит, сам рыбу съел как то на битриксе.
     
  10. Bomboos

    Bomboos Создатель

    Регистр.:
    7 мар 2014
    Сообщения:
    6
    Симпатии:
    0

    Можно логи сервера?