Виджет on-modx.ru

Как известно, сегодня хороший праздник "День международной солидарности трудящихся", непонятно зачем переименовынный в "Праздник весны и труда" у нас.

Так что, поздравляю всех трудящихся с нашим профессиональным праздником и желаю дальнейших успехов!

Сам, накануне, тоже немного потрудился и сделал простейший виджет для показа каталога on-modx.ru через его api, благо, у проекта как раз юбилей.

Виджет интересен тем, что работает на ajax, но без php и располагается в одном единственном чанке.

<div id="on_modx" style="text-align:center">
    <h4 class="header">Сайты на MODX</h4>
    
    <div class="links"><small>
        <a href="http://on-modx.ru/">Посмотреть все</a> | <a href="http://on-modx.ru/catalog/add-site">Добавить свой</a>
    </small></div>

    <a href="" class="image"><img src="" alt="" title=""></a>
    
    <small class="version"></small>
    <h5 class="title"></h5>
    <a href="javascript:void(0)" onclick="return getSite();" class="refresh">Обновить</a>
</div>

<script type="text/javascript">
    $(document).ready(function() {
        getSite();
    });
    function getSite() {
        var elem = $('#on_modx');
        $('.image img', elem).attr('src', '/inc/img/spinner.gif');
        $.get('http://on-modx.ru/api', {'mode': 'json', 'display': 1, 'random': 1, 'w': 250, 'h': 0}, function(data) {
            if (typeof(data) == 'string') {
                data = $.parseJSON(data);
            }
            if (data[0]) {
                var site = data[0];
                $('.title', elem).text(site.name);
                $('.version', elem).text(site.ver);
                $('.image', elem).attr('href', site.fullinfo);
                $('.image img', elem).attr('src', site.src);
            }
            else {
                elem.hide();	
            }
        });
    }
</script>

То есть, базовая разметка, функция для запроса на удалённый сервис (который разрешает такие запросы) и вставка ответа в разметку.

Функция запускается при загрузке страницы, также можно кликать по ссылке "обновить". Очень-очень просто и гибко, на мой взгляд. Если на сервис не отдаст ответ - весь блок будет просто спрятан.

Кому нравится - прикручивайте себе. Нужно просто скопипастить и положить бегунок загрузки в /inc/img/spinner.gif.

Комментарии (14)
Чикин Артур
01.05.2013 05:48
<h5 class="title"></h5>

Пустой хедер не тру в СЕО

bezumkinВасилий Наумкин
01.05.2013 05:49

Никогда не парился про СЕО и не собираюсь начинать.

Там привязка идёт к классам - можно менять теги элементов как захочешь.

Чикин Артур
01.05.2013 05:53

А все разобрался, туда же текст подгружается. P.S Исправляюсь, посмотрел исходный код страницы на этом сайте:)

jean179Е. Вершинин
01.05.2013 09:02

Тупо поставил как простой чанк в Ево. jQuery подключен внизу. Однако есть пару вещей: 1. пока не жмакнешь кнопку обновить выводится только скелет. А после нажатия выводится все как положено. 2. почему-то в Firefox даже после обновления ничего не показывает. На Хроме показывает все нормально.

bezumkinВасилий Наумкин
01.05.2013 14:04

Chrome понимает ответ от сервера как объект, а FF как строку.

Добавил проверку

if (typeof(data) == 'string') {
    data = $.parseJSON(data);
}

вроде работает.

Andrey Grachov
01.05.2013 18:04

Есть специализированная функция $.getJSON.

agel_nashЕвгений Борисов
01.05.2013 22:12

Буду рад тоже услышать конструктивную критику на счет плагина для jQuery.

Andrey Grachov
01.05.2013 22:44

- Плагины обычно стараются возвращать переданные им элементы для обеспечения связанных вызовов методов. Если возвращаемое значение может понадобиться в дальнейшем (допустим, для вызова метода reload), его можно сохранить у элемента при помощи jQuery-функции data. - Вам может прийти не один элемент, поэтому функция плагина должна выглядеть так:


$.fn.MODXCatalog = function (options) {
    return this.each(function () {
        new MODXCatalog(this, options);
    });
};

- Не уверен, насколько это критично, но лучше проверять наличие windows.console - Шаблонизатор не использует экранирование символов, поэтому, например, имя этого сайта, записанное в атрибут alt, разрушит структуру элемента (в alt останется только "Кукольная мебель фабрики"). Рекомендую посмотреть на шаблонизатор underscore.js, например - Надо пересмотреть проверку параметра only (или значения радиобаттонов на демо-сайте), потому что даже на демо-сайте консоль заполняется сообщениями о неверности этого параметра

