Извините за задержку

- Posted in Uncategorized by

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

Сейчас постараюсь всем отправить. Простите за задержку.

Здесь ни аськи, ни скайпа нет, так что может недоступен буду сегодня. К email доступ есть.

UPD @ 21:41. Всё, я ожил в нормальном режиме. Отправил и ответил всем (если ничего не перепутал).

(Не?)Эффективность стандартной формы заказа Opencart 1.5.1

- Posted in Opencart by

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

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

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

Funnel conversion rate: 7.37%. То есть почти 93% не выдерживают до конца и уходят без оформления покупки.

Некоторые уходят бесповоротно, часть возвращается к просмотру корзины (это скорей всего мы по большей части - владельцы и разработчики). Часть уходит на просмотр условий доставки. То есть их не хватает на этой старнице - и короткая форма заказа это отчасти решает.

Так что теперь остаётся подождать несколько месяцев (хотя бы 3) и узнать, насколько изменится уровень конверсии.

В понедельник (а короткая форма была установлена на выходных) мы получили сразу 4 заказа в один день. Посмотрев на статистику предыдущих 3 месяцев, вы наверное догадаетесь, что нас это приятно удивило. Это могло оказаться и совпадением, но тем не менее форма однозначно сыграла роль на своём этапе. Причём если до этого у нас были заказы на совсем небольшие суммы (около 200 грн / ~$25 USD), то в понедельник помимо роста их количества выросла существенно и сумма заказов (раз в 5).

Предварительные выводы за неделю работы короткой формы заказа

Тенденция видна уже даже за такой короткий промежуток (ещё не прошло и недели):

Что можно увидеть? Во-первых, заметно, что люди стали покупать быстрее: очень мало просматривают корзину и сомневаются - 90% перешли сразу к заказу/оплате и быстро его завершили. Обычно в заказе 1-2 позиции. То есть люди принимают решение и покупают из каталога.

Заметно и то, что эффективность "воронки продаж" выросла в 4 раза: было 7%, стало 29%. Время ещё уточнит и сгладит цифры. Пока такие :) Скоро у нас будет выкладка подготовленных зимних товаров, так что есть надежда на рост продаж сезонных категорий.

UPD 2011-11-26. На самом деле на картинке есть неточность: на шаге "shopping cart view" показано 23 посетителя на входе, 21 вышли, 2 прошли дальше. На самом деле 11 "вышло" на Quickcheckout - не успел отредактировать пути. Попросту забыл про них, только сейчас вспомнил об этом. И двое вернулись на тот же просмотр корзины. То есть на следующий шаг воронки прошло не 2 (8.70%), а 13 посетителей. И не на тот шаг, что на картинке, а на "параллельный" quickcheckout (который я забыл и его здесь нет). А на картинке - значит, один заказ в этот период я зацепил ещё с оформлением по старой форме. Плюс-минус день наверное промазал. В итоге более правильная картина: 23 => 13 => 9. И эффективность соответственно выше.

См. также:

Opencart 1.5.1: вывод информации о наличии под картинкой в каталоге товаров

- Posted in Uncategorized by

В ответ на

http://rb.labtodo.com/page/izmenjaem-dlinu-opisanij-tovarov-v-kataloge-opencart-1505#comment-281 Подскажите пожалуйста как сделать для opencart 1.5.1 чтоб в категории в описании товаров под картинкой отображалось наличие товара (есть в наличии или доступен под заказ...)

Для 1.5.1.2 и 1.5.1.3 код ниже. На 1.5.1.3 не проверял - если есть отличия и не работает, сообщите.

Небольшие изменения вносились раньше, поэтому могут быть небольшие отличия между тем, что вы видите у себя, и здесь (например, thumb_w, thumb_h, cut_descr) -- не обращайте на них внимания. Вставляемый код неизменный как для 1.5.1.2, так и для 1.5.1.3, номера строк совпадают - главное найти место для вставки, а их легко идентифицировать по остальными имеющимся признакам.

