Drupal

административа: "обновление" дизайна

Друпальский обновлятор заорал "ваш темплейт более не поддерживается, обновитесь на версию 4".

Пришлось обновиться.

Если у кого-то чего-то отображается не так - жалуйтесь в комментариях пожалуйста.

Про Drupal 7.50

Если у вас (как у меня)

  • Работает Drupal 7
  • А до того был D6 и вы апгрейдились

То после установки 7.50 оно начнет ругаться "пропал модуль" на все модули, которые были в 6-ке, а в семерке их больше нет:

The following module is missing from the file system: features. In order to fix this, put the module back in its original location. For more information, see the documentation page

Вот и надо не пугаться,...

Административа-2

После примерно двух лет мучений, собрался и таки проапгрейдил этот бложик на Drupal7.

Если вы заметите какие-то неработающие места - пишите (в каменты тут или почтой).

Главное изменение для читателей, читающих в ЖЖ:

  • Комментарии из ЖЖ не копируются сюда;
  • и, как следствие, комментарии в ЖЖ закрыты.

(судя по статистике посещений, в ЖЖ ходит раз в 10 меньше народу, чем в standalone, ну и хотя тамошнюю аудиторию жалко, она хорошая и говорливая, оснований тратить время на перенос моего копировщика комментов на Drupal7 - увы, не нашлось).

Пока работают базовые фишки, логин через Facebook верну чуть попозже, всякого прочего разного - тоже приделаю, когда удостоверюсь, что переезд прошел нормально.

Q: nginx: rate limit, postgresql?

Вот так вот выглядит статистика веб-антиспама за последние месяцы на libraw.org:

На rawdigger.com еще показательнее:

И это только голова. В том смысле, что это - заблокированное Mollom, а там еще перед ним тоже есть слои антиспама.

Апгрейдим Drupal 6 + PostgreSQL до Drupal 7 в 32 простых шага.

Пишу чеклист для себя, но вдруг кому еще пригодится.

Проверенная на себе процедура апгрейда с D6 на D7 в общих чертах соответствует тому, что рекомендуется на drupal.org, но моя склонность к PostgreSQL ее несколько разнообразит.

Мне "повезло" с модулями (точнее, я дождался, пока все реально мне нужное перенесут на D7), поэтому совсем нестандартные шаги потребовались только с картинками.

Мотивация

Лично у меня, по состоянию на вчера, 3 сайта работали на D7, а еще пять - на D6. По результатам полугода эксплуатации, семерка лучше:
  • Версия 7.15 вполне стабильна (я начал с 7.11 и проблем не помню).
  • Гораздо меньше проблем с PostgreSQL, чем в D6.
  • Многие модули для D6 выглядят уже неживыми, а для семерки - поживее. Вот, например fbconnect.
  • Ну и вообще, иметь в управлении две версии - это иметь двойной геморой.

Друпальское: img_assist to img src

Каждую осень у меня случается обострение и я хочу поапгрейдить свои сайты на Drupal6 на D7. Может и не каждую, но вот уже второй год.

В прошлый раз я выяснил, что за пять минут это не делается, за прошедшие ровно 11 месяцев все стало лучше:

  • Процедура апгрейда требует всего трех небольших правок. Если бы у меня был MySQL - и без них бы обошлось, но вот Postgres их все еще требует. Изобретать ничего не надо, все находится в друпальских форумах.

    Подробнее напишу, когда какой-нибудь из сайтов поставлю в бой.

  • После чего - все работает, за исключением картинок.
Про картинки я тогда же писал, поминая некий готовый скрипт. Но при попытке его применить - меня стошнило, пришлось написать свой, он под катом.

Что делает: меняет теги img_assist на <img src=..., расставляя размеры и выравнивание. popup меняет на банальный <a href=... target=_new

Применять скрипт до апгрейда на D7. Более того, его можно применять и просто на D6, ничего плохого не будет.

Запускать: ./i2i.pl databasename

Скрипт рассчитан на постгрес, но с MySQL будет работать после минимальных правок.

Друпальское: аккуратно разложенные грабли в pager

Для памяти, чтобы не забыть.

Со всей дури налетел на эту вот особенность: Pager missing if views is installed.

