minishop2 форма заказа
Планирую переделать форму доставки, необходимо сделать возможность выбора доставки в зависимости от указания города из списка. Т.е. мне нужно добавить возможность указания доступных городов для каждого вида доставки. В каком направлении копать, так чтобы сохранилась возможность обновления пакета?
Комментарии: 24
Меняй чанки спокойно, они не перезаписываются.
А города можно указывать в описании метода.
А города можно указывать в описании метода.
У городов несколько бОльшая задача просто =) Нужно сначала выбрать город, затем будут показаны возможные варианты доставки. Все, что я пока придумал это создать таблицу еще одну с городами и привязкой их к методам доставки и повесить скрипт на странице заказа, который будет в зависимости от выбранного города скрывать или показывать методы доставки.
Да, так и нужно делать, наверное.
В общем дописал свой класс Городов, с разделом в админке. В чанке заказа повесил скрипт, который подгружает в селект города и, в зависимости от выбора, изменяются варианты доставки и их стоимость. Начал писать кастомный хэндлер доставки, но никак не пойму как в нем получить стоимость доставки основываясь на выборе города. Нид хелп, что то я в ступоре.
Василий, жду Вашего комментария, судя по всему придется менять основной скрипт минишопа.
Зачем тебе мой комментарий?
В MS2 меняются классы корзины, заказа, доставки и оплаты. При этом можно поменять и родной javascript. Я даже не знаю, что может тебя ограничить в твоих начинаниях.
Все, что ты отправляешь с фронтенда нужно искать в массиве $_POST.
В MS2 меняются классы корзины, заказа, доставки и оплаты. При этом можно поменять и родной javascript. Я даже не знаю, что может тебя ограничить в твоих начинаниях.
Все, что ты отправляешь с фронтенда нужно искать в массиве $_POST.
Ну на ты, так на ты, ограничивают меня обновления пакета. Если при обновлении скрипт не заменяется то, ок.
«На ты» мы здесь уже год — это основное правило моего сайта.
Если правильно расширять классы, как расписано в инструкциях — с обновлениями проблем не будет.
Если правильно расширять классы, как расписано в инструкциях — с обновлениями проблем не будет.
Класс расширить это одно, я не могу сообразить, как используя стандартные методы минишопа, передать классу выбранный город. Если в форму добавляется новое поле, оно как то обрабатывается скриптом? Если не затруднит, покажите пример.
Ты в MS1 как делал? В чем сейчас принципиальная разница?
Форма отправляется через POST, значит все её поля доступны в этом суперглобальном массиве.
Отправил input с name=«city», лови его в классе как $_POST['city'].
Есть большое желание засунуть это значение в заказ автоматически в options — отправляй c name = options[city].
Форма отправляется через POST, значит все её поля доступны в этом суперглобальном массиве.
Отправил input с name=«city», лови его в классе как $_POST['city'].
Есть большое желание засунуть это значение в заказ автоматически в options — отправляй c name = options[city].
А в мс1 я никак не делал, мой первый опыт это мс2 =)) Еще, где нибудь есть почитать, каким образом формируются все эти массивы. Я правильно понял, что добавив в форму заказа селект и указав у него name=«city», смогу в классе доставки выдернуть его значение из $_POST['city']?
Вот мой селект:
Вот мой селект:
<select id="cities" name="city">
<option value="">Выберите город</option>
//сниппет выводящий города в виде <option value="[[+id]]">[[+name]]</option>
[[!delcities? &tpl=`delcities`]]
</select>
Кстати, если заменить дефолтный инпут «город» на мой селект, форма будет работать? Как на счет стандартной валидации?
Я тебя перепутал, значит, с кем то =) Вопросов то много.
Про эти массивы можно почитать в гугле, это PHP.
Про эти массивы можно почитать в гугле, это PHP.
Я правильно понял, что добавив в форму заказа селект и указав у него name=«city», смогу в классе доставки выдернуть его значение из $_POST['city']Да, правильно, проверяй.
Не, не в смысле про пост гет и сессион массивы, а про то каким макаром мс2 записывает туда данные по заказу. Ну это на будущее, чтобы знать, что где лежит.
Итак, вот мой кастомный класс доставки:
Я заметил что при редактировании любого поля формы, отсылается запрос POST к action.php с кодом действия add. Мой же селект полностью игнорируется, думаю в этом и причина. Возможно неправильно оформлен селект, не хватает атрибутов, был бы благодарен за подсказку.
<?php
class hobysDeliveryHandler extends msDeliveryHandler {
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
$cart = $this->ms2->cart->status();
$cities = $this->modx->getService('delcities','DelCities',$this->modx->getOption('delcities.core_path',null,$this->modx->getOption('core_path').'components/cities/').'model/DelCities/');
$delid = $delivery->get('id');
$cityid = $_POST['city'];
$city = $this->modx->getObject('DelCity',$cityid);
switch ($delid) {
case 1:
$add_price = $city->get('self');
break;
case 2:
$add_price = $city->get('courier');
break;
case 3:
$add_price = $city->get('post');
break;
}
$cost += $add_price;
return $cost;
}
}
Так выглядит часть чанка заказа с выбором городов:<div class="control-group">
<label class="control-label"><span class="required-star">*</span>Выберите город</label>
<div class="controls input-parent">
<select id="cities" name="city">
[[!delcities? &tpl=`delcities`]]
</select>
</div>
<label class="control-label"><span class="required-star">*</span> [[%ms2_frontend_delivery_select]]</label>
<div class="controls">
[[+deliveries]]
</div>
</div>
При проверке переменная $cityid = $_POST['city']; оказывается пустой.Я заметил что при редактировании любого поля формы, отсылается запрос POST к action.php с кодом действия add. Мой же селект полностью игнорируется, думаю в этом и причина. Возможно неправильно оформлен селект, не хватает атрибутов, был бы благодарен за подсказку.
В общем для интереса вставил поле вида:
key:city
value: Ололо
ms2_action:order/add
ctx:hob
А вот с селектом не выходит. Я конечно могу подстроится и под инпут, но интерес к селекту остается.
<input type="text" id="city" placeholder="Введите город" name="city" value="[[+city]]" class="[[+errors.city]]">
Скрипт его принял как родное, ушел запрос к контроллеру с параметрамиkey:city
value: Ололо
ms2_action:order/add
ctx:hob
А вот с селектом не выходит. Я конечно могу подстроится и под инпут, но интерес к селекту остается.
Стандартный javascript слушает input и textarea. Так что — или менять скрипт, или делать через input.
Понял, спасибо за ответы.
Кстати из массива $_POST ничего не вытаскивается, для класса он вообще пустой.
Зато заметил(наконец-то) что в функцию getCost передается весь заказ в виде переменной $order. После экспериментов, таки получил значение своего инпута.
Кстати из массива $_POST ничего не вытаскивается, для класса он вообще пустой.
Зато заметил(наконец-то) что в функцию getCost передается весь заказ в виде переменной $order. После экспериментов, таки получил значение своего инпута.
$cityid = $order->get('delcity'); //вместо поля delcity получает массив с 3мя элементами delivery,payments,delcity
$cityid = $cityid['delcity'];
Алилуя?
Я не понимаю, так сложно ответить? Я даже создал тестовый сайт на modx-test там такая же история, простейшую задачу невозможно решить.
Расширяю класс, по «инструкции»:
Расширяю класс, по «инструкции»:
<?php
class hobysDeliveryHandler extends msDeliveryHandler {
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
$delid = $delivery->get('id');
/* так же можно попробовать и так
$delid = $order->get('delivery');
$delid = $delid['delivery'];
Через $order та же история
*/
$this->modx->log(xPDO::LOG_LEVEL_ERROR,'Вызов хэндлера доставки'.$delid);
switch ($delid) {
case 1:
$add_price = 100;
break;
case 2:
$add_price = 200;
break;
case 3:
$add_price = 300;
break;
}
$cost += $add_price;
return $cost;
}
}
На выходе имеем совершенно непонятный пересчет стоимости, при изменении стоимости доставки. В класс непонятно какая доставка передается…
Тебе никто ничего не должен, разбирайся сам.
В чем разбираться то, документации, если нет. И базовый функционал не работает.
Василий, как правильно получить id метода доставки, который выбрал пользователь? Сделал в классе логирование с выводом id доставки, так вот если перебирать во фронтенде способы доставки, то не факт что класс получит именно выбранную доставку, да и вообще она то меняется то нет, хотя POST запрос к action.php с правильным id доставки исправно уходит.
Напомню, что в массиве $_POST для класса доставки ничего нет.
Тестировал со следующим классом доставки:
Напомню, что в массиве $_POST для класса доставки ничего нет.
Тестировал со следующим классом доставки:
<?php
class hobysDeliveryHandler extends msDeliveryHandler {
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
$delid = $delivery->get('id');
$this->modx->log(xPDO::LOG_LEVEL_ERROR,'Вызов хэндлера доставки'.$delid);
switch ($delid) {
case 1:
$add_price = 100;
break;
case 2:
$add_price = 200;
break;
case 3:
$add_price = 300;
break;
}
$cost += $add_price;
return $cost;
}
}
Вот город класс получает правильный, а со способом доставки беда.
В целом задуманное удалось осуществить, но возникла проблема с радио кнопками выбора метода доставки. Необходимые поля проверяются на ура, сколько не перебирай способ доставки, а вот пересчет стоимости происходит не каждый раз. Т.е. изначально стоит самовывоз, меняем на почту — цена меняется, затем обратно самовывоз — цена остается как при доставке почтой. На этом не заканчивается, если поперебирать еще, то цена все таки начинает меняться, пока снова не застынет и т.д.
Вот мой класс доставки:
Вот мой класс доставки:
class hobysDeliveryHandler extends msDeliveryHandler {
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
$cities = $this->modx->getService('delcities','DelCities',$this->modx->getOption('delcities.core_path',null,$this->modx->getOption('core_path').'components/cities/').'model/DelCities/');
if (!($cities instanceof DelCities)) return 'Не является классом DelCities';
$add_price = 0;
$delid = $delivery->get('id');
$cityid = $order->get('delcity');
$cityname = $cityid['delcity'];
$city = $this->modx->getObject('DelCity',array('name'=> $cityname));
if(!empty($city)) {
$city = $city->toArray();
switch ($delid) {
case 1:
$add_price = $city['self'];
break;
case 2:
$add_price =$city['courier'];
break;
case 3:
$add_price = $city['post'];
break;
}
}
$cost += $add_price;
return $cost;
}
}
вот и у меня проблема с тем, что пересчет стоимости доставки идет вечно со старой информацией. главное при выборе способа доставки массив уходит и возвращается верный, а пересчет идет на основе предыдущего выбора — с опозданием на шаг получается.
удалось вам это побороть?
удалось вам это побороть?
Тоже мучаюсь над подобной идеей, хотелось бы конечно влияния города на условия доставки из коробки.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.