DLE: чем заменить отсутствующую картинку в шаблоне
Разбираем старую идею с uniqid(), выбираем существующую заглушку и проверяем, что миниатюра действительно загружается.
В этой записи
Задача: у записи нет изображения
В короткой памятке по DLE предлагалось заменить ветку no_image в show.short.php. Для тегов {image-…} и {fullimage-…} формировался новый путь к JPG-файлу. Полезная цель понятна: вместо пустой миниатюры показать изображение.
Почему случайное имя не создаёт картинку
Ключевой фрагмент выглядел так:
"/uploads/" . uniqid() . ".jpg"
uniqid() возвращает строку. Это не загрузка и не генерация файла. Если в каталоге нет изображения с полученным именем, браузер запросит несуществующий ресурс. При каждом новом рендере имя может меняться, но проблема отсутствующей картинки остаётся.
Кроме того, функция не гарантирует уникальность при любых условиях и не предназначена для криптографических секретов. Для выбора миниатюры ни случайный идентификатор, ни секрет вообще не нужны: нужен корректный путь к существующему изображению.
Простейший вариант — одна настоящая заглушка
- Подготовьте небольшое изображение подходящей формы. Оно должно принадлежать вам или иметь разрешённую лицензию.
- Разместите файл по стабильному публичному пути, например
/assets/no-image.svg. Это условное имя: сначала нужно действительно создать и загрузить файл. - Откройте этот URL отдельно и проверьте статус ответа и содержимое.
- В ветке шаблона «изображение отсутствует» используйте этот путь. Точное место и синтаксис зависят от версии 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().