[Помогите] Корзина->Узнать стоимость доставки->Добавить города

Тема в разделе "OpenCart", создана пользователем opalko, 15 окт 2021.

  1. opalko

    opalko

    Регистрация:
    23 дек 2014
    Сообщения:
    204
    Симпатии:
    14
    В корзине опенкарт 2.3 есть пункт -Узнать стоимость доставки. Для расчета есть выбор стран и регионов с выпадающим списком, но нет городов. Сами города есть в базе, получены посредством модуля НоваяПочта Api. Но как добавить их в контроллер? Кто разбирается, прошу помочь...
    [​IMG]
    [​IMG]

    Код из контроллера shipping.php
    PHP:
    <?php
    class ControllerExtensionTotalShipping extends Controller {
        public function 
    index() {
            if (
    $this->config->get('shipping_status') && $this->config->get('shipping_estimator') && $this->cart->hasShipping()) {
                
    $this->load->language('extension/total/shipping');

                
    $data['heading_title'] = $this->language->get('heading_title');

                
    $data['text_shipping'] = $this->language->get('text_shipping');
                
    $data['text_shipping_method'] = $this->language->get('text_shipping_method');
                
    $data['text_select'] = $this->language->get('text_select');
                
    $data['text_none'] = $this->language->get('text_none');
                
    $data['text_loading'] = $this->language->get('text_loading');

                
    $data['entry_country'] = $this->language->get('entry_country');
                
    $data['entry_zone'] = $this->language->get('entry_zone');
                
    $data['entry_postcode'] = $this->language->get('entry_postcode');

                
    $data['button_quote'] = $this->language->get('button_quote');
                
    $data['button_shipping'] = $this->language->get('button_shipping');
                
    $data['button_cancel'] = $this->language->get('button_cancel');

                if (isset(
    $this->session->data['shipping_address']['country_id'])) {
                    
    $data['country_id'] = $this->session->data['shipping_address']['country_id'];
                } else {
                    
    $data['country_id'] = $this->config->get('config_country_id');
                }

                
    $this->load->model('localisation/country');

                
    $data['countries'] = $this->model_localisation_country->getCountries();

                if (isset(
    $this->session->data['shipping_address']['zone_id'])) {
                    
    $data['zone_id'] = $this->session->data['shipping_address']['zone_id'];
                } else {
                    
    $data['zone_id'] = '';
                }

                if (isset(
    $this->session->data['shipping_address']['postcode'])) {
                    
    $data['postcode'] = $this->session->data['shipping_address']['postcode'];
                } else {
                    
    $data['postcode'] = '';
                }

                if (isset(
    $this->session->data['shipping_method'])) {
                    
    $data['shipping_method'] = $this->session->data['shipping_method']['code'];
                } else {
                    
    $data['shipping_method'] = '';
                }

                return 
    $this->load->view('extension/total/shipping'$data);
            }
        }

        public function 
    quote() {
            
    $this->load->language('extension/total/shipping');

            
    $json = array();

            if (!
    $this->cart->hasProducts()) {
                
    $json['error']['warning'] = $this->language->get('error_product');
            }

            if (!
    $this->cart->hasShipping()) {
                
    $json['error']['warning'] = sprintf($this->language->get('error_no_shipping'), $this->url->link('information/contact'));
            }

            if (
    $this->request->post['country_id'] == '') {
                
    $json['error']['country'] = $this->language->get('error_country');
            }

            if (!isset(
    $this->request->post['zone_id']) || $this->request->post['zone_id'] == '') {
                
    $json['error']['zone'] = $this->language->get('error_zone');
            }

            
    $this->load->model('localisation/country');

            
    $country_info $this->model_localisation_country->getCountry($this->request->post['country_id']);

            if (
    $country_info && $country_info['postcode_required'] && (utf8_strlen(trim($this->request->post['postcode'])) < || utf8_strlen(trim($this->request->post['postcode'])) > 10)) {
                
    $json['error']['postcode'] = $this->language->get('error_postcode');
            }

            if (!
    $json) {
                
    $this->tax->setShippingAddress($this->request->post['country_id'], $this->request->post['zone_id']);

                if (
    $country_info) {
                    
    $country $country_info['name'];
                    
    $iso_code_2 $country_info['iso_code_2'];
                    
    $iso_code_3 $country_info['iso_code_3'];
                    
    $address_format $country_info['address_format'];
                } else {
                    
    $country '';
                    
    $iso_code_2 '';
                    
    $iso_code_3 '';
                    
    $address_format '';
                }

                
    $this->load->model('localisation/zone');

                
    $zone_info $this->model_localisation_zone->getZone($this->request->post['zone_id']);

                if (
    $zone_info) {
                    
    $zone $zone_info['name'];
                    
    $zone_code $zone_info['code'];
                } else {
                    
    $zone '';
                    
    $zone_code '';
                }

                
    $this->session->data['shipping_address'] = array(
                    
    'firstname'      => '',
                    
    'lastname'       => '',
                    
    'company'        => '',
                    
    'address_1'      => '',
                    
    'address_2'      => '',
                    
    'postcode'       => $this->request->post['postcode'],
                    
    'city'           => '',
                    
    'zone_id'        => $this->request->post['zone_id'],
                    
    'zone'           => $zone,
                    
    'zone_code'      => $zone_code,
                    
    'country_id'     => $this->request->post['country_id'],
                    
    'country'        => $country,
                    
    'iso_code_2'     => $iso_code_2,
                    
    'iso_code_3'     => $iso_code_3,
                    
    'address_format' => $address_format
                
    );

                
    $quote_data = array();

                
    $this->load->model('extension/extension');

                
    $results $this->model_extension_extension->getExtensions('shipping');

                foreach (
    $results as $result) {
                    if (
    $this->config->get($result['code'] . '_status')) {
                        
    $this->load->model('extension/shipping/' $result['code']);

                        
    $quote $this->{'model_extension_shipping_' $result['code']}->getQuote($this->session->data['shipping_address']);

                        if (
    $quote) {
                            
    $quote_data[$result['code']] = array(
                                
    'title'      => $quote['title'],
                                
    'quote'      => $quote['quote'],
                                
    'sort_order' => $quote['sort_order'],
                                
    'error'      => $quote['error']
                            );
                        }
                    }
                }

                
    $sort_order = array();

                foreach (
    $quote_data as $key => $value) {
                    
    $sort_order[$key] = $value['sort_order'];
                }

                
    array_multisort($sort_orderSORT_ASC$quote_data);

                
    $this->session->data['shipping_methods'] = $quote_data;

                if (
    $this->session->data['shipping_methods']) {
                    
    $json['shipping_method'] = $this->session->data['shipping_methods'];
                } else {
                    
    $json['error']['warning'] = sprintf($this->language->get('error_no_shipping'), $this->url->link('information/contact'));
                }
            }

            
    $this->response->addHeader('Content-Type: application/json');
            
    $this->response->setOutput(json_encode($json));
        }

        public function 
    shipping() {
            
    $this->load->language('extension/total/shipping');

            
    $json = array();

            if (!empty(
    $this->request->post['shipping_method'])) {
                
    $shipping explode('.'$this->request->post['shipping_method']);

                if (!isset(
    $shipping[0]) || !isset($shipping[1]) || !isset($this->session->data['shipping_methods'][$shipping[0]]['quote'][$shipping[1]])) {
                    
    $json['warning'] = $this->language->get('error_shipping');
                }
            } else {
                
    $json['warning'] = $this->language->get('error_shipping');
            }

            if (!
    $json) {
                
    $shipping explode('.'$this->request->post['shipping_method']);

                
    $this->session->data['shipping_method'] = $this->session->data['shipping_methods'][$shipping[0]]['quote'][$shipping[1]];

                
    $this->session->data['success'] = $this->language->get('text_success');

                
    $json['redirect'] = $this->url->link('checkout/cart');
            }

            
    $this->response->addHeader('Content-Type: application/json');
            
    $this->response->setOutput(json_encode($json));
        }

        public function 
    country() {
            
    $json = array();

            
    $this->load->model('localisation/country');

            
    $country_info $this->model_localisation_country->getCountry($this->request->get['country_id']);

            if (
    $country_info) {
                
    $this->load->model('localisation/zone');

                
    $json = array(
                    
    'country_id'        => $country_info['country_id'],
                    
    'name'              => $country_info['name'],
                    
    'iso_code_2'        => $country_info['iso_code_2'],
                    
    'iso_code_3'        => $country_info['iso_code_3'],
                    
    'address_format'    => $country_info['address_format'],
                    
    'postcode_required' => $country_info['postcode_required'],
                    
    'zone'              => $this->model_localisation_zone->getZonesByCountryId($this->request->get['country_id']),
                    
    'status'            => $country_info['status']
                );
            }

            
    $this->response->addHeader('Content-Type: application/json');
            
    $this->response->setOutput(json_encode($json));
        }
    }
     
  2. valdemariuses

    valdemariuses

    Регистрация:
    22 июн 2016
    Сообщения:
    11
    Симпатии:
    0
    Дело в том, что модуль новой почты "ломает" структуру стран, регионов и городов. Т.е. вместо стран задаются областя, вместо регионов - города, вместо городов - пункты выдачи. Вот в этом направлении и надо копать.