Причем, полдня происходила чистая мистика - меняешь тему оформления - появляется pager (в моем конкретном случае - в комментариях). Начинаешь разбираться, чем же она отличается от той, где листалки нету (ну там отладочная печать, то, се) - и вроде ничем не отличается.

Только вот в одном случае строится список комментариев с pager, а в другом - нет.

Когда в очередной раз обгуглился и нашел про Views, то конечно стало понятнее:

  • Блок Views с pager у меня таки был.
  • А в тех дизайнах, где pager под комментариями появлялся - просто не выводился этот блок из Views.
Штатное лечение - каждому pager во views - задать уникальный (по сайту) Pager ID, благо средства для этого есть. Риторический вопрос только один, а почему этот Pager ID сразу не формируется уникальным, ну там из ID view и номера блока в нем.....

На закуску хочу заметить, что вся эта конструкция, когда зовутся функции по именам (ну там themename_preprocess_html), а если такой нету, ну значит не судьба, - это очень гибко, но, блин, отлаживать это - это нечто.

Про Drupal7: ненависти (вместо любви) псто !

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

Если пойти на сайт под D7 по битому URL somesite.domain/node/some-garbage

То вылезает PDO Exception, дескать к числовому полю ходят с символьным ID. Ну, как минимум под PostgreSQL вылезает, возможно MySQL к этому более толерантен (и мусор превращает, скажем, в 0, что не менее прекрасно).

В Drupal6 это место сделано куда разумнее, возвращается обычная страница '404' (нема такой страницы).

Понятно, можно подпереть на фронтенде, фильтровать после /node/ (/comment/, /user/) весь нечисловой мусор, но слишком много исключений (/node/add, небось и всякие /node/что-то-еще тоже бывают).

Значит надо фильтровать уже внутри, там грузится нечто по ID (или списку), ID бывает только числовой.

Гуглую и нахожу прекрасное: PDOException:Invalid text representation when attempting to load an entity with a string ID.

Ровно эта ошибка, ну думаю внесли недавно, сейчас возьму оттуда патч, а в следующем релизе поправят.

Ни хрена! Проблема открыта 21 декабря 2010, сопли жуют уже больше года, и все ради патча на 7 строк (который тривиален и работает, я его оттуда взял, последний по списку).

Я догадываюсь, что проблема в процедуре: активная ветка жалоб приписана к Drupal8, который какбэ девелопится. А репорты про 7.x (один нашел, тоже больше года ему) - помечен как duplicate от D8, вычеркнут и в боевой версии D7 его какбэ и нету. Запихали проблему под ковер.

отчего я такой добрый и терпеливый при моей-то тяжелой жизни? Другой бы на моем месте давно всех убил, один остался...

А в остальном - семерка пока нравится, если с нуля. Апгрейдить в нее с осени ничего не пробовал, даже в тестах. Но теперь я ее опасаюсь.

Любви к Drupal7 псто!

Спасибо читателям, помогли разобраться с ненавистью к D7.

Докладываю

1. Кнопки 'Split summary at cursor'/галки 'Show summary at full view' - нету. Но жить можно с визуальным редактором: TinyMCE получает кнопку, аналогичную Split, галка 'Show summary' при этом какбэ по умолчанию, но если что-то написать в Summary, то в списках постов будет именно оно.

Логика чуть другая, но жить можно.

Со вставлением картинок тоже чуть иначе, но тоже жить можно:

Ненависти к Drupal7 псто!

Поигрался с тестовым сайтом, поапгрейженным из Drupal6 в Drupal7, испытал мучительное недоумение.

Снес нахрен, поставил D7 с нуля, недоумение не стало менее мучительным.

У меня, по большому счету, требований очень мало:

  • Мне нужно писать тексты, причем я готов их прямо в HTML фигачить. От визивигов яваскриптовых - тошнит, если честно.
  • Мне нужно управлять текстом аннотации, которая на глагне показывается. И средств D6 мне более чем хватает (а там можно, если не доверяешь автомату, разделить текст на аннотацию и хвост, аннотации поставить галку "входит в полный текст"), т.е. я могу сколько хочу абзацев сделать аннотацией, а могу ее отдельно написать).
  • Мне нужно просто вставлять картинки:
    • простой браузер того, что уже залито на сервер.
    • простая кнопка, позволяющая поаплоадить (и задать alt/title, чем я не пользуюсь, впрочем)
    • вставка с указанием размера (оригинал, какие-то стандартные, возможность задать свои), выравнивания и действия при клике на картинку (ничего, открыть полный размер в новом/том же окне, перейти по ссылке).
  • Ну теги-категории, понятно и прочие мелкие галки (кросспост в ЖЖ, режим комментариев, задание URL)
  • Все, больше ничего не надо. Если захочу клип с Youtube - руками вставлю, надо редко.

