Сохранение медиа файлов после удаления последней связи с материалами

Drupal удаляет не используемые изображения. С одной стороны это правильная стратегия — зачем хранить картинки, файлы, которые уже не используются? С другой стороны есть причины, когда их требуется сохранить.

Вот хотя бы две:

  • SEO-шникам важно, чтобы картинки однажды попавшие в индекс от туда не пропадали.
  • Возможно картинку нужно будет использовать в другом месте, в другое время или же требуется «подключить» к другому материалу, а в данной статье связь требуется убрать.

При удалении файла/изображения из поля, во время сохранения материала, связь будет удалена, а файл стерт. Поля файла/изображения при каждой загрузке даже одного и того же файла создают независимую запись в базе данных и файл с новым именем. Это приводит к тому, что файл всегда связан только с одной публикацией (или entity). При его удалении из поля, Drupal удаляет последнюю его связь и сам файл с диска.

Многократное использование одних и тех же файлов/картинок

Среди 3d part модулей есть хорошее решение для управления медиа-файлами плагин media, которое позволяет многократно прикреплять один и тот же файл к разным сущностям, ну и много ещё чего.

К нему можно еще добавить плагин media_library, который позволяет маркировать файлы как часть медиа-библиотеки. В объекте file появляется соответствующее свойство —

это признак того, что файл добавлен в библиотеку.

Было бы удачно, если бы при этом файлы, добавленные в библиотеку, не удалялись, когда пропадает последняя связь. Но в drupal 7 нельзя зацепиться за функцию удаления в том месте, где решается можно ли удалять файл или ещё нет (функция file_delete в /includes/file.inc).

Обходим удаление файлов

Пусть мы установили плагины media, media_library. Мы можем ставить флажок — library, но проблема в том, что нужна ещё одна дополнительная связь, которая бы удерживала файл от удаления.

Вы можете вручную прикреплять все нужные файлы к какой-то специальной публикации. Это нудно и не удобно. Но это не потребует от вас навыков программирования.

Второй путь — автоматизировать первый вариант — т.е. написать плагин, который бы все файлы, получающие флаг «library», подключал дополнительно к какой то системной entity и отключал бы  от неё при сбрасывании этого флага. Требует некоторого времени, но было бы здорово иметь такой плагин, т.к. это самый правильный путь.

Есть и третий путь — это немного пропатчить /includes/file.inc, чтобы добавить проверку на то, что файл включен в библиотеку. Путь не очень хороший, но для седьмой версии Друпала подойдет, т.к. обновляется ядро уже не часто, а патч добавляет лишь несколько строк.

Мало букафф? Читайте есчо !

Примеры работы с EntityFieldQuery

Декабрь 7, 2017 г.

Один раз начав работать с EntityFieldQuery, вы уже не захотите городить SQL запросы с джойнами таблиц полей сущностей. Что то сложное, возможно, сделать будет слишком трудно на этом конструкторе, но типовые выборки данных делать приятно, быстро и удобно. ...

Читать

Создание контроллера для скачивания файла в Drupal

Сентябрь 6, 2023 г.

Пример кода, реализующий endpoint скачиваемого файла. [crayon-6aa473e0bdf1d022546752/] Кроме контроллера, вам потребуется еще задать маршрут. Пример описания маршрута: [crayon-6aa473e0bdf26776882655/]

Читать

Получение и рендеринг списка дочерних терминов в Drupal

Апрель 27, 2023 г.

Небольшой примера кода для работы с таксономией в Drupal 10. Мы запросим дерево дочерних терминов и произведем их рендеринг. Для начала загрузим какой-либо термин [crayon-6aa473e0be158547952981/] Следующий шаг - получение дочерних элементов ...

Читать

Многоязычность в Drupal 7

Март 31, 2015 г.

Конструирование многоязычного сайта добавляет множество деталей, которые нужно учитывать в процессе работы. Это и верстка шаблона, картинки которого могут ...

Читать
 

Комментарии к «Сохранение медиа файлов после удаления последней связи с материалами»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: