Не сохраняется email при ручном создании заказа

Последняя версия. Тема Nova

Собственно, тема тут не при чем. Где отключается эта фигня, позволяющая оформлять заказ без адреса электронной почты?

У меня email в полях профиля стоит как обязательный. ОДНАКО!
При оформлении заказа поля для ввода email - НЕТ!
Если заказ оформляет ранее зарегистрировавшийся покупатель - его email нормально подставляется. Если оформляет заказ как гость - поля для ввода email нет, соответственно и заказ получается с фейковым email (куда слать уведомления?..). А если оформлять заказ вручную из админки - то что бы ты ни написал в поле email (при этом отмеченное звездочкой как обязательное!!!) - при сохранении заказа НИЧЕГО в нем не сохраняется.

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

PS кстати, мы подключили онлайн оплату, и нам позарез нужен адрес электронки покупателя, так как туда высылает чек ОФД.

Поэтому снова вопрос: как вернуть всё взад? @Nail.Gafin

Значит, с фронтом кое как разобрался, у меня все было настроено, но накуролесили при обновлении, никого не спрашивая и ни о чем не предупреждая.

Вопрос о том, почему при создании или редактировании заказа поле email не сохраняется?
Открываю заказ, пишу другой адрес электронки, обновляю, сохраняю - в профиле СТАРЫЙ адрес.
@cs-cart_team

Ну и в догонку - как СНОВА избавиться от это блока - адрес плательщика (заказ, создание заказа, итд итп), ранее отключил его, выключив все поля из соответствующего раздела полей профиля. И вот снова возвращение джедая.
@Asya

1 лайк

Реально бесит

Здравствуйте!

Я не воспроизвожу эту проблему. Пожалуйста, уточните, при каких настройках и действиях она возникает. Вы пробовали воспроизвести её в демо https://demo.cs-cart.ru/?

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

Я бы рад, но как неоднократно уже писал, демо зависает на этапе развертывания этого амого демо , то есть посреди экрана слово

                        Creating...

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

К сожалению Демо не работает уже очень давно. Наверное у компании проблемы

У меня вроде как работает демка, хотя никогда без впн не заходил, а сейчас перешел и офигел https://demo.cs-cart.ru/

Вроде mail сохраняет @alex_vp или я не правильно что-то сделал? https://skrinshoter.ru/vbPO7o9SeYQ
Да и поменял на другой mail тоже вроде как сохранил, может у вас свои какие-то настройки? https://skr.sh/vbPKnp599WZ

может поля какие-то обязательные или необязательные, мы как-то тоже мучались с приложение не воспроизводилось на других установках а у нас просто одно поле стояло необязательным, кто бы мог подумать…

До 4.18 это можно было сделать, просто выключив все поля в Адресе покупателя (снимая галочки в колонке Показывать).

А у вас демо с чистой установки разворачивается? Мы работает на установках, на которых за многие многие годы - многие многие баги накапливаются, поэтому согласен, результат на рабочем магазине и на чистом демо вполне может быть разным. Я вот сейчас на Free посмотрел, там 4-18-4 и без каких либо изменений с моей стороны. Там с полями профиля вообще чехарда какая-то, а поле email я вообще не смог вывести для ввода при создании заказа в админке.

Посмотрел по своим изменениям - и близко нет форме ввода данных покупателя.

1 лайк

Анастасия, вот результаты исследований.
Нажимаем Добавить заказ.
Информация о покупателе - Введите данные


Блок Адрес плательщика пока пустой. Нажимаем Обновить. Получаем

Как видим, адреса электронной почты нет.
Как выяснил, по кнопке обновить - вызывается app/controllers/backend/order_management.php
блок if ($mode == ‘customer_info’) из секции POST
в нем есть вот такой кусок:

        if (!empty($_REQUEST['user_data'])
            && is_array($_REQUEST['user_data'])
        ) {
            $user_data = $_REQUEST['user_data'];

            fn_convert_profile_dates_to_timestamps($user_data, $profile_fields);

            // Fill shipping info with billing if needed
            if (empty($_REQUEST['ship_to_another'])) {
                fn_fill_address(
                    $user_data,
                    $profile_fields,
                    !fn_compare_shipping_billing($profile_fields)
                );
            }

так вот на входе в функцию fn_fill_address массивы $user_data и $profile_fields имеют заполненное поле email, а на выходе из этой функции поле email уже пустое.

Далее, самое интересное!
Нажимаем на карандашик в блоке Информация о покупателе и редактируем так:

то есть ставим Адрес плательщика и адрес доставки совпадают - Нет, и пишем email в блоке адреса плательщика. В блоке информации контактной - пишем другой адрес email.
Итог - теперь адрес электронки у покупателя есть, но он из блока адреса плательщика


Заходим снова в редактирование данных покупателя

Переключатель снова включен, что адреса плательщика и доставки совпадают, в контактной информации - электронка плательщика, а не тот адрес, что я писал для контактной информации. Ничего не делаю, нажимаю Обновить

И адрес электронки снова пропадает.
Входим в редактирование контактной информации - и там эти поля пустые

PS
Настройки - Поля профиля:

Далее, в функции fn_fill_address есть настройка address_position

function fn_fill_address(&$user_data, &$profile_fields, $use_default = false)
{
    if (Registry::get('settings.Checkout.address_position') == 'billing_first' || $use_default) {

Как я понимаю, это отсюда, ну у меня там ее нет (помню, что она была раньше, очень давно…)

Вобщем, есть в функции fn_fill_address вот такое место

    // Clean shipping/billing data
    foreach ($profile_fields[$to] as $field_id => $v) {
        $is_default_field = YesNo::toBool($v['is_default']);
.....
        if ($is_default_field) {
            $user_data[$v['field_name']] = '';
        } else {
            $user_data['fields'][$v['field_id']] = '';
        }

и на этом месте функция чистит адрес электронки.

На данный момент пришлось ставить костыль -
в контроллере order_management.php
после кода

            // Fill shipping info with billing if needed
            if (empty($_REQUEST['ship_to_another'])) {
                fn_fill_address(
                    $user_data,
                    $profile_fields,
                    !fn_compare_shipping_billing($profile_fields)
                );
            }

добавил

if (empty($user_data['email'])) {
    $user_data['email'] = $_REQUEST['user_data']['email'];
}