Opencart — Как Убрать Страну И Регион В Оформлении Заказа

Тема в разделе "Установка, обновление, настройка", создана пользователем admin, 17 июн 2016.

  1. TopicStarter Overlay
    Offline

    admin Команда форума Администратор

    Сообщения:
    1.659
    Симпатии:
    31.619
    Репутация:
    129
    Некоторое время назад мы рассматривали подобную тему - «Opencart — убираем обязательные поля в оформлении товара», в которой мы скрывали такие поля как компания, факс, индекс и т.д. Сегодня пойдет речь все о том же оформлении заказа, но уже о двух других полях: стране и регионе. Дело в том, что очень часто на e-mail приходит вопрос о том, как удалить эти поля, не настроить для показа определенной страны и региона, а полностью их удалить, чтобы эти поля не отображались при оформлении заказа. Аргумент всегда поступает такой: работаем только по одному городу и выбор города, тем более страны, совсем не нужен. В принципе, звучит логично, поэтому сегодня мы изменим оформление заказа так, чтобы в нем не было этих двух параметров: выбора региона и страны. Сразу оговорюсь, что править придется много.

    Все изменения будут сделаны на дефолтном шаблоне, версии 1.5.4.1. Рассмотрим удаление страны и региона на примере гостевого оформления заказа.

    Не забываем, что перед любыми изменениями стоит делать бекап и пересохранить файлы магазина, по крайней мере те, с которыми предстоит работать.

    guest-checkout-country-delete.jpg

    Открываем файл catalog\view\theme\default\template\checkout\guest.tpl, находим строки со страной и регионом, удалим также отображение индекса, так как он не имеет смысла без выбора страны и региона (66-87):

    Код:
    <span id="payment-postcode-required"class="required">*</span><?phpecho$entry_postcode;?><br/>
    <input type="text"name="postcode"value="<?phpecho$postcode;?>"class="large-field"/>
    <br/>
    <br/>
    <span class="required">*</span><?phpecho$entry_country;?><br/>
    <select name="country_id"class="large-field">
    <option value=""><?phpecho$text_select;?></option>
    <?phpforeach($countriesas$country){?>
    <?phpif($country['country_id']==$country_id){?>
    <option value="<?phpecho$country['country_id'];?>"selected="selected"><?phpecho$country['name'];?></option>
    <?php}else{?>
    <option value="<?phpecho$country['country_id'];?>"><?phpecho$country['name'];?></option>
    <?php}?>
    <?php}?>
    </select>
    <br/>
    <br/>
    <span class="required">*</span><?phpecho$entry_zone;?><br/>
    <select name="zone_id"class="large-field">
    </select>
    <br/>
    <br/>
    Комментируем их или удаляем.

    Сохраняем изменения и отправляемся править файл контроллера, так как мало убрать отображение полей, необходимо разобраться с ошибками, так как данные поля обязательны для заполнения.

    Открываем файл catalog\controller\checkout\guest.php и принимаемся за большую работу — комментируем или удаляем нижеперечисленные строки:

    234-255 строки :

    Код:
    $country_info=$this->model_localisation_country->getCountry($this->request->post['country_id']);
    
    if($country_info){
    if($country_info['postcode_required']&&(utf8_strlen($this->request->post['postcode'])<2)||(utf8_strlen($this->request->post['postcode'])>10)){
    $json['error']['postcode']=$this->language->get('error_postcode');
    }
    
    // VAT Validation
    $this->load->helper('vat');
    
    if($this->config->get('config_vat')&&$this->request->post['tax_id']&&(vat_validation($country_info['iso_code_2'],$this->request->post['tax_id'])=='invalid')){
    $json['error']['tax_id']=$this->language->get('error_vat');
    }
    }
    
    if($this->request->post['country_id']==''){
    $json['error']['country']=$this->language->get('error_country');
    }
    
    if($this->request->post['zone_id']==''){
    $json['error']['zone']=$this->language->get('error_zone');
    }
    273, 275-276 строки:

    Код:
    $this->session->data['guest']['payment']['postcode']=$this->request->post['postcode'];
    $this->session->data['guest']['payment']['country_id']=$this->request->post['country_id'];
    $this->session->data['guest']['payment']['zone_id']=$this->request->post['zone_id'];
    280-304, 313-314 строки:

    Код:
    $country_info=$this->model_localisation_country->getCountry($this->request->post['country_id']);
    
    if($country_info){
    $this->session->data['guest']['payment']['country']=$country_info['name'];
    $this->session->data['guest']['payment']['iso_code_2']=$country_info['iso_code_2'];
    $this->session->data['guest']['payment']['iso_code_3']=$country_info['iso_code_3'];
    $this->session->data['guest']['payment']['address_format']=$country_info['address_format'];
    }else{
    $this->session->data['guest']['payment']['country']='';
    $this->session->data['guest']['payment']['iso_code_2']='';
    $this->session->data['guest']['payment']['iso_code_3']='';
    $this->session->data['guest']['payment']['address_format']='';
    }
    
    $this->load->model('localisation/zone');
    
    /*$zone_info=$this->model_localisation_zone->getZone($this->request->post['zone_id']);
    
    if($zone_info){
    $this->session->data['guest']['payment']['zone']=$zone_info['name'];
    $this->session->data['guest']['payment']['zone_code']=$zone_info['code'];
    }else{
    $this->session->data['guest']['payment']['zone']='';
    $this->session->data['guest']['payment']['zone_code']='';
    }
    
    // Default Payment Address
    $this->session->data['payment_country_id']=$this->request->post['country_id'];
    $this->session->data['payment_zone_id']=$this->request->post['zone_id'];
    322, 324-350 строки:

    Код:
    $this->session->data['guest']['shipping']['postcode']=$this->request->post['postcode'];
    
    $this->session->data['guest']['shipping']['country_id']=$this->request->post['country_id'];
    $this->session->data['guest']['shipping']['zone_id']=$this->request->post['zone_id'];
    
    if($country_info){
    $this->session->data['guest']['shipping']['country']=$country_info['name'];
    $this->session->data['guest']['shipping']['iso_code_2']=$country_info['iso_code_2'];
    $this->session->data['guest']['shipping']['iso_code_3']=$country_info['iso_code_3'];
    $this->session->data['guest']['shipping']['address_format']=$country_info['address_format'];
    }else{
    $this->session->data['guest']['shipping']['country']='';
    $this->session->data['guest']['shipping']['iso_code_2']='';
    $this->session->data['guest']['shipping']['iso_code_3']='';
    $this->session->data['guest']['shipping']['address_format']='';
    }
    
    if($zone_info){
    $this->session->data['guest']['shipping']['zone']=$zone_info['name'];
    $this->session->data['guest']['shipping']['zone_code']=$zone_info['code'];
    }else{
    $this->session->data['guest']['shipping']['zone']='';
    $this->session->data['guest']['shipping']['zone_code']='';
    }
    
    // Default Shipping Address
    $this->session->data['shipping_country_id']=$this->request->post['country_id'];
    $this->session->data['shipping_zone_id']=$this->request->post['zone_id'];
    $this->session->data['shipping_postcode']=$this->request->post['postcode'];
    Внеся все эти изменения, мы получаем форму оформления заказа следующего вида:

    oformlenie-zakaza-strana-i-region.jpg

    Но, поскольку адрес тесно связан не только со вторым шагом, но и с последующими, то нам предстоит править еще и другие файлы, чтобы убрать все ошибки.

    После второго шага идет третий шаг «Адрес доставки». Во втором шаге по умолчанию отмечен чекбокс «Адрес доставки совпадает с адресом плательщика» и покупатель минуя третий шаг переходит к четвертому шагу для выбора способа доставки. Но что, если покупатель все же захочет изменить адрес и перейдет к третьему шагу? Среди всех прочих полей, он увидит те самые поля, которые мы так тщательно скрывали — страну и регион, и они, естественно, будут обязательны для заполнения.

    shipping-address.jpg

    Так что теперь наша задача — убрать их из третьего шага.

    Открываем файл catalog\view\theme\default\template\checkout\guest-shipping.tpl и снова ищем строки с индексом, страной и регионом (27-47):

    Код:
    <td><span id="shipping-postcode-required"class="required">*</span><?phpecho$entry_postcode;?></td>
    <td><input type="text"name="postcode"value="<?phpecho$postcode;?>"class="large-field"/></td>
    </tr>
    <tr>
    <td><span class="required">*</span><?phpecho$entry_country;?></td>
    <td><select name="country_id"class="large-field">
    <option value=""><?phpecho$text_select;?></option>
    <?phpforeach($countriesas$country){?>
    <?phpif($country['country_id']==$country_id){?>
    <option value="<?phpecho$country['country_id'];?>"selected="selected"><?phpecho$country['name'];?></option>
    <?php}else{?>
    <option value="<?phpecho$country['country_id'];?>"><?phpecho$country['name'];?></option>
    <?php}?>
    <?php}?>
    </select></td>
    </tr>
    <tr>
    <td><span class="required">*</span><?phpecho$entry_zone;?></td>
    <td><select name="zone_id"class="large-field">
    </select></td>
    </tr>
    Комментируем их или удаляем и опять обращаемся к контроллеру, к файлу catalog\controller\checkout\guest-shipping.php.


    Снова будем находить строки, отвечающие за корректное заполнение полей с регионом, страной и индексом.

    строки 133-145:

    Код:
    $country_info=$this->model_localisation_country->getCountry($this->request->post['country_id']);
    
    if($country_info&&$country_info['postcode_required']&&(utf8_strlen($this->request->post['postcode'])<2)||(utf8_strlen($this->request->post['postcode'])>10)){
    $json['error']['postcode']=$this->language->get('error_postcode');
    }
    
    if($this->request->post['country_id']==''){
    $json['error']['country']=$this->language->get('error_country');
    }
    
    if($this->request->post['zone_id']==''){
    $json['error']['zone']=$this->language->get('error_zone');
    }
    строки 154, 156-189:

    Код:
    $this->session->data['guest']['shipping']['postcode']=$this->request->post['postcode'];
    
    $this->session->data['guest']['shipping']['country_id']=$this->request->post['country_id'];
    $this->session->data['guest']['shipping']['zone_id']=$this->request->post['zone_id'];
    
    $this->load->model('localisation/country');
    
    $country_info=$this->model_localisation_country->getCountry($this->request->post['country_id']);
    
    if($country_info){
    $this->session->data['guest']['shipping']['country']=$country_info['name'];
    $this->session->data['guest']['shipping']['iso_code_2']=$country_info['iso_code_2'];
    $this->session->data['guest']['shipping']['iso_code_3']=$country_info['iso_code_3'];
    $this->session->data['guest']['shipping']['address_format']=$country_info['address_format'];
    }else{
    $this->session->data['guest']['shipping']['country']='';
    $this->session->data['guest']['shipping']['iso_code_2']='';
    $this->session->data['guest']['shipping']['iso_code_3']='';
    $this->session->data['guest']['shipping']['address_format']='';
    }
    
    $this->load->model('localisation/zone');
    
    $zone_info=$this->model_localisation_zone->getZone($this->request->post['zone_id']);
    
    if($zone_info){
    $this->session->data['guest']['shipping']['zone']=$zone_info['name'];
    $this->session->data['guest']['shipping']['zone_code']=$zone_info['code'];
    }else{
    $this->session->data['guest']['shipping']['zone']='';
    $this->session->data['guest']['shipping']['zone_code']='';
    }
    
    $this->session->data['shipping_country_id']=$this->request->post['country_id'];
    $this->session->data['shipping_zone_id']=$this->request->post['zone_id'];
    $this->session->data['shipping_postcode']=$this->request->post['postcode'];

    Разобравшись с адресом доставки, переходим к способу доставки. После установки движок по умолчанию выставляет фиксированную стоимость доставки, вот ее мы и будем править. Открываем файл catalog/model/shipping/flat.php и комментируем (или удаляем) код 6 строки:

    Код:
    $query=$this->db->query("SELECT * FROM ".DB_PREFIX."zone_to_geo_zone WHERE geo_zone_id = '".(int)$this->config->get('flat_geo_zone_id')."' AND country_id = '".(int)$address['country_id']."' AND (zone_id = '".(int)$address['zone_id']."' OR zone_id = '0')");

    Аналогичные действия необходимо совершить для пятого шага, если у вас, способ оплаты — оплата при доставке. Открываем файл catalog/model/payment/cod.php и комментируем 6 строку:

    Код:
    $query=$this->db->query("SELECT * FROM ".DB_PREFIX."zone_to_geo_zone WHERE geo_zone_id = '".(int)$this->config->get('cod_geo_zone_id')."' AND country_id = '".(int)$address['country_id']."' AND (zone_id = '".(int)$address['zone_id']."' OR zone_id = '0')");

    Теперь дело осталось за малым: отредактировать последний — шестой шаг. Открываем файл catalog/controller/checkout/confirm.phpи убираем все ненужные упоминания страны, региона и индекса.

    строки 150-155:

    Код:
    $data['payment_postcode']=$payment_address['postcode'];
    $data['payment_zone']=$payment_address['zone'];
    $data['payment_zone_id']=$payment_address['zone_id'];
    $data['payment_country']=$payment_address['country'];
    $data['payment_country_id']=$payment_address['country_id'];
    $data['payment_address_format']=$payment_address['address_format'];
    строки 184-189:

    Код:
    $data['shipping_postcode']=$shipping_address['postcode'];
    $data['shipping_zone']=$shipping_address['zone'];
    $data['shipping_zone_id']=$shipping_address['zone_id'];
    $data['shipping_country']=$shipping_address['country'];
    $data['shipping_country_id']=$shipping_address['country_id'];
    $data['shipping_address_format']=$shipping_address['address_format'];

    Открываем файл catalog/model/checkout/order.php и находим в 4 строке два отрезка кода и комментируем их (внимательно следим за символами и не разбиваем строку!):

    Код:
    "', payment_postcode = '".$this->db->escape($data['payment_postcode'])."', payment_country = '".$this->db->escape($data['payment_country'])."', payment_country_id = '".(int)$data['payment_country_id']."', payment_zone = '".$this->db->escape($data['payment_zone'])."', payment_zone_id = '".(int)$data['payment_zone_id']."', payment_address_format = '".$this->db->escape($data['payment_address_format']).

    Код:
    "', shipping_postcode = '".$this->db->escape($data['shipping_postcode'])."', shipping_country = '".$this->db->escape($data['shipping_country'])."', shipping_country_id = '".(int)$data['shipping_country_id']."', shipping_zone = '".$this->db->escape($data['shipping_zone'])."', shipping_zone_id = '".(int)$data['shipping_zone_id']."', shipping_address_format = '".$this->db->escape($data['shipping_address_format']).
    Подобным образом мы скрыли отображение и выбор страны и региона при гостевом оформлении заказа. Также учитывайте то, что мы правили лишь два модуля, связанные со способом доставки и оплаты, те, которые стоят в opencart по умолчанию: фиксированная стоимость доставки и оплата при доставке. Если Вы используете другие модули, другие варианты доставки и оплаты, то и править необходимо соответствующие модули.