agel_nashЕвгений Борисов
01.05.2013 22:55

1,2 - Спасибо. Не знал. 3 - Знаю, на IE 6-7 может развалиться. Все забываю памятку про функции console написать. Ну теперь уж точно напишу)) 4 - Не хотел усложнять код. Но думаю .replace поможет в самом шаблоне. 5 - Да, не подумал как-то. Тупо вставил заведомо ложное значение в input, а оно вон как)

P.S. Спасибо за тест;-)

Andrey Grachov
01.05.2013 23:24

Не за что :) Если уже доводить все до идеализма, то можно еще сделать такие мелочи: - к ajax запросу добавить обработчик ошибки, чтобы скрывать в этом случае спиннер:


$.getJSON(...).fail(function() {
    Private.hide();
});

- в Public.setConfig можно немного упростить jQuery жизнь и сохранять значение $('#' + Private.config.tpl) в переменную, а потом уже у нее обращаться к length/html - не совсем по плагину, скорее по примеру использования - в обработчиках ссылок лучше использовать e.preventDefault() вместо return false. Разница может показаться незначительной, но иногда она играет важную роль :) Думаю, будет неплохо добавить режим автоматического обновления (правда он наверное подойдет только для режима random). Его не сложно сделать самостоятельно, но пользователи же любят когда все сразу включено в плагин :D

agel_nashЕвгений Борисов
02.05.2013 01:00

В шаблоне добавил замены кавычек на entities аналог. И избавился от return false. Вот про onclick и javascript:void(0) знаю, а вот про preventDefault() только сейчас узнал:-)

Сам плагин переделывать под return this each new не стал, т.к. это немного противоречит моей задумке с приватными и публичными методами. Да и сомневаюсь я, что будет несколько виджетов на одной странице. Не того полета плагин)

В итоге получилась 1.1 версия в который включил следующее: - Hide() в случае ошибки при ответе от сервера. - Подкорректировал логирование (проверку на window.console и отключил логер ошибок из-за некорректного значения в параметре only). - Добавил параметр timer для автоматического обновления блока.

Демка работы плагина там же.

Andrey Grachov
02.05.2013 01:13

Что-то не то пошло с консолью :) Она резко из window переехала в $ ($.error будет генерировать исключение, а не логгировать сообщение). clearInterval можно вызывать без проверок, если такого идентификатора таймера нет, ничего не произойдет. Лучше использовать setTimeout вместо setInterval.

agel_nashЕвгений Борисов
02.05.2013 01:35

Называется смотрю в книгу вижу фигу) Ведь еще в комментариях указана ссылка на stackOverflow с верным кодом. А я взял и переделал))

Спасибо за консультации, все таки на JavaScript не так часто пишу, как на php.

sergantСергей Шлоков
01.05.2013 09:27

Подтверждаю. На FF только spinner крутится - обновляй, не обновляй. На опере все работает гут.

bezumkin
Василий Наумкин
15.09.2023 08:27
Никакой разницы, только в количестве строк. Не знаю, почему я так написал - не задумывался -)
bezumkin
Василий Наумкин
14.09.2023 23:59
Очень рад, что тебе понравилось!
NightRider
12.09.2023 12:37
Понял. Спасибо за подробный ответ!
Сергей Лелеко
10.09.2023 06:23
Понял! да , сталкивался с этой проблемкой
Дмитрий П.
07.09.2023 11:19
ну да, что-то на этот момент я не обратил внимание) видимо дублирование в девтулсах происходит из-за...
NightRider
29.08.2023 10:30
Просто так совпало что у меня пока что есть свободное время на изучение. Остальные скорее всего побо...
bezumkin
Василий Наумкин
28.08.2023 01:02
Абсоюлютно верно, у меня даже IDE подсвечивает ошибку - не знаю, как пропустил. Поменял на $me-&gt;g...
bezumkin
Василий Наумкин
25.08.2023 10:24
Очень рад!
inetlover
Александр Наумов
24.08.2023 10:49
Спасибо!!
bezumkin
Василий Наумкин
21.08.2023 12:37
Сорян, что-то я уже второй раз затупил с этим дампом. Держи правильный ms2.sql.zip (2.79 Mb), в заме...