Всю эту функциональность умеет Drupal6 из коробки + image/image assist + чуть-чуть других модулей.

А вот D7 привычную картину D6 нарушает в куче мест:

Drupal6 -> Drupal7

В очередной раз подошел к снаряду по имени Drupal7. Имею сказать:

1. Если у вас PostgreSQL, то даже Drupal 7.9 (текущий) не сможет поапгрейдиться гладко. Оно пытается сконвертировать поля типа text в тип bytea, а в PostgreSQL 9.1 (другие не пробовал) автоматического преобразования этих типов нет.

Лечение (применяется к базе PostgreSQL до апгрейда):

CREATE OR REPLACE FUNCTION text2bytea(text) RETURNS bytea AS
$BODY$
begin
 return convert_to($1,'UTF-8');
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
CREATE CAST (text as bytea) with function text2bytea(text) as implicit;
Может я тут что и перепутал и as implicit не нужно, но работает и "базовый" сайт (core modules) переносит.

2. А вот в том, что касается contributed modules - счастья у меня нет:

Про перевод часов, таймзону, PHP и Drupal

Вдруг кому поможет, поэтому тут (у меня теплится слабая надежда, что в ближайшие годы новых экспериментов с летним временем не будет, поэтому самому такие записки вроде не нужны).

PHP:

  1. У PHP база данных таймзон вшита в пузо и, конечно, не обновляется регулярно.
  2. Но есть pecl-timezonedb, который ее оверрайдит, со свежей базой (последняя имеет номер версии 2011.13), с этим расширением с таймзонами все станет отлично и любимая всеми Europe/Moscow будет работать как полагается по новым правилам.
  3. Но если вы живете под FreeBSD, то там /usr/ports/misc/pecl-timezonedb не обновлялся очень давно, посему:
    • Меняем там в Makefile 2010.9 на 2011.13
    • удаляем distinfo
    • make && make install
  4. Добавляем timezonedb.so в список extensions.ini (на FreeBSD это сделает make install)
  5. Перестартовываем PHP-fastcgi или Apache или что у вас там работает процесс-сервером для PHP
  6. Ура, можно накатить первый стакан.

Drupal 6:

  1. Сам по себе сразу начинает жить правильно (ну, насколько мне показалось). Т.е. таймзона меняется после апдейта PHP-timezonedb с +0300 на +0400 сама.
  2. Но! В Administer-Date-and-time есть настройка про User Configurable time-zone. Если она включена, то пользователю будут показываться даты-времена в его таймзоне. И весь созданный им контент будет иметь время создания рассчитанное из юзерской таймзоны.
  3. Но. Юзерская таймзона специфицирована в секундах смещения от UTC.
  4. Выходов два: или для всех российских пользователей взять и поправить скриптом (по хорошему, с учетом даты регистрации), или просто отменить настройку пользовательских таймзон. Я пошел по второму пути.

День друпала

В режиме записок для памяти, пусть проиндексируется и лежит.

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

Друпалеру на заметку

Если у вас по каким-то причинам есть запись в таблице node, но нет ни одной записи с таким nid в node_revisions, то у вас ВНЕЗАПНО начнут портиться права доступа. Причем rebuild permissions будут помогать ненадолго, до попытки создания очередной node.

Детектируется проблема элементарно:

 select nid from node n where not exists (select nid from node_revisions r where r.nid=n.nid);
Лечится - таким же delete.

Но я сегодня чуть не фалломорфировал, разбираясь.

Почему создание записи с revision не обернуто в транзакцию - мне удивительно, но подозреваю что это привет от MySQL.

Про Drupal 7

По случаю выходных, помацал Drupal 7 (в связке с PostgreSQL 9, гулять так гулять). Внутрь особо не заглядывал, просто покрутил в руках на тестовом сервере.

