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 и т.п.)ю

Пробуем Google+

Пошла движуха — кто-то прислал комраду S3N инвайт в Google+, который тут же вирусно размножился на еще пачку приглашений, так что френдов в Плюсе уже немало.

Беглый осмотр показал, что Google+ отличается от Facebook, но не все отличия можно записать в преимущества.

Круги. Их несколько изначально и можно создавать свои. Это удобнее Групп в ФБ, а сам интерфейс выглядит несоразмерно красивее.

Google plus

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

Google+ ненавязчиво предложил добавить в круги людей, которых нашел в адресной книге Gmail — в итоге у меня за 5 минут «френдов» образовалось больше, чем в ФБ за год.

На «стене» можно оставлять тексты, ссылки, адреса, фото и видео. Больше пока ничего не нашел — опросов нет, приложений нет. В настройках — только уведомления о различных действиях, по-умолчанию все включено и приходит на электронную почту.

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

Как я уже упоминал — в социальной сети Google+ пока нет никаких приложений, тем более сторонних. Также отсутствует аналог Фейсбучных Страниц (Fanpages), а я как раз только вчера разбирался как импортировать в эти страницы контент с блога по RSS.

Покак как-то так. Google потихоньку подгребает под себя разные составляющие интернет-активности граждан и бизнеса: поиск, реклама, видео, фото, теперь вот социальная сеть. Что любопытно, Google+ изначально «говорит» по-русски, причем существенно лучше корявого ФБ.

Facebook в ответ представил (совместно со Skype) свои видео-звонки. Я пробовал, довольно удобно, но это не определяющий сервис, да и в Гугле он тоже есть.

Drupal + Tomtcat + Apache Solr на CentOS 5

Это была ночь войны. Решил попробовать связать Drupal 6 и Apache Solr — задача не для слабых духом, сразу говорю.

Имелось в наличии: сервер с CentOS 5, Plesk 9, Java 1.4.2, Tomcat 5, ну и сайт на Acquia Drupal. Plesk упомянут по той причине, что он не умеет управлять более свежими версиями Tomcat, судя по отзывам.

Java

Apache Solr 1.4 требует для работы Java 1.5+, так что пришлось обновлять. Были сомнения на тему Tomcat, но обошлось — все работает, вроде бы.

yum install java-1.6.0-openjdk.i386
yum install java-1.6.0-openjdk-devel.i386

Выполнять надо с правами root, понятно (sudo правильнее, говорят). Прошлая версия (java 1.4.2) осталась сбоку, /etc/alternatives самостоятельно переключились на новую версию.

Apache Solr

Установку Solr выполнял вот по этому руководству (Solr 1.4 on Ubuntu 9.10 and CentOS 5 ), с небольшими нюансами, о которых ниже.

Нужно скачать пакет в любой каталог, распаковать, из него потребуются example/webapps/slor.war и пример конфигурации example/solr/conf* ну и example/multicore/solr.xml.

[root@ns1]# ls  /var/solr
conf  core-habrus  core-soldo  solr.war  solr.xml

Предполагается использовать Solr на нескольких сайтах, так что сразу начал настраивать multicore конфигурацию.

[root@ns1 /]# cat /var/solr/solr.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--
 All (relative) paths are relative to the installation path
  
  persistent: Save changes made via the API to this file
  sharedLib: path to a lib directory that will be shared across all cores
-->
<solr persistent="false">
  <!--
  adminPath: RequestHandler path to manage cores.
    If 'null' (or absent), cores will not be manageable via request handler
  -->
  <cores adminPath="/admin/cores">
    <core name="soldo" instanceDir="core-soldo" />
    <core name="habrus" instanceDir="core-habrus" />
  </cores>
</solr>

Важная часть — внутри cores, там название и рабочий каталог для каждого ядра Solr. Каталог относителен solr home, в моем случе /var/solr/core-soldo. В этот каталог (в подкаталог conf) нужно положить конфигурационные файлы для каждого ядра. В нем же (подкаталог data создастся сам) будут храниться данные поискового индекса.

