Виджет "Случайная запись"

2699
Здравствуйте!

""


Сегодня я хочу представить небольшой виджет для InstantCMS 2.x который может выводить в случайном порядке указанный в настройках тип контента. Это был мой первый виджет разработанный для новой CMS, особо наблюдательные люди могли его заметить в видео о Таблице картинок. За основу был взят стандартный виджет вывода контента + добавлена возможность смены записи через аякс, при нажатии кнопки "Обновить".


Виджет может быть полезным на сайтах с большим количеством информационно-справочного контента который сохраняет свою актуальность во времени.
Обычно пользователи читают новые записи на сайте, при этом растут счетчики их рейтинга и количества просмотров. Старые записи могут не читаться вовсе, либо просматриваться по прямым ссылкам, например, с поисковиков. Виджет способствует некоторому обновлению интереса новых пользователей к старому контенту. Информация о какой-либо статье или записи может заинтересовать посетителя сайта и сподвигнуть прочитать показанную запись.

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

Установка стандартная для второй ветки Инстанта.

Скачать: randomWidget.install.zip
Зеркало: randomWidget.install.zip
Виджет "Таблица картинок" | Модуль "Таблица картинок" для InstantCMS 1.10.4
Комментарии (41)
Алексей Тимофеев 31 августа 2014 в 01:17 -1
Информативно и доступно раскрыл все прелести незамысловатого виджета+
СергейП 31 августа 2014 в 02:20 0
Плюсую v smile
Слава 31 августа 2014 в 10:12 +1
Спасибо!
Виджет хороший, но настройки немного устарели.
Val 31 августа 2014 в 13:22 +2
Спасибо, учту. Вместе с будущими пожеланиями исправлю)))
lokanaft 31 августа 2014 в 13:54 +1
Наверно более удобно будет, если индикация загрузки будет вместо кнопки, дабы и контент не скакал, и на кнопку по сто раз не жали.
Val 31 августа 2014 в 17:12 +1
Очень интересная и полезная мысль!
reload 31 августа 2014 в 22:37 +1
Val, по улучшению: настраивать кол-во материалов для отображения,.. в общем сделать типа копию виджета "список контента", только с рандомным выводом!)

И есть вопрос - у меня чет не хочет выводить дефлотные виды контента) но те виды, которые создал сам - выводит)
шаб дефлотный, двиг с обновлением до 2.1.1 - проблем не у кого нет?)
Val 31 августа 2014 в 23:30 +1
reload, непонятно почему у вас не работает с дефолтными типами контента. Я его тестировал только на дефолтном, точнее даже на новостях (news).
А по количеству материалов - интересная идея! В принципе, уже достаточно мыслей прозвучало о доработке. Как появится свободное время, сяду воплощать.
Brut 1 сентября 2014 в 12:22 0
Странно, кроме страниц в виджете больше ничего не отображается, ни новости ни статьи ни объявления и т.д. А так +
reload 1 сентября 2014 в 16:13 0
Brut:
Странно, кроме страниц в виджете больше ничего не отображается, ни новости ни статьи ни объявления и т.д. А так +

Val, оказывается я не одинок!)
Brut, у вас отображается то что вывели первым? или методом тыка смотрели где заработает?)
Brut 1 сентября 2014 в 17:17 0
Проверял по очереди, страницы, объявления, фото, и так далее...
reload 1 сентября 2014 в 16:17 0
Val, кстати я страницы не проверял (спасибо Brut) - оказывается выводит только страницы из дефлотных данных и виды которые сам создал...
reload 1 сентября 2014 в 16:24 0
Вывел два виджета на странице
- в одном созданный вид контента "Раздельчик"
- в другом дефлотный "Страницы"

При открытии страницы отображают как и задумано

При "обновлении" любого виджета по клику на кнопку "обновить"
- в оба блока загружается одинаковая информация!) то что в первом отобразиться то и во втором будет (
не зависимо на каком виджете нажимать на обновление...
Слава 1 сентября 2014 в 17:12 0
Это проблема с ява-скриптом. Я сделал дату как на сайте, "2 дня назад". Но после нажатия на кнопку, дата стала вновь 28.03.2014.
Val 1 сентября 2014 в 17:15 +1
Да есть такая проблема, нужно дополнительно идентифицировать в какой виджет грузить аякс данные... Реализую в обновлении.
Так, а при установке одного виджета данные грузятся или нет (имеется ввиду для любого типа контента)?
reload 1 сентября 2014 в 20:22 0
Val:
а при установке одного виджета данные грузятся или нет (имеется ввиду для любого типа контента)?
У меня работает только с дефлотным контентом "страницы" и с самостоятельно созданными видами...
При установке в настройках дефлотных видов "новости, блоги, статьи...." виджет тупо не появляется на странице)

