Добро пожаловать на сайт Bitrix Q&A, где вы можете задавать вопросы о программировании и разработке на Битрикс и получать быстрые и квалифицированные ответы от профессионалов!


Как связать свойства заказа со способом доставки?

0 голосов
Всем добрый день!
Вопрос такой: использую компонент "одношагового заказа", и в нем, на странице оформления заказа, если выбрать тот или иной тип плательщика, показываются разные свойства заказа. Т.е, физическим лицам, например, не показывается свойство "ИНН", и так далее. (компонент немного кастомизирован, способы доставки показываются всегда и в самом начале)
Моя задача состоит в том, чтобы те свойства у заказа, которые показываются, показывались не в зависимости от типа плательщика, а в зависимости - а в зависимости от выбранного способа доставки.
Т.е., выбрал клиент доставку курьером - и указал только ФИО и телефон, а если Почту России - то будь добр указать все поля, индекс и т.п.

Можно ли как-то привязать свойства заказа к выбранному способу доставки?
спросил 29 Апр, 13 от Texnik (1,560 баллов)

9 Ответы

0 голосов
Цитата
Julliet пишет:
компонент немного кастомизирован, способы доставки показываются всегда и в самом начале

А если я живу за тысячи километров от вашего магазина и выберу способ доставки курьером, вы доставите?
Также я бы как покупатель захотел сравнить стоимость предлагаемых способов доставки. :)
Может быть все же правильная логика - это та, которая идет штатно, сначала указать адрес доставки, а затем уже по этому адресу предложить варианты доставки.
ответил 29 Апр, 13 от Delp (7,220 баллов)
0 голосов
Цитата
Sergey Leshchenko пишет:
правильная логика - это та, которая идет штатно


Лично я с вами - абсолютно согласна. а вот заказчик хочет так и не иначе.
Сама скоро стены матрасами оклею, а что делать? надо.

У меня идея в общем, была такая. Отказываться от стандартных компонентов, писать свой обработчик.
Да не проблема, но! нам же надо, чтобы эти заказы потом приходили на сайт, и можно было обмениваться с 1с, нам же надо, чтобы доставка автоматом считалась.
Итак, в этом своем обработчике я, допустим, как-то сделаю, что заказы будут приходить не только на почту, но и на сайт, чтобы потом был обмен заказами с 1С. Свойства волшебным образом подтяну из предустановленных в модуле. И калькулятор доставки - на закуску.

Но у меня для этого очень мало информации. Не нашла в доках для разработчиков ни слова про классы, которые обрабатывают свойства заказов, никакого куска, который отправляет заказ на сайт, ничего про то, как вытащить определенные в системе способы доставки. Когда я писала свой обработчик для добавления в корзину - там справилась, в документации есть подробное описание... а здесь не справляюсь.
Убила целый день на поиски.
Может, я плохо искала? если так - дайте, пожалуйста, ссылки на нужную справочную информацию.

Вторая идея - внедрить еще несколько типов плательщиков. Типа "Физ.лицо Самовывоз", "Физ.Лицо ЕМС". И определить свойства для них? Только все равно тогда нужно будет, чтобы определенный тип плательщика устанавливался сразу после выбора доставки. (да и вообще похоже на бред)

И такое ощущение, что решение рядом - а я тупо смотрю в другую сторону. Может, кто-то в силах подсказать мне, в какую сторону надо смотреть? Буду очень признательна)
ответил 30 Апр, 13 от Texnik (1,560 баллов)
0 голосов
Т.е. вам нужно прямо в админке указывать зависимость свойств заказа от служб доставки? Если так, то задачка не совсем простая, конечно, но реализуемая.
Чтобы не переписывать обработчики, попробйуте воспользоваться новым событием OnAdminTabControlBegin, и Антона еще посмотрите статью: http://dev.1c-bitrix.ru/community/webdev/user/11948/blog/2525/
Значения зависимостей наверное также будет проще хранить в опциях (COption). Скорее всего вам понадобится сохранять в значении опции массив, для этого можно будет воспользоваться php-функциями serialize() для преобразования в строку и unserialize() для обратной конвертации строки в массив.

Ну и придется практически полностью переписать компонент оформления заказа.

