Друпальское: img_assist to img src
lexa - 30/Сен/2012 23:17
Каждую осень у меня случается обострение и я хочу поапгрейдить свои сайты на 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;
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 очень уж скоро не выйдет, да и
И, да, надо понимать, что D8 очень уж скоро не выйдет, да и когда выйдет - надо будет еще потерпеть годика полтора до использования.
То есть ужасы переезда D7-D8 - довольно отдаленные.
Спасибо, что так детально развернул. В принципе всё понятно.
Спасибо, что так детально развернул. В принципе всё понятно. И меня как раз интересует работа с postgres, а мускул не слишком. Ну и с нуля (D7). Я надеюсь обойтись гоовыми, но хотелось бы всё же надеяться, что разработчики не пойдут сусанинским путём.
Ну вот rawdigger.ru/com живет на D7+PgSQL с нуля - без вопро
Ну вот rawdigger.ru/com живет на D7+PgSQL с нуля - без вопросов вообще.
Да, практически то, что надо.
Да, практически то, что надо.
Но на русском сайте я с переводом не заморачивался. По опыт
Но на русском сайте я с переводом не заморачивался. По опыту D6 (пробовал заморочиться и бросил) - муторное это дело, как и всегда при переводе (длины строк, согласования форм слов)
Ну пробежавшись по сайту ещё раз, снаружи объём локализации
Ну пробежавшись по сайту ещё раз, снаружи объём локализации не выглядит устрашающе. Удивился, а что это сообщество drupal.ru разве не локализовало сей продукт, но зайдя увидел что и они особо не заморачивались.
Объем - большим не выглядит. Но получается - так себе. Потом
Объем - большим не выглядит. Но получается - так себе. Потому что "2 комментария/5 комментариев" и всякие такие штуки. Как и всегда с локализацией через gettext().
У локализации гнездо на drupaler.ru, но ее качество для семерки я не оценивал.
А не с апгрейдом ли связано,
А не с апгрейдом ли связано, что в некоторый момент перестали работать "свежие комментарии"? С первой страницы работает, но вот дальше первых пяти (more) не посмотреть.
да нет, апгрейд сейчас на
да нет, апгрейд сейчас на тестовом сайте работает и начнется в бою на libraw.org
Табличку с комментариями -
Табличку с комментариями - пнул ногой :)
Помогло. Главное знать куда
Помогло. Главное знать куда пнуть и как.
В этих друпальских views
В этих друпальских views (т.е. произвольный селект с широким набором способов вывода) с комментариями вечная какая-то засада.
Вот при апгрейде тестовом - views с комментариями - просто не перенеслись, пришлось их руками переделывать. Хорошо хоть пометились как broken.