Модуль обновления стиля картинки при каждом редактировании материала

Drupal: 

Допустим, у вас сложный Вид показа изображений (в официальном переводе - Стиль изображений), применяемый для отображения картинок в материалах Фото. Например, вы вставляете в картинку текст из другого поля с помощью Image Effects Text или другие действия с модулем Imagecache Actions. Если содержимое картинки зависит от нескольких полей материала, то при редактировании материала стилизованная картинка не будет обновляться, если файл картинки остался прежним. То есть, если вы поменяли текст, который должен быть на картинке, то останется старый текст. Эту проблему решает следующий хук node_presave().

Хук site_helpers_node_presave() удаляет старую стилизованную картинку (в папке styles/public/имястиля/имякартинки) при каждом изменении материала. Тогда Друпал при отображении материала не находит картинку и создаёт стилизованную картинку заново. Тогда вы видите обновлённую картинку с новым текстом, или другим эффектом, который связан с полем, которое вы обновили.

Детали: в хуке обозначен тип материала: foto; имя поля изображения - foto; имя стиля картинки (Вида показа изображений) - demo.
Также имя функции site_helpers вы можете заменить на имя вашего модуля. Хук надо вставлять в модуль (не в тему). Под кодом предлагаю готовый архив модуля site_helpers.

Отладка: чтобы изучить поля материала, включите модуль Devel и используйте строки dpm(); - внимание, без включенного модуля Devel это вызовет белый экран.

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

  1. /* Delete image style file in every node Foto edition */
  2. function site_helpers_node_presave($node) {
  3. //reaction only for node type foto
  4. if ($node->form_id == 'foto_node_form') {
  5. //dpm($node);
  6. //getting path to file
  7. //foto - field system name
  8. $file = file_load($node->field_foto['und'][0]['fid']);
  9. $uri = $file->uri;
  10. //getting path to image style path if exists
  11. //demo - style's machine name
  12. $style_path = image_style_path('demo', $uri);
  13. //delete style file
  14. if ($style_path) file_unmanaged_delete($style_path);
  15. //dpm($style_path);
  16. }
  17. }

В этом модуле используются функции Drupal 7 :

node_presave - хук, который вызывается при каждом сохранении материала ( любого типа, поэтому внутри проверяется тип формы, который включает тип материала foto ),
file_load - загружает объект из базы данных, содержащий информацию о файле по id файла, то есть $fid,
image_style_path - возвращает адрес URI стилизованной картинки (из папки styles/public...),
file_unmanaged_delete - удаляет файл по его URI, без удаления информации о нём в базе данных (для файлов стилей картинок записи в бд не создаются, по-моему).

Таким образом, хук можно использовать на сайтах демотиваторов, о чём будет следующий урок.

Для других случаев:
Вручную удалить все стилизованные картинки, например, если на картинках присутствует имя или адрес сайта, можно удалив папку styles или немного поменяв ваш стиль картинок, тогда все старые картинки будут удалены.

Модули: