Тема: Оформление заказа - use_addr(==0||>0) добавить третий вариант

Здравствуйте, при оформлении заказа на шаге "адрес" существует поле 'use_addr'. Принцип по которому система взаимодействует с этим значением мне понятен (если 0, то чекаем поля нового адреса, а если больше, то используем как ID объекта адреса у пользователя и не чекаем поля).

Дело в том, что одно из требований моего заказчика - вывести на этапе ввода адреса еще один вариант выбора "Я буду использовать пункт самовывоза" где пользователь может не вводить все поля адреса, а просто выбрать регион из списка, предоставляемого агрегатором доставки. Следовательно, на следующем шаге оформления (доставка) делать априори отмеченным вариант доставки "до постомата", и показывать карту выбора постомата на определенном городе.

Подскажите пожалуйста, как самой малой кровью добиться результата? Желательно инфу между страницами передавать через экстра-данные, без расширения ORM объекта Order.
Как надо назвать поле и в каком виде передавать в него данные для корректной записи в массив экстра-данных заказа?

Повысить оценку Понизить оценку

Re: Оформление заказа - use_addr(==0||>0) добавить третий вариант

Ну запишите в куку выбор через jquery cookie, например.
http://stackoverflow.com/questions/1458 … ith-jquery.

А на странице доставки проверьте это значение. И если нужно выбрать радиокнопку на этапе доставки, то просто вызовите событие клика. И всё.

$('селектор нужной радио кнопки').click();

У нас есть возможность передавать любые данные через поля order_extra. Но они имеют свойство выдавать в конце в карточке редактирования заказа. Ну например такое поле, для страницы с выбором адреса

<input type="text" name="order_extra['Любое имя, можно и по русски']" value="{$order.order_extra.address['Любое имя, можно и по русски']}"/>

<pre>
{$order.order_extra}
</pre>

Но я думаю это вам вряд ли понадобится.

3

Re: Оформление заказа - use_addr(==0||>0) добавить третий вариант

Спасибо, попробую с куками.
А какое значение use_addr использовать у нового варианта? При 0 не пройдет валидация формы, а при положительном он будет искать объект адреса. Отрицательное использовать?

Повысить оценку Понизить оценку

4 Отредактировано Закусило Александр (10.12.2015 20:56:59)

Re: Оформление заказа - use_addr(==0||>0) добавить третий вариант

0 и заполнить поля какими-нибудь своими данными, если выбрал на этапе ввода адреса Вашу галочку с самовывозом. Иначе просто оставлять поля пустыми. Просто если пользователь новый, то у него всегда будет 0 и надо записать адрес. И пусть приходит как какой-нибудь Ваш адрес записанный для данного пользователя. Он всё равно не будет этого видеть.
Единственное, я не знаю использует ли Ваша доставка индекс города. Скорее всего да. Но это можно обойти просто отправив запрос на Ваш обработчик внутри класса доставки и там уже заказу, при выборе пункта самовывоза передать значение выбранного индекса. Ну или поставить какой-нибудь свой индекс. Или оставить поле индекса. Вообщем вариантов много.

5

Re: Оформление заказа - use_addr(==0||>0) добавить третий вариант

Закусило Александр пишет:

0 и заполнить поля какими-нибудь своими данными

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

Повысить оценку Понизить оценку

6 Отредактировано Закусило Александр (11.12.2015 11:20:45)

Re: Оформление заказа - use_addr(==0||>0) добавить третий вариант

Ну и что? Повесьтесь  на событие сохранения заказа и просто поправьте этот адрес, на тот что будет выбран в качестве пункта самовывоза. Ну или поправьте его при выборе данного пункта. Или ещё лучше просто после сохранения у таких заказов удалите адрес, который создастся. Вот и всё.

Событие orm.afterwrite.shop-order

Хуки в ReadyScript

7

Re: Оформление заказа - use_addr(==0||>0) добавить третий вариант

С созданием фиктивного адреса куча проблем вылазит, например если покупатель вернется на шаг назад, то увидит этот адрес, т.е. его еще и шаблоне надо фильтровать.
А чем так страшно значение -1? Я его использую и пока проблем не обнаружил. Данные пишу в [order_extra]. AJAX я весь переписал, правда .js файл решил не использовать, т.к. у меня весь javascript лежит в .tpl шаблоне в теге <script>, зато smarty данные напрямую в js-объект передает. Вот так:

{addjs file="http://api-maps.yandex.ru/2.1/?lang=ru_RU" basepath="root"}

<div class="imlContainer_{$delivery.id}">
    <button id="showMap_{$delivery.id}" class="btn btn-primary btn-md">Показать карту</button>
</div>
<!-- Modal -->
<div class="modal fade" id="mapModal" tabindex="-1" role="dialog" aria-labelledby="mapModalLabel">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Отменить"><span aria-hidden="true">&times;</span></button>
                <h3 class="modal-title text-center" id="mapModalLabel">Выбор пункта самовывоза</h3>
            </div>
            <div class="modal-body">
                
            </div>
            <div class="modal-footer">
                {foreach json_decode($service_ids) as $code => $name}
                    <div class="priceItem">
                        <div class="name">{$name}</div>
                        <div class="priceText" data-code="{$code}"></div>
                    </div>
                {/foreach}
                <button type="button" class="btn btn-default" data-dismiss="modal">Отменить</button>
                <button type="button" class="btn btn-primary submitModal">Сохранить</button>
            </div>
        </div>
    </div>
</div>
<script>
jQuery(document).ready(bindHandlers);

/**
 * Начальные значения. Подгружаются через Smarty.
 * @type {*Object*}
 */
var defaultData = {
        "url"               :"{$router->getUrl('shop-front-checkout', ['Act' => 'userAct'])}",
        "delivery_id"        :"{$delivery.id}", 
        "delivery_cost_json"  :{$delivery_cost_json},
        "service_id"         :{$service_ids},
        "region_id_from"      :"{$region_id_from}", 
        "region_id_to"        :"{$region_id_to}", 
        "currency"           :"{$currency}", 
        "select_id"          :"#selectRegionCombo_{$delivery.id}", 
        "list_id"            :"#sdlist_{$delivery.id}", 
        "loading"           :"<div class='loading'></div>"
    },

PS Я хоть и по своему делаю, но вам огромное спасибо, вы мне очень помогли разобраться.

Повысить оценку Понизить оценку

Re: Оформление заказа - use_addr(==0||>0) добавить третий вариант

Не за что, приятно видеть человека, который активно разрабатывает на нашем продукте. Так держать. smile