Друпальское: 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 будет работать после минимальных правок.

#!/usr/bin/perl
use strict;
use DBI;
my $dbname = shift @ARGV or die;
my $db = DBI->connect("dbi:Pg:dbname=$dbname") or die;
$db->{AutoCommit}=0;
$db->do("SET client_encoding=\'WIN\'") or die;

my $sel = $db->prepare("select filepath from files f inner join image i on i.fid=f.fid  where i.image_size='_original' and i.nid=?");

sub ia2html
{
  my $str = shift or return "";
  $str=~s/^\[//;
  $str=~s/\]$//;
  my @fields = split(/\|/,$str);
  my $hash={};
  foreach my $f (@fields)
  {
        my @a=split(/\=/,$f,2);
        $hash->{$a[0]} = $a[1];
  }
  return "" unless($hash->{nid});
  return "" unless $sel->execute($hash->{nid});
  my @fp=$sel->fetchrow_array;
  my $ret = "<img src=\"/$fp[0]\" ";
  my $lb=""; my $le="";
  $ret .= "width=\"$hash->{width}\" " if $hash->{width};
  $ret .= "height=\"$hash->{height}\" " if $hash->{height};
  $ret .= "alt=\"$hash->{desc}\" " if $hash->{desc};
  $ret .= "title=\"$hash->{title}\" " if $hash->{title};
  if($hash->{link}=~/(popup|node)/)
   {
     my $tg= ($hash->{link}=~/(popup)/)?" _target=\"_blank\" " : "";
     $lb = "<a href=\"/$fp[0]\" $tg>";
     $le="</a>";
   }
  $ret .=" class=\"inline inline-$hash->{align}\" " if $hash->{align};
  $ret .= ">";
  return $lb.$ret.$le;
}

my $selnodes = $db->prepare("select nid,teaser,body from node_revisions where body like '%[img_a%' or teaser like '%[img_a%'");
my $upnodes = $db->prepare("update node_revisions set teaser=?,body=? where nid=?");
$selnodes->execute;
while(my $d = $selnodes->fetchrow_hashref)
{
  $d->{teaser}=~s/(\]+\])/ia2html($1)/ge;
  $d->{body}=~s/(\]+\])/ia2html($1)/ge;
  $upnodes->execute($d->{teaser},$d->{body},$d->{nid});  
}
$selnodes->finish;
$upnodes->finish;
$sel->finish;
$db->commit;
$db->disconnect;

Comments

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

Друпал: для задачи "быстро какой-то сайт из готового дизайна и модулей" - все прекрасно. Мне нравится. Правда вот на Джумлу и/или Wordpress я вообще никогда не смотрел.

Друпал с постгресом: в друпале-семерке все сильно лучше, чем в D6. По-моему, в тех сайтах, которые исходно на D7 - я вообще ничего в коде не правил.
В D6 - у меня есть два патча для Drupal Core, которые я каждый раз накатываю (один про длину поля в БД, второй - про правильный escape для блобов). И один патч для comment-notify (но вроде бы мои правки в comment-notify уже внесли, не помню)

Друпал с MySQL: я пробовал недолго и меня стошнило (развалился MyISAM, потребовав repair table, а innodb был очень медленным).

Ну и вообще, с PostgreSQL я уже лет 15 работаю (с 97-го - точно), а с MySQL все никак не получается.

Апгрейд D6-D7: все правки из-за которых не проходит автоматический апгрейд - пока связаны именно с постгресом:
- LIKE-ILIKE
-автоматическое преобразование типов (нужно дописать функцию для cast)
- просто непонятная мне проблема, там в одном месте результаты SELECT вставляются в временную таблицу, так в SELECT перечислено больше колонок, чем в INSERT INTO. Запрос явно написан руками, возможно это ошибка, которую MySQL жрет без предупреждений

Разработка под Drupal: по-моему, эта система хуков долбанутая, но если привыкнуть, то вроде и ничего. Мне пока удавалось обходиться готовыми модулями за единственным исключением импорта комментов из ЖЖ обратно в Друпал, но этот импорт я сделал на перле и гажу прямо в базу. Некошерно, но работает.

Итого: сравнить с джумлой или вордпрессом (из популярных) - не могу, но использовал и буду продолжать использовать.

И, да, надо понимать, что D8 очень уж скоро не выйдет, да и когда выйдет - надо будет еще потерпеть годика полтора до использования.
То есть ужасы переезда D7-D8 - довольно отдаленные.

Спасибо, что так детально развернул. В принципе всё понятно. И меня как раз интересует работа с postgres, а мускул не слишком. Ну и с нуля (D7). Я надеюсь обойтись гоовыми, но хотелось бы всё же надеяться, что разработчики не пойдут сусанинским путём.

Ну вот rawdigger.ru/com живет на D7+PgSQL с нуля - без вопросов вообще.

Да, практически то, что надо.

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

Ну пробежавшись по сайту ещё раз, снаружи объём локализации не выглядит устрашающе. Удивился, а что это сообщество drupal.ru разве не локализовало сей продукт, но зайдя увидел что и они особо не заморачивались.

Объем - большим не выглядит. Но получается - так себе. Потому что "2 комментария/5 комментариев" и всякие такие штуки. Как и всегда с локализацией через gettext().

У локализации гнездо на drupaler.ru, но ее качество для семерки я не оценивал.

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

да нет, апгрейд сейчас на тестовом сайте работает и начнется в бою на libraw.org

Табличку с комментариями - пнул ногой :)

Помогло. Главное знать куда пнуть и как.

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

Вот при апгрейде тестовом - views с комментариями - просто не перенеслись, пришлось их руками переделывать. Хорошо хоть пометились как broken.