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

ср, 14.03.2012 12:18 :: olk

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

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

  1. <?php
  2.  
  3. $sites = array(
  4. 'avr-shop.ru'=>'avr-shop.ru', // Розничный магазин
  5. 'avr-shop.com'=>'avr-shop.com', // Общий врапер для оптовых магазинов
  6. 'spb.avr-shop.com'=>'spb.avr-shop.com', //  Первый региональный оптовый магазин
  7. 'msk.avr-shop.com'=>'msk.avr-shop.ru', //  Второй региональный оптовый магазин
  8. );
  9. ?>
Соответственно были созданы аналогичные директории в каталоге 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)

  1. $databases = array (
  2.   'default' =>
  3.   array (
  4.     'default' =>
  5.     array (
  6.       'database' => 'database',
  7.       'username' => 'username',
  8.       'password' => ' userpassword',
  9.       'host' => 'localhost',
  10.       'port' => '',
  11.       'driver' => 'mysql',
  12.       'prefix' => array(
  13.          'default' => '',  // префикс для общих таблицы
  14.  // таблицы индивидуальные для каждого из доменов, соответственно
  15. // префиксы у каждого домена свои
  16.          'accesslog'=>'ru_',
  17.          'actions' =>'ru_',
  18.          'batch' =>'ru_',
  19.    //  блоки у нас тожи индивидульны
  20.          'block' =>'ru_',
  21.          'block_custom' =>'ru_',
  22.          'block_node_type' =>'ru_',
  23.          'block_role' =>'ru_',
  24.          'blocked_ips' =>'ru_',
  25.    // ну и соответственно у каждого домена свои кэши
  26.          'cache' =>'ru_',
  27.          'cache_block' =>'ru_',
  28.          'cache_bootstrap' =>'ru_',
  29.          'cache_field' =>'ru_',
  30.          'cache_filter' =>'ru_',
  31.          'cache_form' =>'ru_',
  32.          'cache_image' =>'ru_',
  33.          'cache_media_xml' =>'ru_',
  34.          'cache_menu' =>'ru_',
  35.          'cache_page' =>'ru_',
  36.          'cache_path' =>'ru_',
  37.          'cache_rules' =>'ru_',
  38.          'cache_token' =>'ru_',
  39.          'cache_update' =>'ru_',
  40.          'cache_views' =>'ru_',
  41.          'cache_views_data' =>'ru_',
  42.          'captcha_points' =>'ru_',
  43.          'captcha_sessions' =>'ru_',
  44. //         'comment' =>'ru_',  
  45. // так как комментарии у нас разрешены только для товаров (которые тоже общие, то
  46. // комментарии делаем общими для всех сайтов
  47.          'contact' =>'ru_',
  48.          'ctools_css_cache' =>'ru_',
  49.          'ctools_object_cache' =>'ru_',
  50.          'menu_custom' =>'ru_',
  51.          'menu_links' =>'ru_',
  52.          'menu_router' =>'ru_',
  53.          'queue' =>'ru_',
  54.          'rdf_mapping' =>'ru_',
  55.          'rules_config'=>'ru_',
  56.          'rules_dependencies'=>'ru_',
  57.          'rules_scheduler'=>'ru_',
  58.          'rules_tags'=>'ru_',
  59.          'rules_trigger'=>'ru_',
  60.          'search_dataset' =>'ru_',
  61.          'search_index' =>'ru_',
  62.          'search_node_links' =>'ru_',
  63.          'search_total' =>'ru_',
  64.          'semaphore' =>'ru_',
  65.          'sequences' =>'ru_',
  66.          'system' =>'ru_',
  67. // ubercart – так как товары у нас общие делаем индивидульными только корзины
  68. // типы доставок и заказы
  69.          'uc_cart_products' =>'ru_',
  70.          'uc_flatrate_methods'=>'ru_',  
  71.          'uc_flatrate_products'=>'ru_',
  72.          'uc_order_admin_comments' =>'ru_',
  73.          'uc_order_comments' =>'ru_',
  74.          'uc_order_line_items' =>'ru_',
  75.          'uc_order_log' =>'ru_',
  76.          'uc_order_products' =>'ru_',
  77.          'uc_order_quotes' =>'ru_',
  78.          'uc_orders' =>'ru_',
  79.          'url_alias' =>'ru_',
  80.          'variable' =>'ru_',
  81.          'views_display' =>'ru_',
  82.    // вьюсы тоже у каждого свои
  83.          'views_view' =>'ru_',
  84.          'watchdog' =>'ru_',
  85.          'xmlsitemap' =>'ru_',
  86.          'xmlsitemap_sitemap' =>'ru_',
  87.          ),
  88.     ),
  89.   ),
  90. );
  91. // добавляем переменную – в дальнейшем нам понадобиться различать в своем модуле
  92. // в каком домене мы находимся – конечно можно взять и из глобальной
  93. // $_SERVER[‘HTTP_HOST’], но мне так показалось удобней
  94.  
  95. $conf['type_mag'] = 'retail';  // для avr-shop.ru
  96. // в соответствующих директориях в файле settings.php
  97. // $conf['type_mag'] = 'opt';  // для avr-shop.com
  98. // $conf['type_mag'] = 'opt_moscow';  // для msk.avr-shop.com
  99. // $conf['type_mag'] = 'opt_piter';  // для spb.avr-shop.com
В тип материала «товар» были добавлены поля – «Видимость» в виде чекбоксов Х -Розница Х -Опт Москва Х -Опт Питер В качестве розничной цены выступает стандартная уберовская Цена продажи, для оптовых цен добавлены два поля в тип материала «Товар» Цена опт Москва Цена опт Питер

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

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

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

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

Комментарии

каранёвы

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

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

  1.   $target = $_SERVER["DOCUMENT_ROOT"];
  2.   $link = $target .'/поддомен';
  3.   symlink($target, $link);

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

Здравствуйте. Нужно сделать нечто подобное. Есть сайт, хотим сделать поддомен региональный, пока один. Нужно, чтобы он открывался msk.site.ru с таким же дизайном, но можно было менять блоки и некоторый текст в отличие от основного домена. Остальные страницы чтобы оставались такими же. Пользователи общие. Как с вами связаться? И сколько стоит такая работа?

Добавить комментарий
« Добавить комментарий
» Добавить комментарий