Drupal Commerce Shipping — самовывоз

Обновлено, ноябрь 2013: Заметка не особо актуальна с момента появления 9 месяцев назад модуля commerce pickup, реализующего, судя по описанию, необходимую функциональность.

За последние 3-4 недели успел поставить Drupal 7 и Drupal Commerce, поковырять его, отложить в сторону, поставить Ubercart 2 в лице адской сборки Openstore, поковыряться… и снова вернуться к Drupal Commerce. Возможно, это не последняя итерация.

Если коротко — Ubercart хорош для задач, которые он выполняет «из коробки». Если эта коробка называется Openstore, то многим больше ничего не потребуется. Я с неделю занимался обратным процессом — выбрасывал из сборки ненужные мне модули. Закончилось тем, что оставшееся не выглядело сколько-нибудь лучше Drupal Commerce (для моей задачи).

Drupal Commerce — гол, как сокол. Я устанавливал сборку (профиль) Commerce Kickstart. Доставки нет, нужен отдельный модуль. Почти для всего нужен отдельный модуль, которого или вообще не существует, или он находится на dev, alpha, beta стадиях (вялой) разработки.

Ладно, перестаю ныть, начинаю похваляться делиться информацией. Задача была простая — добавить в Drupal Commerce два способа доставки — курьером (за фиксированную сумму) и «самовывоз», который никакая не доставка, но выбор такой клиенту дать нужно. Пока пытаюсь сделать все правильно, используя модуль Commerce Shipping. Половину дела сделал легко — курьерскую доставку можно реализовать на основе модуля Flat Rate, простого и понятного — фиксированная цена доставки. Дальше начались трудности.

Модуль Commerce Shipping добавляет новый профиль (user profile) для пользователя и соответствующую панель (pane) на страницу расчета (checkout). Процедура оформления покупки в Drupal Commerce многостраничная, панели можно передвигать между страницами произвольно. По-умолчанию панель с адресом доставки (shipping profile) помещается на самую первую страницу. Для многих это логично — от адреса доставки могут зависеть доступные способы доставки или способы оплаты. У меня ситуация обратная — город известен заранее, стоимость доставки тоже. Остается реализовать «самовывоз», то есть отключить панель адреса доставки (shipping profile) в случае выбора соответствующего способа доставки.

1. Помещаем панель shipping на первой странице (checkout), панель shipping profile переносим на вторую (review). Так мы принуждаем клиента выбрать способ доставки и меешм шанс не спрашивать адрес в случае самовывоза.

2. Создаем новый модуль (это за пределами заметки) и добавляем в него свой хук для переопределения панелей модуля commerce checkout.

/*
 * Hook hook_commerce_checkout_pane_info_alter($checkout_pane)
 */
function mymodule_commerce_checkout_pane_info_alter(&$checkout_pane) {
	global $user;
	// $checkout_pane на самом деле содержит массив из всех панелей...
	foreach($checkout_pane as $pane_name => &$pane_data) {
		// …нам нужна только она из них — панель с профилем доствки
		if($pane_name == 'customer_profile_shipping' && $pane_data['enabled']) {
			// загружаем текущий заказ
		    $order = commerce_cart_order_load($user->uid);
		    // $order->data был найден с помощью dsm()
		    // в нем не было ничего за исключением 'shipping_method' со строкой
		    // rules_pick_up это ID склонированного способа доставки flat rate
			if($order->data['shipping_method'] == 'flat_rate|rules_pick_up') {
				// панель была изначально включена в админке, отключаем ее
				$pane_data['enabled'] = 0;
			}
		}
	}
}

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

У меня нет никакой уверенности, что это правильный и эффективный способ выполнить задуманное. Глядя на Drupal Commerce вообще, я был уверен, что найду способ сделать подобное с помощью Правил (Rules), но готовых «действий» не нашлось (панели не контролируются правилами), а приделать такое сбоку мне оказалось не по силам.

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

Magento, бесплатный интернет-магазин

Ух ты, говорящая рыба бесплатный интернет-магазин! У почетных пенсионеров вроде osCommerce/ZenCart или VirtueMart появился молодой и резвый конкурент — Magento. Или наследник, поскольку речь идет о «бесплатных» платформах. В силу некоторой беспомощности русского языка, великое и могучее Professional Open Source eCommerce Platform предлагается переводить так: профессиональное решение для электронной коммерции с открытым исходным кодом.

magento.gif

Многие сильные и слабые стороны всех перечисленных и забытых программ обусловлены их возрастом. За «старичками» — опыт многочисленных внедрений и огромный багаж различных дополнений, интерфейсов, модулей, переводов, расширений, плужков и хаков. Плюс сильное сообщество разработчиков — ну кто из нас не сделал хотя бы один интернет-магазин на osCommerce? Минусы тоже известны: доисторические технологии всюду, проблемы совместимости различных поколений программ и дополнений, наплевательское отношение к SEO… Все это решается, да. Сторонними дополнениями, костылями, пилюлями и прочими пластическими операциями.

Magento система молодая. Разработчик – американе из Varien Inc. С год назад я о Magento что-то услышал впервые, версия 1.0 вышла 31 марта 2008 года. Построена на базе Zend Framework/PDO/MySQL, так что MVC, все дела и на PHP4 работать не станет.

Чем примечателен новичок

  • Можно сделать несколько магазинов с единым центром управления.
  • Сайт может быть многоязычным и многовалютным.
  • Красивые ссылки, карта сайта, прочие SEO фенечки повсюду.
  • Настраиваемые характеристики и группы характеристик товаров.
  • Хороший набор инструментов для маркетинга и продвижения.
  • Встроенная CMS для публикации простых статических страниц.
  • Разработчикам понравится: открытый код, стандартный framework, удобные шаблоны
  • Ну и самое главное — там есть тэги! Шутка, но тэги есть.

Полный список достоинств по-русски я не видел, статья на Википедии тощая и устаревшая, а вот английский PDF Magento Feature List.

В общем, для буржуев заграничных продукт выглядит очень привлекательным, а для русских — посмотрим. Домен magento.ru — “это наилучший источник информации по теме Agent” — захапали торговцы доменами. Перевода полного пока не нашел, да и не искал толком. Русскоязычное сообщество на официальном сайте Magento имеется, но особой активности не проявляет. Но пробовать надо! Если будет подходящий заказ — непременно.

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