Модуль новостей Joomla, показывающий последние, популярные или случайные материалы, является, пожалуй, одним из наиболее используемых модулей на любом сайте. В Joomla такой модуль называется «Материалы - Новости». Модуль хороший и простой, но, к сожалению, имеет один большой недостаток – он нормально не показывает вступительные изображения материалов. В данной статье я расскажу о том, как это можно легко и быстро исправить без хаков. Также в статье вы найдете готовый исправленный модуль и сможете скачать его совершенно бесплатно.
Содержание
Как правильно устанавливать вводное изображение в материалах Joomla
Перед тем, как мы займемся непосредственно модулем, нужно устранить одно важное недопонимание, которое может возникнуть у многих читателей.
Если мы посмотрим настройки модуля новостей Joomla, то увидим, что в них есть опция Показывать изображения:
Она не просто есть, она работает.
«Ну и в чем же тогда смысл статьи?» – спросите вы. Дело в том, что вступительное изображение в материале Joomla можно показать двумя способами:
- Добавить его в редакторе перед текстом материала
- Добавить его в опции Изображение для вступительного текста материала на вкладке Изображения и ссылки (см. рисунок ниже)
Первым вариантом, я так думаю, пользуется большинство. Он проще в понимании и тянется еще со времен первых версий Joomla. Изображение, в данном случае, является частью текста и просто располагается перед ним.
Второй вариант появился относительно недавно. В нем изображение загружается в отдельное поле и не является частью текста:
Оба варианта имеют право на существование, но второй вариант гораздо более правильный. «Почему?» – спросите вы. Поскольку изображение хранится отдельно от содержимого статьи, то мы можем легко им управлять, делая четкие и ровные картинки для разных материалов. Один раз подправив верстку этого изображения в макете, нам больше не нужно беспокоиться о том, что вступительные картинки у разных материалов будут выглядеть по-разному. Для каждого материала будет применяться единое оформление вступительного изображения. Это очень удобно.
Какие изображения может выводить стандартный модуль новостей Joomla?
Теперь к модулю. Его проблема в том, что он умеет выводить изображения, созданные в материалах Joomla, только первым способом, т.е. такие которые вставлены в редакторе перед текстом. Иначе говоря, данный модуль вообще не умеет выводить отдельно хранящиеся изображения.
Теперь самое забавное. Как же тогда модуль последних новостей скрывает вступительные изображения материалов Joomla, если они являются частью текста? Вот так:
$item->introtext = preg_replace('/<img[^>]*>/', '', $item->introtext);
Т.е. изображения просто вырезаются из текста регулярным выражением. Вывод изображений, созданных вторым способом (через специальное поле) в макете модуля новостей вообще не предусмотрен.
Интересно то, что в данных, доступных в макете модуля, есть путь к изображению, созданному вторым способом, правда хранятся они в формате JSON:
[images] => {"image_intro":"images\/images\/8eWQDa2H1LQ.jpg","float_intro":"","image_intro_alt":"","image_intro_caption":" ","image_fulltext":"images\/images\/8eWQDa2H1LQ.jpg","float_fulltext":"","image_fulltext_alt":"","image_fulltext_caption":""}
И хоть все это на первый взгляд кажется сложным, мы можем получить чистый путь к изображению из этой строки 1-2 строчками кода.
Добавление изображений, добавленных через специальное поле, в макет модуля новостей Joomla
Порядок действий:
1. Переопределяем макет модуля в шаблон Joomla (мы же не хотим, чтобы все наши изменения стерлись после первого же обновления Joomla?). Для этого копируем файл:
modules/mod_articles_news/tmpl/_item.php
в папку:
templates/ВАШ_ШАБЛОН/html/mod_articles_news/
и вносим все последующие исправления уже в скопированный файл.
2. В переопределенном макете _item.php вносим следующие изменения:
2.1. Находим строчку:
$item_heading = $params->get('item_heading', 'h4');
И добавляем после нее:
$image = json_decode($item->images, true);
Этой строчкой мы перекодировали данные из формата JSON в массив.
2.2. Находим строчку:
<?php echo $item->introtext; ?>
и добавляем перед ней:
<?php if($image) : ?>
<a class="item_image" href= "<?php echo $item->link; ?>">
<img src= "<?php echo $image['image_intro'] ?>" alt="<?php echo $item->title; ?>" />
</a>
<?php endif; ?>
Вот и всё. Теперь у вас в модуле новостей после заголовка, но перед текстом, будут появляться вступительные изображения, добавленные в материалы вторым способом (через специальное поле). После этого останется добавить немного CSS на ваш вкус, и гадкий утенок превратится в прекрасного лебедя, например, такого:
При этом вам не потребуется ни хаков ни сторонних компонентов. Не забудьте, что опция Показывать изображения в настройках модуля никак не влияет на изображения, добавленные через специальное поле. Она, наоборот, должна быть отключена, чтобы изображения из вступительного текста не попадали в модуль.
Как и обещал, прикладываю измененный макет:
Вам нужно скачать его и скопировать в папку:
templates/ВАШ_ШАБЛОН/html/mod_articles_news/
Работайте с Joomla правильно, избегая хаков и сторонних расширений, которые можно заменить стандартными.
с картинкой понятно. А вот с датой новости - не очень. Стал пробовать ваше решение (оно отлично работает) и столкнулся с тем, что дату (новостной!) модуль не выводит. Может я чего не заметил?
а если вы временно вставите:
то увидите все доступные данные, которые можно вывести в модуле по аналогии с датой.
Пытаюсь сменить формат даты через Language override (создала 6 DATE_FORMAT_LC и один DATE_FORMAT_JS1) - ничего не получается! все равно некрасивый формат наоборот и время зачем-то.
И еще хотела не дату создания, а дату публикации - замена created на published не помогла:) подскажите, пожалуйста, как правильно.
Спасибо!
Чтобы узнать правильный текст для вывода тех или иных переменных, напишите временно:
где-нибудь в цикле перебора материалов. Увидите все возможные варианты.
- чтобы вывести количество просмотров
- чтобы вывести дату создания.
Но непонятно, как в этом модуле сделать так, чтобы интро текст выводил первые 15 слов (не символов) и после последнего слова выводилось ... ( многоточие ) или символ стрелки → например. Тогда будет смотреться очень аккуратно.
Добавляете в начале макета эту функцию, а затем передаете в нее описание и количество слов, например, 15. Profit!
Спасибо! Все получилось, за исключением одного - изображение выводиться только в родительской категории, в категориях второго уровня и в статьях изображения нет только alt в рамочке. Почему так? Что нужно дописать в коде, чтобы картинка везде показывалась? Работаю в Joomla 3.7. Наверняка не один я с этим столкнулся, дополните статью если можете.
Есть главная категория "Статьи": в ней все ОК - изображения показываются, а в категориях второго и последующего уровня, входящих в главную категорию "Статьи" и соответственно в самих материалах, изображения нет. Может быть попробовать выводить изображение не из вступления, а из основной части материала? Но как это прописать в коде, увы, я не знаю.
Решилась тем что в строчке
Решилась тем что в строчке
убрал пробел после
А как по центру их поставить подскажите?
либо:
То в CSS, чтобы добавить стили именно для этого блока, вы пишите:
Но, еще раз скажу, это всё - лишь имитация пагинации. Реальную пагинацию в модули не ставят.
Вместо 100 подставьте число символов, которое вам необходимо. В конце я добавил троеточие, чтобы было понятно, что текст обрывается.
Это простейший пример. Можно сделать интереснее, обработав различные ситуации, вроде обрыва слова, пробела, знаков пунктуации и др.
Спасибо
1. Вы можете сами внедрить дополнительные поля в макет используемого стороннего модуля. В лучшем случае, используя конструкции, описанные в статье https://wedal.ru/uroki-joomla/joomla-custom-fields-nastraivaemye-polya-v-joomla.html , а в худшем, создав SQL-запрос в базу на получение данных полей.
2. Также вы можете использовать стандартный модуль Joomla и оформить вывод результатов в строку с помощью CSS (добавив блокам статей, например, display: inline или float: left).
Есть еще комбинированный вариант. Вы можете посмотреть код, которые добавляет настраиваемые поля в стандартный модуль новостей Joomla, и перенести его в ваш, нестандартный модуль. Теоретически, это может заработать.
Сделал по другому, используя бутстрап: поместил в DIV и на разное разрешение - разное количество столбцов, вроде работает
Давайте вернемся к этому вопросу.
У меня возникла такая же ситуация, дело в том что когда ты находишься на странице блога картинки в модуле отображаются, но когда ты заходишь в статью картинки в модуле пропадают, причем все. Вместо картинки остается заголовок картинки.
P.S. Крайне полезная статья и ещё более полезные комментарии. Особенно про этот код .
Важнее, что при этом у изображений не выводится их ширина и высота. Исправить это без хака джумлы или написания плагина я так понимаю не получится?
Другое дело, если вы для разных изображений всегда задаете размеры вручную. Тогда да - проблема. Но как по мне, это неправильный подход.
Что касается размеров изображений, то в категории они у меня одинаковой ширины чтобы смотрелось нормально, а в материале произвольные размеры в определенных рамках. Поскольку одновременно человек видит только одну статью, то не вижу в этом проблемы. Размеры автоматом проставляет JDE.
Просто у меня в основном скриншоты с текстом, а они сильно портятся при масштабировании и как все это привести без потерь к одному размеру я не представляю.
Есть еще одна проблема, нельзя добавить атрибуты к таким изображениям. Буду думать как быть...
Как сделать, что изображение было кликабельным как и заголовок?
И сортировка:
Ставлю показывать только избранное, ставлю отображать 1 материал. Я просматриваю последний материал с пометкой избранного и модуль мне показывает тот же самый материал.
Для этого оно должно быть обернуто в тег ссылки A. В коде, приведенном в статье, так и сделано. Т.е. если вы следовали ему, то изображение у вас должно быть кликабельным.
Логично, если в модуле в поле сортировки задано показывать самые свежие материалы. В этом случае последний и будет всегда выводиться.