Имею сказать:

  • Штука - работает. Ну то есть я пробовал свежую инсталляцию, а не апгрейд старой, с апгрейдом лично у меня будут проблемы.
  • Модулей, прямо скажем, не хватает. Я смотрел список используемых у меня на разных сайтах, дойдя до буквы I обнаружил уже две проблемы и остановился. Проблемы такие:
    • Нету inline tags, а я этот модуль использую для публикации через BlogAPI (собственно, BlogAPI тоже нет, но вроде есть какая-то замена). Как-то можно обойтись, что-то похакать, может быть в замене BlogAPI категории работают.
    • Нету GeSHi Filter (syntax highlighter для кусочков кода) и это уже совсем большая потеря. Замены есть и не одна, но все с другим синтаксисом, вместо <code> что-то еще, а это готовые тексты-каменты править.
В-общем, пусть поживет еще несколько месяцев без меня....

Holy war: Movable Type vs Drupal

В начале января я заменил на блоге Movable Type на Drupal. Прошло три месяца, можно уверенно говорить, что переезд удался.

Но вот на что хочется обратить особое внимание: посещаемость выросла практически вдвое (на графике выше - понедельные визиты по Google Analytics). И произошел этот рост - в течение пары недель, после чего посещаемость стабилизировалась.

Дело не в моей писучести - как писал 10-15 текстов в месяц, так и пишу. Более того, количество постоянных подписчиков (RSS и ЖЖ-френды) таким скачком не выросло, рост есть, ну процентов может на 15 за три месяца.

Половину роста дали поисковики, им (не знаю почему) Drupal оказался более люб. Вторая половина - просто не понимаю откуда (direct traffic, согласно Google Analytics). Чудеса. Но факт - вот он, на лице.

ljcomments2drupal 0.02

Первая (0.01-я) версия ljcomments2drupal оказалась, как любой скрипт на скорую руку, с ошибками.

Версия 0.02 исправляет известные на сегодня проблемы:

  • Если комментарий один (добавился один свежий), то неправильно импортировалось имя комментатора. Это фишка XML::Simple (разное поведение с одним значением и с несколькими), про которую я постоянно забываю.
  • Неправильно устанавливалась homepage автора комментария (ссылка на его ЖЖ).
  • Добавлен скрипт fixauthors.pl, который правит накопленные ошибки прямо в БД сайта.

Качаем новую версию тут: ljcomments2drupal-0.02.tar.gz

ljcomments2drupal

LJ Sync за несколько дней эксплуатации совершено опротивел. Изрядную часть его достоинств я почикал, оставил только импорт комментариев, но и с этим оно справляется не на пятерку:

  • Комментарии с пустым сабжектом - так и оставляет пустым, в результате RSS без ссылок, список свежих комментариев - тоже без них. Поправить недолго, но...
  • Уведомления о ЖЖ-комментах приходят дважды, один раз из ЖЖ, второй раз из моего блога. Это, типа, фича.
  • Работает долго т.к. каждый раз разбирает многомегабайтный XML в котором весь мой ЖЖ за все времена.

Drupal LJ Crossposter: маленький фикс

Как заметили внимательные читатели, при кросспоcте в ЖЖ иногда остается лишний 'Read More' он же lj-cut.

Прилагаемый патч исправляет проблему, автору в багтрекер тоже нагажено.

Автор исправил проблему в версии 1.6

Друпал - усугубляем бардак с алиасами

У меня исторически имеет место бардак с именами URL: все они порождены из заголовков записей, но

  • В большинстве случаев дефис заменен подчеркиванием (и в заголовок данной записи специально добавлен дефис, чтобы проверить).
  • В некоторых случаях дефис оставлен дефисом, это привет MovableType, настроенного по умолчанию из лета 2008 года.
  • В некоторых случаях дефис вовсе скушали, какая-то версия MT заменяла конструкцию ' - ' не на '___' и не на '_-_', а на '__'.
Причем, как выяснилось по логам, есть внешние ссылки на разные представления одного и того же, уж не знаю откуда они взялись.

Проблема лечится вот таким вот SQL-оператором (regexp_replace() - чисто постгресовское, MySQL-аналог найдите сами. Это только для nodes, с таксономией в моем случае проблем нет совсем.

 insert into url_alias(src,language,dst) select src,language,regexp_replace(dst,'-','_','g') from url_alias where src like 'node%' and dst like '%-%';

Pages

Subscribe to Drupal