Размножение сайтов на Drupal 7

Случилась нетривиальная задача — размножить один сайт на CMS Drupal 7 натрое, сделать отдельные копии для филиалов организации.

Задача осложнилась тем, что по тарифу хостинга полагалась только одна база данных MySQL, поэтому все три копии будут жить и работать вместе, разделенные разными префиксами в названиях таблиц.

Применялись: доступ на сервер по ssh, магия dush, кофе.

Журнал:

1. Находясь в папке исходного сайта (/sites/default, если он был единственный) выполняем команду.

# drush sql-dump >/path/to/file/drupal.sql

Сейчас можно сделать резервную копию базы, не помешает.
Заменяем в полученном дампе все вхождения старого пути. Добавляем префикс в таблицы.
С минусом — что искать, с плюсами — на что менять.

--- TABLE IF EXISTS `
+++ TABLE IF EXISTS `prefix_

--- TABLE `
+++ TABLE `prefix_

--- TABLES `
+++ TABLES `prefix_

--- INTO `
+++ INTO `prefix_

--- sites/default/
+++ sites/newdomain.ru/

Файл подготовлен.
В той же папке изначального «прототипа» выполняем еще одну команду, которая просто выполняет команду SQL, а с параметром —file берет команды из нашего подготовленного дампа.

# drush sqlq --file=/path/to/file/drupal.sql

Делаем новый сайт. Сделаем копию каталога /sites/default → /sites/newdomain.ru

Дописываем префикс в настройки соединения с базой данных в файле /sites/newdomain.ru/settings.php

--- 'prefix' => '',
+++ 'prefix' => 'prefix_',

Все, теперь в панели управления хостингом добавляем алиас для исходного домена.

Приступаем ко второму «отпрыску». Дамп делать больше не требуется, просто нужно заменить prefix_ на prefix2_ и домен на домен.

Дальше можно работать через интерфейс Drupal — сменить названия, реквизиты, адреса и т.п.

У хранения нескольких сайтов в одной БД есть свои плюсы. По желанию можно обобщить некоторые таблички (пользователи, роли). Проще делать резервное копирование.

Autosave для Drupal 7

Несколько раз за последнюю неделю (три, если быть точным) случайно закрывал вкладку, в которой Создавал Интересный Контент, проще говоря, заметку в блог писал. И так уже слов 200-300 к тому моменту было написано. Короче — обидно. Захотелось автоматическое сохранение сделать.

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

Итак, вводные — Drupal 7.16 и модуль WYSIWYG 7.x-2.2 с редактором CKEditor 3.6.2.7275

# drush rl wysiwyg
------- RELEASES FOR 'WYSIWYG' PROJECT -------
 Release         Дата         Статус                              
 7.x-2.2         2012-Oct-02  Supported, Recommended, Установлено


Потребуется последняя на данный момент -dev версия.

# drush rl autosave
------- RELEASES FOR 'AUTOSAVE' PROJECT -------
 Release         Дата         Статус                           
 7.x-2.x-dev     2012-Jul-12  Development

Этого мало, потребуются патч из этой темы :

diff --git a/autosave.js b/autosave.js
index a87c808..853484b 100644
--- a/autosave.js
+++ b/autosave.js
@@ -64,6 +64,21 @@ Drupal.behaviors.autosave = {
           }, autosaveSettings.period * 1000);
         }
 
+      	// Wire up Ckeditor to autosave.
+      	if (typeof(CKEDITOR) !== "undefined") {
+        	setInterval(function() {
+            	var triggers = Drupal.settings.wysiwyg.triggers;
+            	var id;
+            	var field;
+
+            	for (id in triggers) {
+              		field = triggers[id].field;
+
+              		$('#' + field).val( CKEDITOR.instances[field].getData() );
+            	}
+          	}, autosaveSettings.period * 1000);
+      	}
+
       },
       save: function (e, o) {
         Drupal.behaviors.autosave.displayMessage(Drupal.t('Form autosaved.'));

Это для моей конфигурации, для отдельного модуля CKEDITOR — код по ссылке выше.

Ну и последний штрих отсюда, в районе 379 строки в файле autosave.modult нужно привести строку к такому виду:


  if (drupal_multilingual() && language_negotiation_get_any(LOCALE_LANGUAGE_NEGOTIATION_URL)) {

Проверил, работает. Сохранять автоматически или нет — это включается для каждого типа материалов (в разделе, где настройки публикации) отдельно, а периодичность задаеся глобально в настройках (где формат ввода, профили wysiwyg и т.п.)ю

Массовая выгрузка объявлений на сайт «Из рук в руки»

Сайт «Из рук в руки» потихоньку раскручивается в отрыве от своих печатных версий. В том числе за счет привлечения компаний, которым за денежку предлагают размещать свои объявления в массовом порядке. Судя по предлагаемой структуре выгрузки в XML, изначально расчет был на агентства, торгующие недвижимостью. У нас другой случай — запчасти, много контрактных (бэушных) запчастей для японских автомобилей. Торговать ими хочется по всей России.

Необходимо и достаточно: Drupal 7, Views 3, модуль views data export, drush, пара часов времени.

1. Создаем представление (view) для вывода списка позиций (запчастей). Тип представления — data export, формат XML. Стандартный XML, который генерирует Viws Data Export не подходит под требования ИРР, надо переопределять шаблон представления. Используем drush views-data export view-name display-id adverts.xml для создания файла с предлложениями.

2. Копируем display, нам потребуется еще список картинок. Удаляем все поля, за исключением imagefield, формат вода меняем на txt, выводим результаты (имена файлов) в pictures.txt с помощью того же drush. Этот список будет использоваться для создания архива с картинками. Имеет смысл, если выгружаются не все объявления и, соответственно, не нужны все имеющиеся картинки.

3. Собираем shell скрипт, который будет запускать 2 выгрузки (views data export), собирать и складывать в архив картинки, загружать полученные файлы adverts.xml и pictures.zip по FTP на сервер ИРР.

TODO: В скрипте неплохо бы иметь проверки кодов завершения. Не помешает отправка уведомлений на email. В интерактивном режиме и так сойдет, но есть идея добавить cron job и забыть про него.