Подробнее решение задачи не могу расписать, к сожалению.
ответил 29 Июнь, 13 от Delp (7,220 баллов)
0 голосов
да не, прямо в админке зависимость указывать не надо, эта зависимость у меня есть, и она будет жесткая и всегда - никто ее менять не будет (а если через полгода они очухаются, что магазин лажовый и с доставкой полная каша - это не мои проблемы, я предупреждала ;) ).
значит, остается только полностью переписывать компонент, ну почти)

я больше склоняюсь к тому, чтобы просто написать свой компонент, только мне для него надо знать:
а) как вывести установленные в системе службы доставки
б) как вывести -||-||- свойства заказа
(потом по switch я думаю, показывать буду только те, которые надо)
в) как в конце концов отправить результаты заполнения формы заказа не только на почту админа, но и на сайт

Т.е, нужно описание соответствующих классов и событий (не нашла я их в документации для разработч.), а так в принципе задача-то несложная.
ответил 02 Окт, 13 от Texnik (1,560 баллов)
0 голосов
Хм. Собственно, весь набор нужных вам методов есть в штатных компонентах оформления заказа, документация по ним тоже есть, а примером является сам компонент.

Цитата
Julliet пишет:
а) как вывести установленные в системе службы доставки


CSaleDelivery::GetList()
, CSaleDeliveryHandler::GetList()

Цитата
Julliet пишет:
б) как вывести -||-||- свойства заказа

CSaleOrderProps::GetList()

Цитата
Julliet пишет:
в) как в конце концов отправить результаты заполнения формы заказа не только на почту админа, но и на сайт

нужно оформить заказ:
CSaleOrder::Add() + CSaleBasket::OrderBasket()
ответил 03 Янв, 14 от Delp (7,220 баллов)
0 голосов
Цитата
Sergey Leshchenko пишет:
CSaleOrderProps::GetList()

с небольшим перерывом я снова вернулась к этой задаче. смотрите, дело очень простое:
выводим список способов доставки, и при выборе того или иного способа доставки должна выводиться соответствующая группа свойств для заказа. (для начала сделала группу свойств "Самовывоз", а в ней 2 текстовых поля - имя и телефон). Итак, при выборе способа доставки у меня происходит обращение к пхп-скрипту, куда мы GET'ом отправляем значение выбранной опции по доставке (ну у меня там свой ajax скрипт это значение передает).
"Самовывоз" у меня идет пунктом 3, значит его группа свойств должна показываться при case 3:
Цитата

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
switch($_GET['opt']) {
case 1:
echo 'привет';
break;
case 2:

break;
case 3:
$db_props = CSaleOrderProps::GetList(
array("SORT" => "ASC"),
array(
"PERSON_TYPE_ID" => 1,
"PROPS_GROUP_ID" => 4,
"USER_PROPS" => "Y"
),
false,
false,
array()
);
if ($props = $db_props->Fetch())
{
echo $props["NAME"];

}

break;
case 4:
echo '4';
break;
}
?>


так. волшебное слово "привет" очень прекрасно показывается, когда мы выбираем 1-й способ доставки. а вот когда выбираем 3-й, то выдается сообщение:
Цитата
Fatal error: Class 'CSaleOrderProps' not found in ...my/delivery-info.php on line 12


А что значит такое сообщение? почему класс не найден?
ответил 19 Апр, 14 от Texnik (1,560 баллов)
0 голосов
Нужно подключать модули, прежде чем использовать их АПИ.

CModule::IncludeModule('sale');
ответил 13 Авг, 14 от Delp (7,220 баллов)
0 голосов
добавила после первой строчки, теперь код такой:
Код
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule('sale');
 switch($_GET['opt'])....


"привет" показывается, а имена свойств при выборе 3-го case не показываются.
(щас буду включать E_ALL...)

upd.

нет, ошибок никаких не выводится.
что-то не так в коде, что-то не то.

upd2.
смущала строчка "USER_PROPS" => "Y", убрала.
ну появилось нэйм первого свойства))))

ура)

Sergey Leshchenko, огромное спасибо за помощь :)
ответил 18 Дек, 14 от Texnik (1,560 баллов)
0 голосов
продолжение "эпопеи".

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

Не знаю, что предпринять.
ответил 08 Апр, 15 от Texnik (1,560 баллов)