Речь пойдет о небольшой задачке, которая постоянно всплывает при переносе данных со старых сайтов на новые.
Т.е. новый сайт уже готов, но есть старый, на котором какое то количество статей, требующих аккуратного переноса, при чем они содержат картинки. При переносе «вручную» приходится копировать сначала текст. Потом скачивать картинки себе на компьютер (ага, save as). Потом мы вставляем картинки в новую статью, т.е. грузим их через файл-менеджер wysiwyg на сайт, корректируем размеры, наверное и заголовок, поле alt понадобится заполнить попутно. Все это не укладывается уже в схему простого copy-paste.
Когда статей очень много, то без написания программы экспорта не обойтись, но для полусотни публикаций экспорт писать дело неблагодарное.
Почему бы не заставить drupal самостоятельно скачивать картинки? Ведь когда мы копируем в редактор кусок html, он сохраняет внешний URL картинки и все её прочие атрибуты. Нужно только программно закачать картинку и подменить путь в HTML на какой то локальный.
Задачу решал в Drupal 7, потому в моём примере код будет реализован в hook_node_presave. Для шестерки следует реализовать зацепку nodeapi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
function Mymodule_node_presave($node) { ... //вылавливаем в тексте src="...", здесь я не учитываю тот случай //когда в статье может оказаться вставлен внешний скрипт, //т.е. <script src=".." > if (preg_match_all('#src="([^"]+)"#ismuU', $node->body['und'][0]['value'], $m)) { //вот в эту папку будем складывать выловленные картинки $localdir = '/' . variable_get('file_public_path', conf_path() . '/files') . '/auto-import/'; $dir = $_SERVER['DOCUMENT_ROOT'] . $localdir; if (!file_exists($dir)) mkdir($dir, 0644); foreach ($m[1] as $v) { $s = parse_url($v); if (!empty($s['scheme']) && $s['scheme'] == 'http' && $s['host'] != $_SERVER['HTTP_HOST']) { //вот название файла $filename = drupal_basename(urldecode($s['path'])); //а вот его содержимое $filebinary = file_get_contents($v); $exists = false; //если такой файл уже есть (имя и размер такие же), //то копировать его не будем, иначе //к имени добавим свободную цыфирку по порядку while (file_exists($dir . $filename)) { if (filesize($dir . $filename) == strlen($filebinary)) { //файл такого размера уже есть, копировать не надо $exists = true; break; } //нужно сгенерировать новое имя файла if (preg_match('#^(.*)_?([\d]*)[.](.*)$#ismuU', $filename, $m)) { $filename = "$m[1]_" . ($m[2] + 1) . "." . $m[3]; continue; } } if (!$exists) { drupal_set_message("File $v has been localized to $localdir$filename."); //создание файла на локальном сервере file_put_contents($dir . $filename, $filebinary); } //подменяем адрес в тексте $node->body['und'][0]['value'] = str_replace($v, $localdir . $filename, $node->body['und'][0]['value']); } } } //hook_node_presave END } |
Надеюсь, этот кусочек кода съэкономит вам время. :)