gannicus.ЗАПИСКИ ПРОГРАММИСТА
Сайты · 2017-08-07

DLE: чем заменить отсутствующую картинку в шаблоне

Разбираем старую идею с uniqid(), выбираем существующую заглушку и проверяем, что миниатюра действительно загружается.

В этой записи
  1. Задача: у записи нет изображения
  2. Почему случайное имя не создаёт картинку
  3. Простейший вариант — одна настоящая заглушка
  4. Несколько картинок: выбирайте из существующего набора
  5. Не ориентируйтесь на номера строк ядра
  6. Минимальная проверка

Задача: у записи нет изображения

В короткой памятке по DLE предлагалось заменить ветку no_image в show.short.php. Для тегов {image-…} и {fullimage-…} формировался новый путь к JPG-файлу. Полезная цель понятна: вместо пустой миниатюры показать изображение.

Почему случайное имя не создаёт картинку

Ключевой фрагмент выглядел так:

"/uploads/" . uniqid() . ".jpg"

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

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

Простейший вариант — одна настоящая заглушка

  1. Подготовьте небольшое изображение подходящей формы. Оно должно принадлежать вам или иметь разрешённую лицензию.
  2. Разместите файл по стабильному публичному пути, например /assets/no-image.svg. Это условное имя: сначала нужно действительно создать и загрузить файл.
  3. Откройте этот URL отдельно и проверьте статус ответа и содержимое.
  4. В ветке шаблона «изображение отсутствует» используйте этот путь. Точное место и синтаксис зависят от версии DLE и используемого шаблона.
<img src="/assets/no-image.svg" width="480" height="300"
     alt="Изображение к записи отсутствует">

Если картинка лишь декоративно заполняет место рядом с уже видимым заголовком, вместо повторения заголовка в alt можно использовать пустое текстовое описание. Если изображение передаёт полезные данные, эти данные нужно описать словами.

Несколько картинок: выбирайте из существующего набора

Когда нужны разные обложки, сначала создают конечный набор реальных файлов, а затем выбирают один из него. Разрешённый список лучше составлять явно. Не подставляйте произвольный путь из пользовательского ввода и не рассчитывайте, что любое сгенерированное имя существует.

Три подхода к отсутствующему изображению
ПодходРезультатКогда подходит
Стабильная заглушкаОдин проверенный файлНужна предсказуемая карточка без фотографии
Явный набор обложекВыбор из подготовленных файловЕсть осмысленное различие разделов
Новое имя JPG без файлаВероятный ответ 404Не решает задачу

Не ориентируйтесь на номера строк ядра

В исходной заметке перечислялись строки 670, 690, 1072, 1304 и 1337. Без версии DLE они не определяют место правки. После обновления код меняется; редактирование чужой ветки может затронуть другое поведение, а обновление ядра — затереть изменение.

Сначала сохраните копию шаблона, найдите документированный механизм своей версии и попробуйте на тестовой странице. Если отдельного hook нет, ручную правку ядра нельзя выдавать за переносимое решение для всех установок. Не копируйте в PHP типографские кавычки из обычного текста вместо синтаксических кавычек языка.

Минимальная проверка

  • Запись с собственной картинкой продолжает показывать её.
  • Запись без картинки показывает заглушку, а не запрос к новому случайному JPG.
  • Список и полная статья проверены отдельно.
  • В сетевой панели нет 404 для выбранного изображения.
  • При узком экране картинка не вытесняет текст за границу страницы.

Справка по исходной функции: PHP — uniqid().