minishop2 форма заказа

Планирую переделать форму доставки, необходимо сделать возможность выбора доставки в зависимости от указания города из списка. Т.е. мне нужно добавить возможность указания доступных городов для каждого вида доставки. В каком направлении копать, так чтобы сохранилась возможность обновления пакета?
Никита Павлов
13 декабря 2013, 12:57
modx.pro
3 255
0

Комментарии: 24

Василий Наумкин
13 декабря 2013, 17:24
0
Меняй чанки спокойно, они не перезаписываются.

А города можно указывать в описании метода.
    Никита Павлов
    Никита Павлов
    13 декабря 2013, 17:38
    0
    У городов несколько бОльшая задача просто =) Нужно сначала выбрать город, затем будут показаны возможные варианты доставки. Все, что я пока придумал это создать таблицу еще одну с городами и привязкой их к методам доставки и повесить скрипт на странице заказа, который будет в зависимости от выбранного города скрывать или показывать методы доставки.
      Василий Наумкин
      13 декабря 2013, 18:06
      0
      Да, так и нужно делать, наверное.
        Никита Павлов
        Никита Павлов
        29 декабря 2013, 17:58
        0
        В общем дописал свой класс Городов, с разделом в админке. В чанке заказа повесил скрипт, который подгружает в селект города и, в зависимости от выбора, изменяются варианты доставки и их стоимость. Начал писать кастомный хэндлер доставки, но никак не пойму как в нем получить стоимость доставки основываясь на выборе города. Нид хелп, что то я в ступоре.
          Никита Павлов
          Никита Павлов
          01 января 2014, 17:55
          0
          Василий, жду Вашего комментария, судя по всему придется менять основной скрипт минишопа.
            Василий Наумкин
            01 января 2014, 18:00
            0
            Зачем тебе мой комментарий?

            В MS2 меняются классы корзины, заказа, доставки и оплаты. При этом можно поменять и родной javascript. Я даже не знаю, что может тебя ограничить в твоих начинаниях.

            Все, что ты отправляешь с фронтенда нужно искать в массиве $_POST.
              Никита Павлов
              Никита Павлов
              01 января 2014, 18:19
              0
              Ну на ты, так на ты, ограничивают меня обновления пакета. Если при обновлении скрипт не заменяется то, ок.
                Василий Наумкин
                01 января 2014, 18:34
                0
                «На ты» мы здесь уже год — это основное правило моего сайта.

                Если правильно расширять классы, как расписано в инструкциях — с обновлениями проблем не будет.
                  Никита Павлов
                  Никита Павлов
                  03 января 2014, 16:59
                  0
                  Класс расширить это одно, я не могу сообразить, как используя стандартные методы минишопа, передать классу выбранный город. Если в форму добавляется новое поле, оно как то обрабатывается скриптом? Если не затруднит, покажите пример.
                    Василий Наумкин
                    03 января 2014, 17:16
                    0
                    Ты в MS1 как делал? В чем сейчас принципиальная разница?

                    Форма отправляется через POST, значит все её поля доступны в этом суперглобальном массиве.
                    Отправил input с name=«city», лови его в классе как $_POST['city'].

                    Есть большое желание засунуть это значение в заказ автоматически в options — отправляй c name = options[city].
                      Никита Павлов
                      Никита Павлов
                      03 января 2014, 17:41
                      0
                      А в мс1 я никак не делал, мой первый опыт это мс2 =)) Еще, где нибудь есть почитать, каким образом формируются все эти массивы. Я правильно понял, что добавив в форму заказа селект и указав у него name=«city», смогу в классе доставки выдернуть его значение из $_POST['city']?

                      Вот мой селект:
                      <select id="cities" name="city">
                      	<option value="">Выберите город</option>
                      	//сниппет выводящий города в виде <option value="[[+id]]">[[+name]]</option>
                      	[[!delcities? &tpl=`delcities`]]
                      </select>
                      Кстати, если заменить дефолтный инпут «город» на мой селект, форма будет работать? Как на счет стандартной валидации?
                        Василий Наумкин
                        03 января 2014, 18:01
                        0
                        Я тебя перепутал, значит, с кем то =) Вопросов то много.

                        Про эти массивы можно почитать в гугле, это PHP.

                        Я правильно понял, что добавив в форму заказа селект и указав у него name=«city», смогу в классе доставки выдернуть его значение из $_POST['city']
                        Да, правильно, проверяй.
                        Никита Павлов
                        Никита Павлов
                        03 января 2014, 18:08
                        0
                        Не, не в смысле про пост гет и сессион массивы, а про то каким макаром мс2 записывает туда данные по заказу. Ну это на будущее, чтобы знать, что где лежит.
                        Никита Павлов
                        Никита Павлов
                        04 января 2014, 16:29
                        2
                        0
                        Итак, вот мой кастомный класс доставки:
                        <?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. Мой же селект полностью игнорируется, думаю в этом и причина. Возможно неправильно оформлен селект, не хватает атрибутов, был бы благодарен за подсказку.
                        Никита Павлов
                        Никита Павлов
                        04 января 2014, 21:52
                        0
                        В общем для интереса вставил поле вида:
                        <input type="text" id="city" placeholder="Введите город" name="city" value="[[+city]]" class="[[+errors.city]]">
                        Скрипт его принял как родное, ушел запрос к контроллеру с параметрами
                        key:city
                        value: Ололо
                        ms2_action:order/add
                        ctx:hob
                        А вот с селектом не выходит. Я конечно могу подстроится и под инпут, но интерес к селекту остается.
                        Василий Наумкин
                        04 января 2014, 23:01
                        0
                        Стандартный javascript слушает input и textarea. Так что — или менять скрипт, или делать через input.
                        Никита Павлов
                        Никита Павлов
                        04 января 2014, 23:42
                        0
                        Понял, спасибо за ответы.
                        Кстати из массива $_POST ничего не вытаскивается, для класса он вообще пустой.

                        Зато заметил(наконец-то) что в функцию getCost передается весь заказ в виде переменной $order. После экспериментов, таки получил значение своего инпута.

                        $cityid =  $order->get('delcity'); //вместо поля delcity получает массив с 3мя элементами delivery,payments,delcity
                        $cityid = $cityid['delcity'];
                        Алилуя?
                        Никита Павлов
                        Никита Павлов
                        10 января 2014, 15:11
                        0
                        Я не понимаю, так сложно ответить? Я даже создал тестовый сайт на 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;
                        	}
                        }
                        На выходе имеем совершенно непонятный пересчет стоимости, при изменении стоимости доставки. В класс непонятно какая доставка передается…
                        Василий Наумкин
                        10 января 2014, 15:20
                        0
                        Тебе никто ничего не должен, разбирайся сам.
                        Никита Павлов
                        Никита Павлов
                        10 января 2014, 15:34
                        0
                        В чем разбираться то, документации, если нет. И базовый функционал не работает.
                        Никита Павлов
                        Никита Павлов
                        10 января 2014, 11:54
                        0
                        Василий, как правильно получить id метода доставки, который выбрал пользователь? Сделал в классе логирование с выводом id доставки, так вот если перебирать во фронтенде способы доставки, то не факт что класс получит именно выбранную доставку, да и вообще она то меняется то нет, хотя POST запрос к action.php с правильным id доставки исправно уходит.
                        Напомню, что в массиве $_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;
                        	}
                        }
                        Вот город класс получает правильный, а со способом доставки беда.
                      Никита Павлов
                      Никита Павлов
                      09 января 2014, 20:33
                      0
                      В целом задуманное удалось осуществить, но возникла проблема с радио кнопками выбора метода доставки. Необходимые поля проверяются на ура, сколько не перебирай способ доставки, а вот пересчет стоимости происходит не каждый раз. Т.е. изначально стоит самовывоз, меняем на почту — цена меняется, затем обратно самовывоз — цена остается как при доставке почтой. На этом не заканчивается, если поперебирать еще, то цена все таки начинает меняться, пока снова не застынет и т.д.
                      Вот мой класс доставки:
                      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;
                      	}
                      }
                        Марго
                        07 сентября 2014, 13:35
                        0
                        вот и у меня проблема с тем, что пересчет стоимости доставки идет вечно со старой информацией. главное при выборе способа доставки массив уходит и возвращается верный, а пересчет идет на основе предыдущего выбора — с опозданием на шаг получается.
                        удалось вам это побороть?
    Валера Кузаков
    04 января 2014, 12:02
    0
    Тоже мучаюсь над подобной идеей, хотелось бы конечно влияния города на условия доставки из коробки.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      24