Как работает автоматическое определение языка в Опенкарт

- Posted in Opencart by

Для начала давайте разберёмся, как это всё устроено в браузерах и этих наших интернетах.

  1. Человек в настройках браузера обычно имеет возможность указать один или несколько языков, которые он понимает и предпочитает. Ищите в настройках что-то вроде "Preferred languages" (предпочитаемые языки). В браузерах попроще, с прицелом на чайников и минимумом настроек, локаль может браться системная или быть вшита в локализованный софт (без возможности настройки пользователем).

  2. Браузер отдаёт эту информацию сайтам в HTTP-заголовках Accept-Language при всех запросах. Этим он сообщает сайтам: если есть контент на одном из языков из моего списка - дайте мне его! (Если нет для первого - давайте для следующего по списку; если вообще ничего нет - давайте что там у вас есть по умолчанию). Варианты, которые встречаются у посетителей ваших сайтов, можно найти в Google Analytics, Яндекс.Вебмастер, Awstats, Piwik и других подобных системах веб-аналитики. Что отдаёт ваш браузер сайтам, вы можете увидеть в инструментах разработчика, посмотрев на HTTP-заголовки.

  3. Сайт может анализировать или игнорировать эти заголовки, реагируя на указанные предпочтения или нет.

Теперь Опенкарт. Мне кажется, 9 из 10 пользователей этого движка понятия не имеют, что это за строчка в описании языка в админке со всякими ru, ru-ru, uk, uk_UA и т.п. Теперь догадываетесь?

Это - простой список локалей, которые браузер может передать в заголовках. И на которые мы имеем возможность среагировать (админ магазина, движок). Если у нового пользователя опенкарт язык сайта ещё не выбран (и не записан в куках), то Опенкарт смотрит на HTTP-заголовки Accept-Language. И сравнивает их с тем, что мы понаписали в админке для русского, украинского и других языков.

Поскольку браузеры обычно дают выбирать языки и локали из списка, а не прописывать их вручную, то там чаще всего будет код языка или языка и региона. Например: ru, ru-ru, ru-RU, ru_ru, ru_RU. В Украине бывает uk (украинский язык), ru_UA, uk_UA. Ну и ru-UA, uk-UA до кучи.

Обычно локаль указывается с подчёркиванием "_", но жёстких стандартов по этому поводу кажется нет. И нередко можно встретить минус, тире или как там его правильно называть в типографике: "-". То же самое касается регистра символов в коде страны. Надо прописать все возможные комбинации, так как Опенкарт не приводит их к нижнему регистру при сравнении (смотрел на версии 2.1.0.2 - думаю, в остальных так же).

Итого: у вас в опенкарт админке в настройке языка должен быть список языков/локалей, которые могут запросить браузеры ваших посетителей (смотрите логи и аналитику и подстраивайтесь под своих посетителей). И этой настройкой вы определяете, какой язык им отдать при первом посещении вашего сайта ("угадать" его предпочтения).

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

И ещё очень хочется верить, что люди перестанут творить дурдом с выдачей языка по местоположению (GeoIP). Потому что француз, понимающий французский и английский (что указано в его браузерах на его ноутбуке) и который путешествует по миру, совсем не обрадуется, если ему будут выдавать контент на языке страны интернет-кафе.

Русский язык / русский перевод для Opencart v2.0

- Posted in Opencart by

Выпущен русский перевод для Опенкарт версий v2.0.

Из интересного - есть автоматическая установка средствами Opencart Extension Installer (новый инструмент в версии 2.0). Вроде и работает, но местами у некоторых клиентов встречаются грабли и проще поставить по-старинке, вручную. Одно можно сказать точно: если вы этой фишкой пользуетесь и настроили себе, установка других ocmod-модулей происходит без проблем, -- то и с установкой нашего модуля русского перевода проблем не будет: установка происходит буквально в один-два шага (выбрать архив и подтвердить установку).

Также сделали модуль, который помогает переводить ресурсы в базе на русский и обратно на английский, если потребуется. Это все статусы и география, которые устанавливаются с демо-данными.

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

Об ошибках сообщайте на странице поддержки в фейсбуке.

О печальном

