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

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;

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

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

Любые мысли....
Хоть проблема и решена точкой, но для себя интересно, что блин не так??
 
Я бы начал копать в сторону шаблона
Нужно отыскать сперва где и как используется `$arFields["DELIVERY_NAME"]`
 
$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= 'Курьерская доставка.';
}

И третье : какой тип у переменной перед добавлением символа? Можешь её вардампнуть? Может там в строке есть спецсимвол невидимый с которым письмо отправляется (ошибок нет) но не приходит (письмо фильтруется мейл сервером из-за спецсимвола).
 
Может там в строке есть спецсимвол невидимый с которым письмо отправляется (ошибок нет) но не приходит
Вы предполагаете, что конкатенация как-то может решить проблему со спец символом?
Если что, я без доли иронии, вдруг чего не знаю
 
Вы предполагаете, что конкатенация как-то может решить проблему со спец символом?
Если что, я без доли иронии, вдруг чего не знаю
Понятия не имею, если символ какой-то бинарный то может и убирает. Я точно знаю что:
1) конкатенация приводит к строковому типу
2) битря не выдаёт ошибок - значит письмо вроде как отправляется
3) письмо не приходит
4) внешне код нормально выглядит

Вот и предполагаю, что может быть что-то невидимое, что ломает отправку. Я б ещё порекомендовал посмотреть на длинну строки до конкатенации и после. Точно ли строка увеличивается на единицу?
 
Спросить у автора шаблона?
90% что шаблон с маркета, там в комментах и спросить.
 
Взять письмо, которое генерируется и отправить с помощью mail() с того же сервера (это если письма через эту функцию уходят). Либо отправить через то, через что отправляете
 
А какая ошибка при отправке? Иногда почтовый сервер может резать, воспринимать как спам без видимых причин.
 
Я бы логи сервера глянул для начала. Вдруг каких то переменных не существует или не всегда находит?
Можно обернуть в "if(isset($var))", но тогда он будет всегда отправлять скорее всего, так что аккуратней с этим.
Дампить надо, думаю там не всегда все что нужно приходит, сам рыбу съел как то на битриксе.
 
Походу опечатка, не $city_name = ""; а $city = "";
 
Назад
Сверху