[root@ns1 /]# ls /var/solr/core-soldo
conf  data
[root@ns1 /]# ls /var/solr/core-soldo/conf
admin-extra.html   elevate.xml                  protwords.txt  scripts.conf    spellings.txt        stopwords.txt  xslt
compoundwords.txt  mapping-ISOLatin1Accent.txt  schema.xml     solrconfig.xml  stopwords_spell.txt  synonyms.txt

Файлы schema.xml и solrconfig.xml нужно взять из папки модуля Drupal apachesolr. У меня установлен дистрибутив Acquia Drupal, этот модуль уже есть в папке [httpdocs]/modules/acquia/apachesolr. Я сделал в папке /var/solr каталог conf и собрал в нем базовую конфигурацию, которую затем «размножил» по папкам отдельных сайтов.

Tomcat

Tomcat 5 мне достался по наследству, его устанавливает Plesk. В общем, он уже был и работал на порту 8080, даже какие-то приложения установлены. Plesk поддерживает хостинг Java приложений, но на нашем сервере ими никто не пользуется.

Для начала я добавил роли и пользователя admin в /etc/tomcat5/tomcat-users.xml, зашел в управление приложениями, полюбовался. Solr там пока нет, понятно. Сообщаем Tomcat о нашем приложении. Нужно создать файл /etc/tomcat5/Catalina/localhost/solr.xml.

[root@ns1 /]# cat /etc/tomcat5/Catalina/localhost/solr.xml
<?xml version="1.0" encoding="utf-8"?>
<Context docBase="/var/solr/solr.war" debug="0" crossContext="true" >
   <Environment name="solr/home" type="java.lang.String" value="/var/solr" override="true" /> 
</Context>

Здесь указывается путь к solr.war и рабочий (домашний) каталог приложения. После перезапуска tomcat (/etc/init.d/tomcat5 restart) в списке приложений появится Solr. Если все нормально, то он заработает. У меня это получилось далеко не с первого раза. Для диагностики можно временно обойти mulcitore, для этого в этом конфиге нужно заменить solr/home на полный путь к одному из ядер (/var/solr → /var/solr/core-soldo).

Крайне важный момент, стоивший мне пары часов жизни. В файле /etc/tomcat5/server.xml нужно в коннекторе указать URIEncoding, иначе русские запросы будут переводиться в ASCII и Solr ничего, понятное дело, не сможет найти.

<Connector URIEncoding=»UTF-8″ port=»8080″ maxHttpHeaderSize=»8192″ … >

Найти эту строку можно по порту 8080, она внутри ветки <Service name=»Catalina»>. Не забывайте перезапускать Tomcat.

Диагностика Solr

Если вам повезло больше, чем мне, и все заработало сразу, то можно побаловаться интерфейсом Solr и потестировать вашу конфигурацию. По адресу http://your_host:8080/solr/ должен быть список ядер (при multicore конфигурации) или просто одна ссылка на админку (для single core).

Solr Admin

Настройка параметров, фильтров, стеммеров, синонимов и словарей Solr выходит за рамки этой заметки, да я этим еще и не занимался. Единственное, что я сделал — заменил язык в schema.xml с English на Russian. Просто ищите и заменяйте, если у вас русскоязычный сайт. Для многоязычных сайтов есть модуль Drupal Apache Solr Multilingual, я его тоже посмотрел и использовал, он помогает настроить schema.xml по своим потребностям.

Настройка модуля Apachesolr

Настраивать тут особо нечего, нужно указать путь к приложению (или ядру) Solr, в моем случае это localhost, solr/soldo и порт 8080.

Drupal Apache Solr

Индексируется сайт при запуске cron, количество скармливаемых за раз документов тоже настраивается. Фильтры, блоки, срезы я тоже пока не настраивал. Полагаю, будет похоже на модули Faceted Search и Lucen API, которые я уже видел.

Вроде бы ничего важного не упустил. Если что — спрашивайте. А я пойду искать способ закрыть Tomcat и сам Solr от мира — по-умолчанию приложения открыты всем, безо всякого ограничения доступа. Закрыть по-простому несложно, можно заставить Tomcat «слушать» только соединения на 127.0.0.1, но это не метод джедая — возможно, потребуется заходить в интерфейс издалека.