4 года экспериментов с русскоязычным сообществом (поддержка бесплатного русского перевода для Опенкарт 1.5.x) считаю законченным. Интерес (в смысле дай) велик, а интерес в поддержке разработчиков бесплатного или к совместной работе - практически на полном нуле. Поэтому перевод для версии 2.0 решено сделать платным, за символическую цену в $2 (WMZ, WMU, П24, Paypal, карточки). Владельцам QIWI и Yandex-Денег - тоже в оплату картами VISA/MC мгновенного выпуска.

Перевод для v15x оставлен на гитхабе, а ветки версии v2.0 перенесены в приватный репозиторий.

Модуль также можно купить на opencart.com: Russian language translation v2.0.x / русский перевод, там цена $10 по техническим причинам (ниже не даёт выставить торговая площадка).

SafePatch - альтернатива vQmod

- Posted in Webdev by

Идея патчей и vQmod совершенно одинаковая. И в одном, и другом случае файл с изменениями накладывается на некую известную основу. И если эта основа изменилась -- и патч, и vQmod могут "поломаться": не смогут внести изменения, если не найдут точного соответствия, необходимого для внесения правок.

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

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

К тому же vQmod - рантайм решение. То есть работает при каждом запросе к серверу. Конечно, многое решается кешированием. Но я из тех разработчиков, которые не совсем понимают, зачем нужно вводить лишнее звено, если то же самое делается без дополнительных костылей (а технологии внесения и убирания этих изменений существуют уже лет 40 и протестированы не одним поколением программистов -- я говорю об утилитах patch и diff).

Причём убрать изменения так же просто, как и наложить патч.

Применить изменения к коду: git apply fix-some-problem.diff или patch -p1 fix.diff

Убрать изменения: git apply -R fix-some-problem.diff или patch -R fix.diff

И где здесь сложная часть? Это ничуть не сложнее удаления VQmod файла. При использовании vQmod надо управляться с набором XML файлов. При использовании стандартного подхода -- с набором DIFF файлов. Невелика разница. А преимущества серьёзные.

И вот совсем недавно, в поисках PHP-реализации утилиты patch или автоматического конвертера DIFF в vQmod XML, я наткнулся на замечательный вариант: утилиту SafePatch.

http://code.google.com/p/safepatch/

UPD: в связи с закрытием Google Code проект переместился на Github: progerxp/safepatch.

Если кратко и своими словами -- это "менеджер пакетов" (расширений). Но в отличие от vQmod (runtime) он эти изменения вносит непосредственно в исходный код (как и patch). При этом понимает формат VQmod и может использовать эти файлы тоже.

Так что те, кто интересуется вопросом - встречайте. По-моему, хороший инструмент. Это не совсем то, что я искал, но отличное готовое решение проблемы.

See also:

Обновлён русский перевод для Opencart 1.5.3

- Posted in Opencart by

Обновлён перевод для Opencart 1.5.3.

Перевод для 1.5.2 приведён в соответствие с релизом Opencart 1.5.2.1 (убрано лишнее, что попало в эту ветку в промежутке от 1521, 1522, 153). 1.5.3 выделена в отдельную ветку.

Opencart 1.5.1.x: страница товара - на вкладку характеристик добавлен вес и размеры

- Posted in Opencart by
Добавлен показ веса и размеров на вкладке характеристик товара (Opencart 1.5)

По умолчанию они почему-то не выводятся в характеристиках товара и увидеть их можно только на странице сравнения.

Вывести подготовленные данные (вес и размеры товара) можно в другом месте шаблона (например вверху, рядом с моделью и бонусными баллами) -- думаю, не составит труда переставить вывод в более удобное место самостоятельно.

Изменения для обеих версий одинаковые. Просто на вкладке для 1.5.1.3 более полная версия: включает в себя изменение системных библиотек для более аккуратного вывода нулевых значений веса и размеров. В версии 1.5.1.2 я это изменение вносил давно и забыл про него написать.

commit a26a849f1ac31fd2ab24f491860748b64f588ef8
Author: Ruslan Brest 
Date:   Thu Nov 17 18:20:47 2011 +0200
    [+] catalog: информация о товаре - на вкладку характеристик добавлен вес и размеры
