imagefield, пути к изображениям, мультисайтинг и перенос на сервер

Главные вкладки

Аватар пользователя Anton L. Safin Anton L. Safin 9 апреля 2010 в 16:37

Судя и по этому сайту, и по issues на drupal.org многим приходилось сталкиваться с одной проблемой, проявляющейся в нескольких случаях:

1. При установке Drupal'а на локальной машине (например, на Denwer'е) после переноса на сервер изображения, загруженные при помощи поля Imagefield, не показываются. Если посмотреть на адрес картинки, можно увидеть примерно такой путь:
sites/mysite.ru/files/sites/mysite.local/files/screenshots/x.jpg (вместо sites/mysite.ru/files/screenshots/x.jpg)

2. При использовании одной и той же базы для разных сайтов (например, когда мы хотим сделать синоним mysite.com для сайта mysite.ru) появляется та же проблема с адресом, только в данном случае он выглядит как sites/mysite.com/files/sites/mysite.ru/files/screenshots/x.jpg

Проблема, если я правильно понял, заключается в том, что в таблице files путь записан в виде , а при выводе изображения "умный" Drupal сравнивает его с путем, прописанным в переменной "Путь файловой системы", и пытается определить, относительный это путь или абсолютный. То есть проблема, фактически, не в модуле ImageField, а в ядре Drupal'а (вроде как в 7 версии это поведение исправили).

Первую проблему можно решить, внеся исправления в БД. Например, таким образом (с drupal.org)

UPDATE `files` SET filepath = SUBSTRING_INDEX(filepath, 'sites/[incorrectpath.org]/files/', -1);
UPDATE `files` SET filepath = CONCAT('sites/[correctpath.org]/files/', filepath);

Внимание! Сам я этот способ не проверял, поэтому используйте на свой страх и риск. Не забудьте сделать backup БД.

Со второй сложнее. Поэтому - внимание! Универсальный способ, который позволяет решить обе проблемы сразу.
Суть фокуса - в использовании символических ссылок. Те, кто понимают, о чем я, уже собираются уходить. Погодите, не все так просто!

Да, есть соблазн сделать следующее:
ln -s mysite.com mysite.ru
Но проблему, как показывает практика, это не решает.

А теперь - правильный путь. Запускаем SSH, вводим имя пользователя, пароль...

cd ~/public_html/sites
cp -r mysite.ru mysite

Далее идем в настройки сайта ("Файловая система") и изменяем поле "Путь файловой системы":
sites/mysite/files

И, напоследок:

rm -r mysite.ru
ln -s mysite mysite.ru
ln -s mysite mysite.com

Честно говоря, я думал, что после этого придется еще и вносить правки в БД. Однако обновления кэша оказалось достаточно.

Вопрос с переносом с локальной машины решается в точности так же, только для этого вам нужно создать symbolic links и на локальной машине, и на сервере - папка, на которую вы ссылаетесь, при этом должна называться одинаково. В windows, кстати, тоже можно создать такую ссылку.

Комментарии

Аватар пользователя Anton L. Safin Anton L. Safin 10 апреля 2010 в 0:30

"<a href="mailto:Oleksa@drupal.org">Oleksa@drupal.org</a>" wrote:
UPDATE files SET filepath = REPLACE(filepath,"поменять это","на это")
Я пользуюсь этим. Работает на ура.

Это просто один из вариантов SQL-запроса. Он не решает проблемы с синонимами (когда нужно сделать несколько адресов для одного сайта).

Аватар пользователя Dimm Dimm 6 мая 2011 в 22:08

Вот Спасибо!!!
До UPDATE я сам додумался.
А про символические ссылки - не знал.
Для синонимов мультисайтинга - то что нужно!!!

Аватар пользователя Dimm Dimm 7 мая 2011 в 19:43

Один момент:
Синонимы русских доменов нужно прописывать всегда одинаково или всегда большими или всегда маленькими буквами.
Иначе символические ссылки не работают!
Или сделать по 2 символические ссылки на каждый русский синоним домена: одну большими буквами, а вторую маленькими.