Мультисайтинг на Drupal 7 или как я делал магазин

Главные вкладки

Аватар пользователя olk olk 9 сентября 2011 в 11:33

avr-shop

Косспост с моего блога Мультисайтинг на Drupal 7 или как я делал магазин

Была поставлена следующая задача:
1. Небольшой розничный Интернет-магазин на отдельном домене avr-shop.ru
2. Мелкооптовый магазин на домене avr-shop.com имеющий несколько региональных отделений на субдоменах вида subdomen.avr-shop.com
3. Ассортимент товара одинаковый на всех но по своим ценам и возможностью исключать товар из показа на той или иной площадке.
4. Простейшая корзина покупателя (без систем оплаты)

Решение:
Для решения поставленной задачи была выбрана связка – Drupal 7 + Ubercart на мультисайтинге.
В основном каталоге сайта в директории sites был создан файл sites.php со следующим содержанием:

$sites = array(
'avr-shop.ru'=>'avr-shop.ru', // Розничный магазин
'avr-shop.com'=>'avr-shop.com', // Общий врапер для оптовых магазинов
'spb.avr-shop.com'=>'spb.avr-shop.com', // Первый региональный оптовый магазин
'msk.avr-shop.com'=>'msk.avr-shop.ru', // Второй региональный оптовый магазин
);
?>

Соответственно были созданы аналогичные директории в каталоге sites
avr-shop.ru
avr-shop.com
spb.avr-shop.com
msk.avr-shop.com

Так как большинство таблиц было общими, то при создании мультисайтинга я пошел путем от обратного.
Скопировал файл default.settings.php в файл settings.php во все директории (и открыл запись в них - chmod 660)
Потом была создана основная (база общих таблиц) база без префикса (Инсталляция велась через домен avr-shop.ru)
После инсталляции удалил файл settings.php в директории avr-shop.ru и по новой скопировал сюда файл settings.php из default.settings.php.
Повторил инсталляцию в данном домене, но теперь уже с установкой префикса ru_

Затем были произведены инсталляции системы на соответствующих доменах и субдоменах со своими префиксами.

avr-shop.com - префикс com_
spb.avr-shop.com - префикс comp_
msk.avr-shop.com - префикс comm_

После чего были включены и настроены все необходимые модули.
Так как все сайты будут пользоваться единой базой изображений, поправляем путь к файлам (admin/config/media/file-system) – меняем sites/[site]/files на sites/default/files

Далее настраиваем индивидуальный набор таблиц для всех доменов и даем доступ к общим таблицам.
В соответствующих файлах settins.php прописываем следующую конструкцию (пример приведен для домена avr-shop.ru)

$databases = array (
'default' =>
array (
'default' =>
array (
'database' => 'database',
'username' => 'username',
'password' => ' userpassword',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => array(
'default' => '', // префикс для общих таблицы
// таблицы индивидуальные для каждого из доменов, соответственно
// префиксы у каждого домена свои
'accesslog'=>'ru_',
'actions' =>'ru_',
'batch' =>'ru_',
// блоки у нас тожи индивидульны
'block' =>'ru_',
'block_custom' =>'ru_',
'block_node_type' =>'ru_',
'block_role' =>'ru_',
'blocked_ips' =>'ru_',
// ну и соответственно у каждого домена свои кэши
'cache' =>'ru_',
'cache_block' =>'ru_',
'cache_bootstrap' =>'ru_',
'cache_field' =>'ru_',
'cache_filter' =>'ru_',
'cache_form' =>'ru_',
'cache_image' =>'ru_',
'cache_media_xml' =>'ru_',
'cache_menu' =>'ru_',
'cache_page' =>'ru_',
'cache_path' =>'ru_',
'cache_rules' =>'ru_',
'cache_token' =>'ru_',
'cache_update' =>'ru_',
'cache_views' =>'ru_',
'cache_views_data' =>'ru_',
'captcha_points' =>'ru_',
'captcha_sessions' =>'ru_',
// 'comment' =>'ru_',
// так как комментарии у нас разрешены только для товаров (которые тоже общие, то
// комментарии делаем общими для всех сайтов
'contact' =>'ru_',
'ctools_css_cache' =>'ru_',
'ctools_object_cache' =>'ru_',
'menu_custom' =>'ru_',
'menu_links' =>'ru_',
'menu_router' =>'ru_',
'queue' =>'ru_',
'rdf_mapping' =>'ru_',
'rules_config'=>'ru_',
'rules_dependencies'=>'ru_',
'rules_scheduler'=>'ru_',
'rules_tags'=>'ru_',
'rules_trigger'=>'ru_',
'search_dataset' =>'ru_',
'search_index' =>'ru_',
'search_node_links' =>'ru_',
'search_total' =>'ru_',
'semaphore' =>'ru_',
'sequences' =>'ru_',
'system' =>'ru_',
// ubercart – так как товары у нас общие делаем индивидульными только корзины
// типы доставок и заказы
'uc_cart_products' =>'ru_',
'uc_flatrate_methods'=>'ru_',
'uc_flatrate_products'=>'ru_',
'uc_order_admin_comments' =>'ru_',
'uc_order_comments' =>'ru_',
'uc_order_line_items' =>'ru_',
'uc_order_log' =>'ru_',
'uc_order_products' =>'ru_',
'uc_order_quotes' =>'ru_',
'uc_orders' =>'ru_',
'url_alias' =>'ru_',
'variable' =>'ru_',
'views_display' =>'ru_',
// вьюсы тоже у каждого свои
'views_view' =>'ru_',
'watchdog' =>'ru_',
'xmlsitemap' =>'ru_',
'xmlsitemap_sitemap' =>'ru_',
),
),
),
);
// добавляем переменную – в дальнейшем нам понадобиться различать в своем модуле
// в каком домене мы находимся – конечно можно взять и из глобальной
// $_SERVER[‘HTTP_HOST’], но мне так показалось удобней