diff --git a/public_html/catalog/controller/product/product.php b/public_html/catalog/controller/product/product.php
index 25ba580..8062941 100644
--- a/public_html/catalog/controller/product/product.php
+++ b/public_html/catalog/controller/product/product.php
@@ -3,6 +3,7 @@ class ControllerProductProduct extends Controller {
    private $error = array();
 
    public function index() {
+       $this->language->load('product/compare');
        $this->language->load('product/product');
 
        $this->data['breadcrumbs'] = array();
@@ -154,6 +155,9 @@ class ControllerProductProduct extends Controller {
            $this->data['text_share'] = $this->language->get('text_share');
            $this->data['text_wait'] = $this->language->get('text_wait');
            $this->data['text_tags'] = $this->language->get('text_tags');
+           $this->data['text_weight_and_dim'] = $this->language->get('text_weight_and_dim');
+           $this->data['text_weight'] = $this->language->get('text_weight');
+           $this->data['text_dimension'] = $this->language->get('text_dimension');
 
            $this->data['entry_name'] = $this->language->get('entry_name');
            $this->data['entry_review'] = $this->language->get('entry_review');
@@ -178,10 +182,14 @@ class ControllerProductProduct extends Controller {
            $this->data['product_id'] = $this->request->get['product_id'];
            $this->data['manufacturer'] = $product_info['manufacturer'];
            $this->data['manufacturers'] = $this->url->link('product/manufacturer/product', 'manufacturer_id=' . $product_info['manufacturer_id']);
-           $this->data['model'] = $product_info['model'];
+           $this->data['model']  = $product_info['model'];
            $this->data['reward'] = $product_info['reward'];
            $this->data['points'] = $product_info['points'];
-
+           $this->data['weight'] = $this->weight->format($product_info['weight'], $product_info['weight_class_id']);
+           $this->data['length'] = $this->length->format($product_info['length'], $product_info['length_class_id']);
+           $this->data['width']  = $this->length->format($product_info['width'], $product_info['length_class_id']);
+           $this->data['height'] = $this->length->format($product_info['height'], $product_info['length_class_id']);
+           
            if ($product_info['quantity'] <= 0) {
                $this->data['stock'] = $product_info['stock_status'];
            } elseif ($this->config->get('config_stock_display')) {
@@ -309,7 +317,7 @@ class ControllerProductProduct extends Controller {
            $this->data['rating'] = (int)$product_info['rating'];
            $this->data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');
            $this->data['attribute_groups'] = $this->model_catalog_product->getProductAttributes($this->request->get['product_id']);
-
+           
            $this->data['products'] = array();
 
            $results = $this->model_catalog_product->getProductRelated($this->request->get['product_id']);
diff --git a/public_html/catalog/language/english/product/product.php b/public_html/catalog/language/english/product/product.php
index 16f42c5..1771dc0 100644
--- a/public_html/catalog/language/english/product/product.php
+++ b/public_html/catalog/language/english/product/product.php
@@ -25,6 +25,7 @@ $_['text_upload']       = 'Your file was successfully uploaded!';
 $_['text_wait']         = 'Please Wait!';
 $_['text_tags']         = 'Tags:';
 $_['text_error']        = 'Product not found!';
+$_['text_weight_and_dim'] = 'Weight and dimension';
 
 // Entry
 $_['entry_name']        = 'Your Name:';
diff --git a/public_html/catalog/language/russian/product/product.php b/public_html/catalog/language/russian/product/product.php
index 7542b96..fae7e99 100644
--- a/public_html/catalog/language/russian/product/product.php
+++ b/public_html/catalog/language/russian/product/product.php
@@ -25,6 +25,8 @@ $_['text_upload']       = 'Ваш файл был успешно загруже
 $_['text_wait']         = 'Пожалуйста, подождите!';
 $_['text_tags']         = 'Метки:';
 $_['text_error']        = 'Товар не найден!';
+$_['text_weight']       = 'Вес';
+$_['text_weight_and_dim'] = 'Вес и размеры';
 // Entry
 $_['entry_name']        = 'Ваше имя:';
 $_['entry_review']      = 'Ваш отзыв:';
diff --git a/public_html/catalog/view/theme/default/template/product/product.tpl b/public_html/catalog/view/theme/default/template/product/product.tpl
index aaeab64..8e8f8e8 100644
--- a/public_html/catalog/view/theme/default/template/product/product.tpl
+++ b/public_html/catalog/view/theme/default/template/product/product.tpl
@@ -221,6 +221,24 @@
   
   
+ + + + + + + + + + + + + + + + + +
commit 2dec5cba9d01d1fbef34e34bfaa5558bb7676c3e
Author: Ruslan Brest 
Date:   Wed Feb 15 10:17:52 2012 +0200
    [+] catalog: информация о товаре - на вкладку характеристик добавлен вес и размеры
diff --git a/upload/admin/language/english/english.php b/upload/admin/language/english/english.php
index 891da64..7f05d1c 100644
--- a/upload/admin/language/english/english.php
+++ b/upload/admin/language/english/english.php
@@ -7,6 +7,8 @@ $_['date_format_long']        = 'l dS F Y';
 $_['time_format']             = 'h:i:s A';
 $_['decimal_point']           = '.';
 $_['thousand_point']          = ',';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_yes']                = 'Yes';
diff --git a/upload/admin/language/russian/russian.php b/upload/admin/language/russian/russian.php
index 2860121..f3fcd1a 100644
--- a/upload/admin/language/russian/russian.php
+++ b/upload/admin/language/russian/russian.php
@@ -7,6 +7,8 @@ $_['date_format_long']        = 'l, d F Y';
 $_['time_format']             = 'H:i:s';
 $_['decimal_point']           = '.';
 $_['thousand_point']          = ',';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_yes']                = 'Да';
diff --git a/upload/catalog/controller/product/product.php b/upload/catalog/controller/product/product.php
index eadd2f3..c51d220 100644
--- a/upload/catalog/controller/product/product.php
+++ b/upload/catalog/controller/product/product.php
@@ -3,6 +3,7 @@ class ControllerProductProduct extends Controller {
    private $error = array(); 
    
    public function index() { 
+       $this->language->load('product/compare');
        $this->language->load('product/product');
    
        $this->data['breadcrumbs'] = array();
@@ -154,6 +155,9 @@ class ControllerProductProduct extends Controller {
            $this->data['text_share'] = $this->language->get('text_share');
            $this->data['text_wait'] = $this->language->get('text_wait');
            $this->data['text_tags'] = $this->language->get('text_tags');
+           $this->data['text_weight_and_dim'] = $this->language->get('text_weight_and_dim');
+           $this->data['text_weight'] = $this->language->get('text_weight');
+           $this->data['text_dimension'] = $this->language->get('text_dimension');
            
            $this->data['entry_name'] = $this->language->get('entry_name');
            $this->data['entry_review'] = $this->language->get('entry_review');
@@ -181,6 +185,11 @@ class ControllerProductProduct extends Controller {
            $this->data['model'] = $product_info['model'];
            $this->data['reward'] = $product_info['reward'];
            $this->data['points'] = $product_info['points'];
+
+           $this->data['weight'] = $this->weight->format($product_info['weight'], $product_info['weight_class_id']);
+           $this->data['length'] = $this->length->format($product_info['length'], $product_info['length_class_id']);
+           $this->data['width']  = $this->length->format($product_info['width'], $product_info['length_class_id']);
+           $this->data['height'] = $this->length->format($product_info['height'], $product_info['length_class_id']);
            
            if ($product_info['quantity'] <= 0) {
                $this->data['stock'] = $product_info['stock_status'];
diff --git a/upload/catalog/language/english/english.php b/upload/catalog/language/english/english.php
index cdf17cf..74b1bd6 100644
--- a/upload/catalog/language/english/english.php
+++ b/upload/catalog/language/english/english.php
@@ -7,6 +7,8 @@ $_['date_format_long']      = 'l dS F Y';
 $_['time_format']           = 'h:i:s A';
 $_['decimal_point']         = '.';
 $_['thousand_point']        = ',';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_home']             = 'Home';
diff --git a/upload/catalog/language/english/product/product.php b/upload/catalog/language/english/product/product.php
index 16f42c5..762f0b5 100644
--- a/upload/catalog/language/english/product/product.php
+++ b/upload/catalog/language/english/product/product.php
@@ -25,6 +25,8 @@ $_['text_upload']       = 'Your file was successfully uploaded!';
 $_['text_wait']         = 'Please Wait!';
 $_['text_tags']         = 'Tags:';
 $_['text_error']        = 'Product not found!';
+$_['text_weight']       = 'Weight';
+$_['text_weight_and_dim'] = 'Weight and dimension';
 
 // Entry
 $_['entry_name']        = 'Your Name:';
diff --git a/upload/catalog/language/russian/product/product.php b/upload/catalog/language/russian/product/product.php
index 7542b96..e44ea79 100644
--- a/upload/catalog/language/russian/product/product.php
+++ b/upload/catalog/language/russian/product/product.php
@@ -25,6 +25,9 @@ $_['text_upload']       = 'Ваш файл был успешно загруже
 $_['text_wait']         = 'Пожалуйста, подождите!';
 $_['text_tags']         = 'Метки:';
 $_['text_error']        = 'Товар не найден!';
+$_['text_weight']       = 'Вес';
+$_['text_weight_and_dim'] = 'Вес и размеры';
+
 // Entry
 $_['entry_name']        = 'Ваше имя:';
 $_['entry_review']      = 'Ваш отзыв:';
diff --git a/upload/catalog/language/russian/russian.php b/upload/catalog/language/russian/russian.php
index 48829a5..f69f200 100644
--- a/upload/catalog/language/russian/russian.php
+++ b/upload/catalog/language/russian/russian.php
@@ -7,6 +7,8 @@ $_['date_format_long']      = 'l d F Y';
 $_['time_format']           = 'H:i:s';
 $_['decimal_point']         = '.';
 $_['thousand_point']        = '';
+$_['length_decimals']       = 0;
+$_['weight_decimals']       = 0;
 
 // Text
 $_['text_home']             = 'Главная';
diff --git a/upload/catalog/view/theme/default/template/product/product.tpl b/upload/catalog/view/theme/default/template/product/product.tpl
index 81d6334..b7a3d15 100644
--- a/upload/catalog/view/theme/default/template/product/product.tpl
+++ b/upload/catalog/view/theme/default/template/product/product.tpl
@@ -27,6 +27,8 @@
          
         
          
+       
+
          
          
@@ -227,7 +229,7 @@
- + @@ -238,14 +240,26 @@
+
- - x x - + + + + + + + + + + + + + + + -
diff --git a/upload/system/library/length.php b/upload/system/library/length.php index 70f1b0f..f4d120a 100644 --- a/upload/system/library/length.php +++ b/upload/system/library/length.php @@ -5,6 +5,7 @@ final class Length { public function __construct($registry) { $this->db = $registry->get('db'); $this->config = $registry->get('config'); + $this->language = $registry->get('language'); $length_class_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "length_class mc LEFT JOIN " . DB_PREFIX . "length_class_description mcd ON (mc.length_class_id = mcd.length_class_id) WHERE mcd.language_id = '" . (int)$this->config->get('config_language_id') . "'"); @@ -39,10 +40,11 @@ final class Length { } public function format($value, $length_class_id, $decimal_point = '.', $thousand_point = ',') { + if( 0 == $value ) return ""; if (isset($this->lengths[$length_class_id])) { - return number_format($value, 2, $decimal_point, $thousand_point) . $this->lengths[$length_class_id]['unit']; + return number_format($value, (int)$this->language->get('length_decimals'), $decimal_point, $thousand_point) . $this->lengths[$length_class_id]['unit']; } else { - return number_format($value, 2, $decimal_point, $thousand_point); + return number_format($value, (int)$this->language->get('length_decimals'), $decimal_point, $thousand_point); } } } diff --git a/upload/system/library/weight.php b/upload/system/library/weight.php index 584df3c..6b8c59f 100644 --- a/upload/system/library/weight.php +++ b/upload/system/library/weight.php @@ -5,6 +5,7 @@ final class Weight { public function __construct($registry) { $this->db = $registry->get('db'); $this->config = $registry->get('config'); + $this->language = $registry->get('language'); $weight_class_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "weight_class wc LEFT JOIN " . DB_PREFIX . "weight_class_description wcd ON (wc.weight_class_id = wcd.weight_class_id) WHERE wcd.language_id = '" . (int)$this->config->get('config_language_id') . "'"); @@ -34,10 +35,11 @@ final class Weight { } public function format($value, $weight_class_id, $decimal_point = '.', $thousand_point = ',') { + if( 0 == $value ) return ""; if (isset($this->weights[$weight_class_id])) { - return number_format($value, 2, $decimal_point, $thousand_point) . $this->weights[$weight_class_id]['unit']; + return number_format($value, (int)$this->language->get('weight_decimals'), $decimal_point, $thousand_point) . $this->weights[$weight_class_id]['unit']; } else { - return number_format($value, 2, $decimal_point, $thousand_point); + return number_format($value, (int)$this->language->get('weight_decimals'), $decimal_point, $thousand_point); } }

Opencart 1.5.1.x: Упрощённое оформление заказа на одной странице (Quickcheckout one-page simple checkout)

- Posted in Opencart by

Сделал вот такую укороченную форму заказа (скриншоты ниже). Упрощённое гостевое оформление заказа на одной странице.

Преимущества (они же и недостатки):

  • Предельно компактно и быстро, не утомляет покупателя. По статистике на каждом лишнем шаге при оформлении заказа сходят с дистанции 20% покупателей;
  • Всё на виду и получилось весьма удобно и наглядно;
  • Предполагается оплата исключительно методом "Cash on delivery" (оплата наличными по факту доставки). Всё остальное решается по телефону и комментариями;
  • В админке нет никаких настроек (это касаемо предыдущего пункта; используется только cash-on-delivery способ, и он указан в коде и должен быть разрешен).
  • Нет никакого учёта всего, что связано с адресом и гео-информацией (включая налоги, так как они зависят от адреса)

Модуль совместим только с версиями 1.5.1.*. Под более новые адаптировать не планирую, т.к. альтернатив уже существует большое количество и можно взять готовое решение. Создавать ещё одно решение будет также стоить денег, причины постарался описать в отдельной статье (см. также в конце, в списке связанных статей). Есть версия под Opencart 1.4.9.x (ocStore 0.2.2 / 0.2.0). Ниже описаны недостатки и возможности.

Купить

Оплата вручную: Webmoney кошельки: Z385421512525, R304747241741 U415109965360 E180553785592
Оплата карточкой или Paypal:
Version
Email for sending .ZIP-file:
  1. Удобнее всего купить модуль быстрого оформления заказа на Opencart.com. Там архив сразу доступен для скачивания и не надо ждать, пока я его отправлю. Также проще будет забирать обновления в любой удобный момент - вы будете получать уведомления от сервиса по email;
  2. Вручную за 10WMZ, или по курсу в WMR или WMU. Или 10$ через Paypal (там же принимаются банковские карты). В комментариях к платежу укажите свой email, на который надо выслать ZIP архив с модулем.

Вручную я высылаю архив сразу после того, как узнаю о платеже. Обычно это занимает не более суток. Чаще гораздо меньше, но случаи разные бывают и иногда я могу быть недоступен. Webmoney не присылает мне никаких уведомлений на email (единственный из сервисов, кстати), поэтому о платеже там лучше написать дополнительно на email или через форму обратной связи в блоге. Иначе узнать о платеже там я могу лишь по чистой случайности.

Поэтому рекомендую довериться автоматике на Opencart.com. Там немного дороже, но покупка удобнее для последующих обновлений. И может оказаться быстрее, чем с моим участием.

Если покупаете на Опенкарт.ком, посмотрите на пару способов доставки с текстом и ссылками вместо цены — они удобны для курьерских служб.

Возможности и ограничения

<

p>Версия Quickcheckout для Opencart 1.5.1 поставляется в 2 версиях:

  • более старая (QC) не имеет выбора способов оплаты (покупателю надо выбрать только доставку), но может быть гораздо удобней тем магазинам, которые торгуют локально по городу и доставляют товары по стране, используя единственный способ оплаты - из рук в руки;
    • Этот вариант не заменяет никакие файлы Opencart;
  • QCPM (с поддержкой способов оплаты, payment methods) существует для версии Опенкарт 1.5.1.3.
    • этот вариант заменяет часть стандартных файлов - более подробная информация в README в соответствующей папке. Присылайте неизвестные мне модули или содержимое этой папки (tpl файлы) - я их модифицирую для QC/PM и включу tpl в архив

Admin: Дополнения / Доставка:

Будут использоваться только те модули, в которых установлена географическая зона ВСЕ РЕГИОНЫ. Это связано с тем, что из модуля полностью убрано всё, что связано с географической информацией.

Внимание: модуль "Доставка в зависимости от веса" не будет работать -- у него отсутствуют настройки для всех регионов. Если вы используете вес товаров - включите вместо него способ "Доставка по городу Citylink". Если вес не нужен - попробуйте "Фиксированную стоимость доставки" или другой подходящий способ.

Если пользователь зарегистрирован и предварительно залогинился, его данные подставятся в форму (имя, email, телефон) и заказ будет связан с этим покупателем. Планируется добавить возможность быстрой регистрации, но сроки неизвестны.

Поддерживаются Shoppica и Spicylicious темы оформления - для них в архиве есть отдельные папки. По вопросам поддержки других специфических тем оформления, на которых форма заказа выглядит плохо - обращайтесь.

Демо: http://rb.labtodo.com/shop/test-demo

В версии Quickcheckout для Opencart 1.4.9.x (ocStore 0.2.2 / 0.2.0) есть и оплата, и доставка, но не проверялась работа с зарегистрированными пользователями - было сделано только гостевое оформление. Эта версия заменяет стандартные файлы опенкарт, поэтому если используется другая тема оформления -будьте аккуратны при установке и сделайте предварительно резервные копии ваших файлов.

Демо: http://ocs020.labtodo.com/

Вебмани мне не присылает уведомления на email, поэтому лучше сообщить дополнительно (через форму обратной связи например), если архив нужен срочно. Если я на связи, то сразу же и отправлю. Остальные сервисы уведомляют. Или можно подождать - я в течение дня обычно высылаю, просматриваю почту регулярно. Автоматически на полном автопилоте можно купить на сайте opencart.com, но там чуть дороже. Зато можно в любой момент скачать архив (и апдейты), не дожидаясь ответа от меня.

Если нет электронных кошельков и желания платить карточкой - обычно можно без проблем пополнить WMR или WMU кошелёк наличными через платёжные терминалы.

2011-11-27. Исправлена ошибка в версии для Opencart 1.5.1.3. Всем, кто покупал на opencart.com, должно было прийти уведомление об обновлении. Кто покупал вручную, через Webmoney/Paypal - напишите, вышлю обновление для 1.5.1.3.

2011-11-30. Появилась тестовая версия для ocStore 0.2.0 / 0.2.2 (Opencart 1.4.9.?). Возможно, будет ещё дорабатываться. Но шансов мало - я вообще не планировал версиею для 1.4. Пока не проверена покупка зарегистрированным пользователем. И форма работает в 2 шага. Если будет время - попробую улучшить. Пока так, как на демо: http://ocs020.labtodo.com/

Позже собираюсь сделать такую же одностраничную форму со всеми опциями. Наверное все эти способы тоже кому-то, да нужны (нужны, да? Или нет?).

Ошибки или проблемы с установкой?

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

<

p>Мелкие модификации также входят в список того, что я помогаю сделать при первичной настройке:

  • сделать другие поля обязательными или необязательными;
  • убрать или переименовать какие-то поля (например, поменять ФИО на что-то другое, заменить продолжение адреса на ближайшую станцию метро, удобный склад перевозчика или индекс).

Значительно ускорить процесс может наличие в письме параметров доступа к FTP и в админ-часть Опенкарт. Это позволит гораздо быстрее обнаружить и устранить ошибки в конфигурации (модулей оплаты и доставки, например) или неправильной установке, убедиться в том, что ничего не напутано с версиями, увидеть лог ошибок сразу же по мере их воспроизведения и после изменений. Объяснять в переписке, что именно попробовать, исправить или проверить - в большинстве случаев гораздо дольше и сложнее. Поэтому по возможности сразу их указывайте, если понимаете, что сами этим заниматься не будете.