За многолетнюю практику работы с Drupal, я накопил целую библиотеку вспомогательных функций. Функция, описываемая в этой статье, используется для копирования изображений из внешнего источника в один из каталогов сайта с пользовательскими файлами. Необходимость в ней возникает, когда вы копируете статьи с картинками из внешних источников на свой сайт — переносите материалы или копи-пастите новости :).
Я убрал код функции копирования картинки в отдельную функцию myLib::local_copy($url) и покажу её в примере, который ужё показывал для Drupal 7 — для hook_node_presave($node), чтобы было понятно как её использовать.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function mymodule_node_presave($node) { //загрузка файлов, если в тексте есть теги со свойством src="..." if (!empty($node->body['und'][0]['value']) && preg_match_all('#src="([^"]+)"#ismuU', $node->body['und'][0]['value'], $m)) { //экспортируем картинки и правим ссылки в тексте foreach ($m[1] as $v) { $localUri = myLib::local_copy($v); if ($localUri !== false) { //подменяем адрес в тексте $node->body['und'][0]['value'] = str_replace($v, $localUri, $node->body['und'][0]['value']); } } } } |
Функция local_copy($url) вернет url файла в случаях, если файл уже есть или был удачно скопирован. Иначе функция вернет FALSE. URL не будет содержать имени домена, например:
1 |
/sites/default/files/auto-import/image.png |
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 |
/* сборник прочих функций */ class myLib { /* функция локализации файла, загрузит файл в каталог экспорта и вернет локальный url файла либо FALSE при неудаче*/ static function local_copy($externalURL) { //локальный каталог для хранения экспортируемых файлов $localdir = '/' . variable_get('file_public_path', conf_path() . '/files') . '/auto-import/'; $dir = $_SERVER['DOCUMENT_ROOT'] . $localdir; if (!file_exists($dir)) mkdir($dir, 0644); //пытаемся получить и скопировать файл $s = parse_url($externalURL); //проверим, что файл с иного домена, т.е. внешний if (!empty($s['scheme']) && $s['scheme'] == 'http' && $s['host'] != $_SERVER['HTTP_HOST']) { $filename = drupal_basename(urldecode($s['path'])); $filebinary = file_get_contents($externalURL); $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 $externalURL has been localized " . "to $localdir$filename."); //создание файла file_put_contents($dir . $filename, $filebinary); } return $localdir . $filename; } return false; } } |