как то странно, не понимаю чем вид "страницы" может отличаться от "новостей" и моим созданным "раздельчик")

повторю что проверял не на чистой установке, а на обновленной до 2.1.1
Val 1 сентября 2014 в 21:10 +2
у меня тоже обновление, но я проверял только с типом контента Новости. Прочешу код, может что найду, тогда отпишусь...
SE7EN 5 сентября 2014 в 17:36 0
Если страницу обновлять то иногда появляется NULL, а есл обновлять сам виджет то в кратком описании не не режутся теги. Как исправить?
Val 5 сентября 2014 в 18:40 +1
Про null надо разбираться, возможно что-то связанное с задержкой ответа сервера scratch
А с тегами спасибо за дельное замечание, в следующей версии исправлю! А пока можно подправить в ручную, для этого нужно в файле шаблона random.tpl.php подправить 31-ую строку:
Код PHP:
  1.  
  2. <?php if ($teaser_field) { ?>
  3. <div class="rnd_teaser">
  4. <?php if (!empty($item[$teaser_field])) { echo html_clean($item[$teaser_field]); } ?>
  5. </div>
  6. <?php } ?>
  7.  
SE7EN 5 сентября 2014 в 21:07 0
код заменил, но теги все равно показываются, но только тогда когда нажимаю обновить в виджете, если просто обновляю страницу то всё ОК.
Val 6 сентября 2014 в 15:10 +2
Вчера был не мой день)))
Еще надо для обработки аякс запроса обернуть вывод тизера:
Код PHP:
  1.  
  2. ...
  3. $result = array(
  4. 'error' => false,
  5. 'id' => $item_id,
  6. 'url' => href_to($ctype_name, $item['slug']) . '.html', //ссылка на контент
  7. 'image' => html_image($item[$image_field], big), // ссылка на картинку (возвращает тег img)
  8. 'title' => htmlspecialchars($item['title']), //текст заголовка
  9. 'teaser' => html_clean($item[$teaser_field]) //текст тизера
  10. 'url_author' => href_to('users', $item['user']['id']),
  11. ...
  12.  
меняем в файле system\controllers\content\actions\item_random.php
Александр 9 сентября 2014 в 03:46 +1
А такого чудо модуля для первой ветки не будет?

P.S. очень интересная идея +
Val 9 сентября 2014 в 07:44 +1
К сожалению пока что не планировал делать, но возможно если будет достаточно свободного времени...
Sergon 7 апреля 2015 в 21:14 0
Val, я поставил на 2.2.1 и не работает random, можно что-то сделать? спасибо!
Val 7 апреля 2015 в 21:15 +2
Спасибо. Посмотрю в чем может быть причина.
Pawell 27 июня 2017 в 20:59 0
Здравствуйте. А можно ли как то настроить, чтобы изображение бралось из двух полей?
Я создал новое поле для вставки изображений. Надо, чтобы фотографии выводились либо из старого поля, либо из нового.
Или может как то можно прописать в $image_field = $this->request->get('image_field'); два поля?
Val 28 июня 2017 в 09:37 0
попробуйте вместо
Код PHP:
  1. $image_field = $this->request->get('image_field');
вставить:
Код PHP:
  1. $image_field = mt_rand(0, 1) ? 'field1_name' : 'field2_name';
где 'field1_name' и 'field2_name' соответственно системные имена первого и второго поля.
Pawell 28 июня 2017 в 22:11 0
Заменил код:
Код PHP:
  1. $image_field = mt_rand(0, 1) ? 'photo' : 'foto';
в файле widget.php и item_random. php. После очистки кэшей изображения стали появляться безсистемно, то есть порой отображаются, а порой не отображаются из обоих полей.
Val 28 июня 2017 в 22:59 0
В переменную $image_field ранее приходило системное имя поля с изображением. Сейчас системное имя случайно выбирается между 'photo' и 'foto'. Как вы и просили:
Pawell:
Надо, чтобы фотографии выводились либо из старого поля, либо из нового.

Изображения могут не показываться (не выводится если поле не содержит этого изображения). Т.е. изображения будут гарантированно рендериться только если оба поля содержат в себе путь до картинки. Предполагаю что в вашем случае картинку хранит только одно из полей?

В этом случае попробуйте исправить строку так:
Код PHP:
  1. $image_field = !empty($item['photo']) ? 'photo' : 'foto';
Pawell 28 июня 2017 в 23:27 0
У меня в любом случае есть фотография в одном из полей. Вставив этот код изображение берётся только из нового поля foto. Оставив изначальный код только из старого photo.
Val 29 июня 2017 в 08:31 0
Pawell:
У меня в любом случае есть фотография в одном из полей.
Как и сказал в прошлом сообщении из-за этого не сработал самый первый вариант.

Pawell:
Вставив этот код изображение берётся только из нового поля foto.
Тут я поспешил smile Переменная $item еще не определена и не существует, поэтому !empty($item['photo']) всегда будет false, оттого в качестве имени поля всегда берётся второй вариант 'foto'.

Закомментируйте 17 и замените 118 строку в файле ..\system\controllers\content\actions\item_random.php на следующее:
Код PHP:
  1. $items[$key]['image'] = !empty($item['photo']) ? html_image($item['photo'], 'big') : !empty($item['foto']) ? html_image($item['foto'], 'big') : '';
Pawell 29 июня 2017 в 23:00 0
Закомментировал строку:
Код PHP:
  1. #$image_field = $this->request->get('image_field');
Вставил это:
Код PHP:
  1. $items[$key]['image'] = !empty($item['photo']) ? html_image($item['photo'], 'big') : !empty($item['foto']) ? html_image($item['foto'], 'big') : '';
Вместо этого:
Код PHP:
  1. $items[$key]['image'] = !empty($image_field) ? html_image($item[$image_field], 'big') : ''; // ссылка на картинку (возвращает тег img)
Но этот код находился в строке №93, 118 строки вообще нет. Всего 117.
Скачивал обновление http://instantcms.ru/blogs/bitblog/vidzhet-sluchainaja-zapis-eshe-odno-obnovlenie.html виджета, так как в файле \system\controllers\content\actions\item_random.php в этой теме всего 64 строки.
В результате после всех приведённых выше манипуляций берётся изображение только из нового поля foto, из старого photo - нет.
Pawell 29 июня 2017 в 23:13 0
При первой загрузке сайта фотографии выводятся, после нажатия кнопки обновить исчезают, а затем после нескольких десятков нажатий на обновление появляются изображения из нового поля foto.
Val 30 июня 2017 в 20:11 +1
скобочки добавьте:
Код PHP:
  1. $items[$key]['image'] = !empty($item['photo']) ? html_image($item['photo'], 'big') : ( !empty($item['foto']) ? html_image($item['foto'], 'big') : '' );
Pawell:
Но этот код находился в строке №93, 118 строки вообще нет. Всего 117.
да, все верно строка 93. Смотрел файл у себя на локалке, а в нем есть много закомментированного кода, который я удалял из релизной версии.
Pawell 30 июня 2017 в 20:42 0
Всё работает. Спасибо.
ermakover 16 июля 2019 в 09:50 0
Поставил виджет на сайт, всё отлично работает. Автору респект и уважуха. И плюс в карму. Но вот у меня не работает автообновление. У всех так же или опять у меня только не работает?
Rainbow 16 июля 2019 в 17:34 0
Но вот у меня не работает автообновление.

Он без автообновления насколько знаю, обновляется при обновлении страницы.
Для этого кнопка "Обновить" и стоит.

Кстати разработчик обещал (по наличию времени) обновить немного по функционалу виджет...
Val 17 июля 2019 в 22:37 +1
В настройках можно установить кол-во секунд при котором будет автоматически "нажиматься" кнопка обновления)))

P.S. функционал немного доработал, надо как-то вам скинуть виджет чтобы вы могли детальнее потестить?
Rainbow 18 июля 2019 в 10:15 0
надо как-то вам скинуть виджет чтобы вы могли детальнее потестить?

Буду ждать.
Val 17 июля 2019 в 22:34 +1
Автообновление должно работать. Посмотрите в консоли браузера есть ли какие ошибки? Возможно есть какие либо конфликты со сторонними скриптами.
Если не разберётесь, пишите в личку, починим эту проблему))
ermakover 18 июля 2019 в 08:05 0
В консоли ошибок нет. Ставил различные значения автообновления, но не срабатывает. Напишу Вам в личку.