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

Menro

web, seo, email, hack
Регистрация
27 Янв 2008
Сообщения
689
Реакции
138
Коллеги, всем привет!
Сегодня пол дня пытаюсь понять чё за фигня, пробовал сам, просил знакомого программиста глянуть (бегло глянул тоже не понял), вот думаю, может кто-то подскажет или выдвинет сою теории по этому поводу.
Вот такая функция, которая модифицирует письмо о заказе перед отправкой.
Код:
<?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;

Тоже самое. Пока не добавишь любой символ - не отправляет письмо. Причем символ любой, на русском или английском языке.

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

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

borodatych

Постоялец
Регистрация
24 Июн 2016
Сообщения
159
Реакции
104
Я бы начал копать в сторону шаблона
Нужно отыскать сперва где и как используется `$arFields["DELIVERY_NAME"]`
 

UJy

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

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

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

borodatych

Постоялец
Регистрация
24 Июн 2016
Сообщения
159
Реакции
104
Может там в строке есть спецсимвол невидимый с которым письмо отправляется (ошибок нет) но не приходит
Вы предполагаете, что конкатенация как-то может решить проблему со спец символом?
Если что, я без доли иронии, вдруг чего не знаю
 

UJy

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

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

shake1

Хранитель порядка
Регистрация
16 Янв 2013
Сообщения
534
Реакции
605
Спросить у автора шаблона?
90% что шаблон с маркета, там в комментах и спросить.
 

Q_BASIC

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

MAVZ

Писатель
Регистрация
12 Фев 2020
Сообщения
3
Реакции
0
А какая ошибка при отправке? Иногда почтовый сервер может резать, воспринимать как спам без видимых причин.
 

NickSan

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

AMG88

Создатель
Регистрация
12 Апр 2014
Сообщения
14
Реакции
12
Походу опечатка, не $city_name = ""; а $city = "";
 
Сверху