diff --git a/public_html/catalog/controller/product/category.php b/public_html/catalog/controller/product/category.php
index d3ba191..3613e7c 100644
--- a/public_html/catalog/controller/product/category.php
+++ b/public_html/catalog/controller/product/category.php
@@ -1,6 +1,7 @@
 <?php
 class ControllerProductCategory extends Controller {
    public function index() {
+       $this->language->load('product/product');
        $this->language->load('product/category');
 
        $this->load->model('catalog/category');
@@ -182,6 +183,15 @@ class ControllerProductCategory extends Controller {
                    $rating = false;
                }
 
+               $stock = $this->language->get('text_stock') . ' ';
+               if ($result['quantity'] <= 0) {
+                   $stock .= $result['stock_status'];
+               } elseif ($this->config->get('config_stock_display')) {
+                   $stock .= $result['quantity'];
+               } else {
+                   $stock .= $this->language->get('text_instock');
+               }
+
                $cut_descr_symbols = 400;
                $descr_plaintext = strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'));
                if( mb_strlen($descr_plaintext, 'UTF-8') > $cut_descr_symbols )
@@ -195,6 +205,7 @@ class ControllerProductCategory extends Controller {
                    'thumb'       => $image,
                    'thumb_w'     => $this->config->get('config_image_product_width'),
                    'thumb_h'     => $this->config->get('config_image_product_height'),
+                   'stock'       => $stock,
                    'name'        => $result['name'],
                    'description' => $descr_plaintext,
                    'price'       => $price,
diff --git a/public_html/catalog/view/theme/default/template/product/category.tpl b/public_html/catalog/view/theme/default/template/product/category.tpl
index 6e9054a..19680ad 100644
--- a/public_html/catalog/view/theme/default/template/product/category.tpl
+++ b/public_html/catalog/view/theme/default/template/product/category.tpl
@@ -70,7 +70,9 @@
     <?php foreach ($products as $product) { ?>
     <div>
       <?php if ($product['thumb']) { ?>
-      <div class="image"><?php if( $product['special'] ) { ?><div class="akcii-img"></div><?php } ?><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" width="<?php echo $product['thumb_w']; ?>" height="<?php echo $product['thumb_h']; ?>" title="<?php echo $product['name']; ?>" alt="<?php echo $product['name']; ?>" /></a></div>
+      <div class="image"><?php if( $product['special'] ) { ?><div class="akcii-img"></div><?php } ?><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" width="<?php echo $product['thumb_w']; ?>" height="<?php echo $product['thumb_h']; ?>" title="<?php echo $product['name']; ?>" alt="<?php echo $product['name']; ?>" /></a>
+      <?php echo $product['stock'];?>
+      </div>
       <?php } ?>
       <div class="name"><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a></div>
       <div class="description"><?php echo $product['description']; ?></div>

Продолжение обсуждение этой и охожих тем -- на форуме: http://rb.labtodo.com/forum/topic/4/vyvod-informatsii-o-nalichii-v-kataloge-tovarov/

Что такое diff

- Posted in Uncategorized by

При публикации изменений используется формат DIFF. С его помощью можно перенести небольшие изменения к себе вручную (см. ниже). Или автоматически: командами git apply rb-patch.diff или patch -p2 < rb-patch.diff (находясь в корневой папке магазина - там, где расположены каталоги admin и catalog).

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

Перенос изменений вручную

См. http://rb.labtodo.com/page/opencart-admin-attributes-usability-improvement#comment-138

Это список изменений. В начале строк - индикаторы: что убрать (минусы, красный цвет) в старом файле и что добавить (плюсики, зелёный цвет).

В каких именно файлах - указано утроенным значком (---, +++)

@@ -106,10 +106,12 @@ -- строки, т.е. примерно на 106 строке вы должны найти похожий кусок кода, перед и после блока изменений обычно выводится пара строк текста. "Примерно 106" - потому что я множество правок вношу в свой магазин и содержимое файлов может не совпадать с оригинальным OpenCart 1.5.1.1 или с тем правками, которые внесены у вас до меня.

Правки индицируются значками "-" и "+" в самом начале строки: те, что с минусом, были убраны (они должны совпадать с тем, что вы у себя видите перед внесением изменений), а те, что с плюсом -- добавлены в это место. Поэтому можно руками внести и проконтролировать все изменения.

В данном случае надо закомментировать небольшую часть в файле admin/controller/catalog/attribute.php и модифицировать одну строку в admin/model/catalog/attribute.php (заменить её на несколько новых, которые можно скопировать и убрать плюсики в начале строк).

См. также

  • Улучшение сортировки на витрине Опенкарт - ещё одна статья с примером описания "обычным языком" и diff-файлом. До сих пор считаете длинное описание более понятным, чем diff? Не перестаю удивляться таким заявлениям.

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

Opencart 1.5.x (catalog): SEO - автоматическое заполнение meta keywords

- Posted in Opencart by

Если поле "meta keywords" не заполнено в админке, Опенкарт его не выводит. Для улучшения ситуации заполним его автоматически, продублировав слова из названия товара.

В результате у нас будет что-то вроде:


Аппарат для приготовления блинов Bomann CM 2221 CB

Не идеал, но вроде бы лучше, чем ничего. Или ручное прописывание у всех товаров, хи-хи. В то же время вручную описать эти поля никто не мешает, и в случае их заполненности автоматика не вмешивается. Делать автозаполнение для "meta description" не решился, потому что одинаковое название и описание не приветствуется. Но кому хочется - могут дописать if( empty($this->data['description']) ) $this->data['description'] = $this->data['title'];

Для версий Opencart 1.5.x, включая 1.5.1.3; ocStore 1.0.1.

diff --git a/public_html/catalog/controller/common/header.php b/public_html/catalog/controller/common/header.php
index 79bf735..1904774 100644
--- a/public_html/catalog/controller/common/header.php
+++ b/public_html/catalog/controller/common/header.php
@@ -18,6 +18,15 @@ class ControllerCommonHeader extends Controller {
                $this->data['direction'] = $this->language->get('direction');
                $this->data['google_analytics'] = html_entity_decode($this->config->get('config_google_analytics'), ENT_QUOTES, 'UTF-8');
 
+               // SEO improvements:
+               // If keywords and description not set - use title here too
+               if( empty($this->data['keywords']) )
+               {
+                       $words = explode(' ', $this->data['title']);
+                       if(count($words) > 1) $this->data['keywords'] = implode(',', $words) . ',';
+                       $this->data['keywords'] .= $this->data['title'];
+               }
+
                $this->language->load('common/header');
 
                if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS']

Загрузка jQuery по требованию

- Posted in Webdev by

Оригинал: Load jQuery on demand | Web-developer notepad

Для загрузки jQuery по требованию вы можете пользоваться скриптом loadJquery.js.

Быстрый старт

Загрузите скрипт по этой ссылке, отредактируйте его нижнюю часть после слов PUT YOUR CODE HERE, вот эту:

(function () {
...
    /* PUT YOUR CODE HERE  */
    loadJquery({
        url: 'http://code.jquery.com/jquery-latest.min.js',
        timeout: 5000, //ms
        success: function ($) {
            $('h1').css('border', '2px solid red');
        },
        error: function () {
            alert("Can't load jQuery.");
        }
    });
}());

Преимущества скрипта:

  • кроссбраузерность
  • основан на коде jquery 1.7.2
  • отлов исключений при помощи try/catch
  • возможность указания таймаута загрузки
  • загрузка не будет производиться, если jQuery уже загружен.
  • простота использования для конечного пользователя: просто пишите свой код в success/error-колбеки
  • отсутствие конфликтов с другими js-библиотеками типа prototype.js
  • скрипт проходит jslint-валидацию

Теперь больше информации для тех, кто хочет узнать подробности.

Скрипт состоит из двух частей: loadScript и loadJquery.

loadScript

Функция практически полностью сделана на основе кода jQuery 1.7.2, актуальной в данный момент. Загрузка скрипта производится посредством добавления тега script в head. Производится контроль исключений при помощи try/catch, теоретически не должно быть никаких ошибок яваскрипта. Предусмотрена возможность указания тайм-аута, по достижению которого будет вызван error-callback.

Пример использования.

loadScript({
    url: 'http://example.com/script.js', //script url
    timeout: 5000, //optional timeout in ms
    success: function () {
        alert('Script loaded callback.');
    },
    error: function () {
        alert('Script was not loaded.');
    }
});

loadJquery

Особенности функции loadJquery следующие:

  • загрузка jQuery не будет производиться, если jQuery уже загружен
  • используется .noConflict(), т.е. можно не беспокоиться о возникновении конфликтов с другой библиотекой типа prototype.js

Полный листинг скрипта

/*!
 *
 * loadJquery.js
 * Load jQuery on demand from javascript
 * Author: contact@slicezilla.com
 * November 2011
 *
 * The script uses part of jQuery JavaScript Library v1.7
 * http://jquery.com/
 * Copyright 2011, John Resig
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
*/
/*global document, setTimeout, clearTimeout, alert, jQuery*/
(function () {
    "use strict";
    var loadScript = function (options) {
        var script, transportTimeout,
            head = document.head || document.getElementsByTagName('head')[0] || document.documentElement,
            transport = {
                send: function (url, successCallback) {
                    script = document.createElement('script');
                    script.async = 'async';
                    script.src = url;
                    // Attach handlers for all browsers
                    script.onload = script.onreadystatechange = function (event, isAbort) {
                        if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
                            // Handle memory leak in IE
                            script.onload = script.onreadystatechange = null;
                            // Remove the script
                            if (head && script.parentNode) {
                                head.removeChild(script);
                            }
                            // Dereference the script
                            script = undefined;
                            //callback if not abort
                            if (!isAbort && typeof successCallback === 'function') {
                                clearTimeout(transportTimeout);
                                successCallback();
                            }
                        }
                    };
                    // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
                    // This arises when a base node is used (#2709 and #4378).
                    head.insertBefore(script, head.firstChild);
                    //head.appendChild(script);
                },
                abort: function (errorCallback) {
                    clearTimeout(transportTimeout);
                    if (script) {
                        script.onload(0, 1);
                    }
                    if (typeof errorCallback === 'function') {
                        errorCallback();
                    }
                }
            };
        //init timeout
        if (options.timeout > 0) {
            transportTimeout = setTimeout(function () {
                transport.abort(options.error);
            }, options.timeout);
        }
        //get script
        try {
            transport.send(options.url, options.success);
        } catch (e) {
            transport.abort(options.error);
        }
    };
    //function which will load jQuery using loadScript
    function loadJquery(options) {
        if (typeof jQuery !== 'undefined') {
            //jQuery is loaded already, just perform business logic
            if (typeof options.success === 'function') {
                //pass jQuery as parameter, in order to have $ === jQuery in callback
                //just in case that $.noConflict was used already, and $ !== jQuery
                jQuery(options.success);
            }
        } else {
            //jQuery was not loaded on a page
            loadScript({
                url: options.url,
                timeout: options.timeout,
                success: function () {
                    jQuery.noConflict();
                    if (typeof options.success === 'function') {
                        jQuery(options.success);
                    }
                },
                error: options.error
            });
        }
    }
    /* -------- PUT YOUR CODE HERE -------- */
    loadJquery({
        url: 'http://code.jquery.com/jquery-latest.min.js',
        timeout: 5000, //ms
        success: function ($) {
            $('h1').css('border', '2px solid red');
        },
        error: function () {
            alert("Can't load jQuery.");
        }
    });
}());

Обсудить

Оказывается, Ubuntu можно обновить до следующего релиза через CD

- Posted in Uncategorized by

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

Через CD тоже процесс небыстрый, но гораздо меньше времени занимает. Так что советую попробовать ISO образ скачать, записать на болванку, и с неё уже обновляться.