$conf['type_mag'] = 'retail'; // для avr-shop.ru
// в соответствующих директориях в файле settings.php
// $conf['type_mag'] = 'opt'; // для avr-shop.com
// $conf['type_mag'] = 'opt_moscow'; // для msk.avr-shop.com
// $conf['type_mag'] = 'opt_piter'; // для spb.avr-shop.com
?>
В тип материала «товар» были добавлены поля – «Видимость» в виде чекбоксов
Х -Розница
Х -Опт Москва
Х -Опт Питер
В качестве розничной цены выступает стандартная уберовская Цена продажи, для оптовых цен добавлены два поля в тип материала «Товар»
Цена опт Москва
Цена опт Питер

Каталог товаров настроен через модуь views – где в качестве фильтра использовано поле видимости товара на той или иной площадке.

После всех настроек лишние дубликаты таблиц были удалены.

Ну и написан небольшой модуль, который в зависимости от $type_mag – подменяет при загрузке (hook_node_load) – стандартную цену продажи, на цену из соответствующих полей товара.

Ну и сам результат можно посмотреть (и немного покритиковать) Smile на Интернет-магазин автомобильной электроники

Комментарии

Аватар пользователя goodvin2 goodvin2 9 сентября 2011 в 21:14

А реализацией общих сессий не заморачивались? Что бы юзеры могли к примеру попав на розничный сайт и зарегистрировавшись на нем без повторного ввода логина и пароля (а юзер не осведомлен, что на оптовом сайте можно авторизоваться по данным с розничного), перейдя по ссылке на оптовый сайт был уже авторизован.

Аватар пользователя azzis azzis 16 января 2012 в 16:02

Здравствуйте! Задавал вам вопросы на сайте, но статья куда-то пропала. Поэтому решил продолжить здесь.
В настоящее время занимаюсь реализацией подобного магазина с субдоменами и разными ценами для субдоменов.
Вы пишете, что сделали модуль который подменяет хук ноды, а можете об этом моменте поподробней?
В остальном ваша статья ООЧень сильно помогла! Спасибо!

Аватар пользователя каранёвы каранёвы 6 апреля 2012 в 15:33

Здравствуйте! Вы не могли бы подсказать, пожалуйста, какие дополнительные действия должны быть сделаны для поддоменов? Уже сотню раз переделал по разным примерам, в том числе и Вашему.

У меня есть домен, я создаю поддомен через cpanel, который я хочу использовать в связке. Создается директория, которая находится в public_html с именем поддомена, сказано её удалить, создать и вызвать след. содержания .php

<?php
  $target 
$_SERVER["DOCUMENT_ROOT"];
  
$link $target .'/поддомен';
  
symlink($target$link);
?>

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