Не нравятся результаты поиска? Попробуйте другой поиск!
dle-faq.ru Модули для DLE {AJAX FULL-STORY} — модуль AJAX-загрузки полной новости для DLE

{AJAX FULL-STORY} — модуль AJAX-загрузки полной новости для DLE


     19.01.2015    Модули для DLE    3572    50

Краткая информация о модуле (хаке)

Автор: ПафНутиЙ
Версия DLE: 9.6-10.X
Цена: Бесплатно
{AJAX FULL-STORY} — модуль AJAX-загрузки полной новости для DLE


Бесплатный модуль {AJAX FULL-STORY} позволяет организовать на сайте под управлением DataLife Engine быстрый просмотр полной новости на AJAX. А благодаря правильному кешированию он работает очень эффективно.

Этот модуль родился в процессе работы над другим модулем и обладает рядом преимуществ по сравнению с аналогами.

Особенности модуля


- Не требует каких-либо правок движка.
- Учёт прав доступа к новости. Если пользователю по каким то причинам запрещено просматривать полную новость в настройках - он не сможет её посмотреть.
- Подсчёт количества просмотров. Модуль учитывает настройки DLE и если требуется - засчитывает просмотр новости.
- Корректная очистка кеша модуля. Кеш модуля очищается в соответствии с правилами автоочистки кеша DLE, поэтому в быстром просмотре новость будет всегда актуального содержания.
- Поддержка всех тегов. Модуль поддерживает все теги шаблона fullstory.tpl. Если тег не нужен в быстром просмотре - вместо него будет пустота. (форма добавления комментариев, сами комментарии).
- Кеширование на стороне клиента. Модуль отдаёт правильные заголовки. Если включено кеширование на сайте и пользователь повторно вызовет быстрый просмотр новости - браузер получит в ответ 304 статус и отдаст пользователю закешированную (в браузере) страницу.

Требования к установке


  • Версия DLE: 10.2+ (на более старых не проверялся, но должен работать вплоть до 9.6)
  • Прямые руки.


Установка


  1. Скачать актуальную версию модуля
  2. Если сайт работает в кодировке windows-1251, необходимо перекодировать файлы модуля в эту кодировку.
  3. Распаковать содержимое папки upload в корень сайта.
  4. В нужном месте любого шаблона вставить минимальный код:

    <span data-afs-id="{news-id}">Быстрый просмотр</span>

    где
    {news-id}
    - ID новости (обязательный параметр).

  5. Так же можно использовать дополнительные атрибуты:

    <span 
        data-afs-id="{news-id}"
        data-afs-template="mytemplate"
        data-afs-preset="mypreset"
    >Быстрый просмотр</span>


    - data-afs-template="mytemplate" - Путь к шаблону модуля относительно текущей папки с шаблоном сайта. Если на сайте разрешена смена скина, то путь будет построен относительно активного в данный момент шаблона сайта. По умолчанию: **{THEME}/ajax/fullstory**. (Необязательный параметр).
    - data-afs-preset="mypreset" - Путь к файлу с настройками модуля. По умолчанию не используется.

  6. В js файл шаблона вставить:

    $(document).on('click', '[data-afs-id]', function () {
        var $this = $(this),
            $data = $this.data();

        $.ajax({
                url: dle_root + 'engine/ajax/full-story.php',
                type: 'GET',
                dataType: 'html',
                data: {
                    newsId: $data.afsId, // Обязательная переменная
                    preset: ($data.afsPreset) ? $data.afsPreset : '', // Название файла с настройками (необязательно)
                    template: ($data.afsTemplate) ? $data.afsTemplate : '', // Название файла с шаблоном (необязательно)
                },
            })
            .done(function (data) {
                var $html = $(data);

                // Данные получены, можно заняться разбором и показать их в диалоге
                // Ниже простейший пример вывода контента в стандартном модальном окне DLE

                var modalId = 'afs-' + $data.afsId + '-' + $data.afsPreset + '-' + $data.afsTemplate;
                modalId = modalId.replace(/\//g, "-");

                var $modalBlock = $('<div style="display: none;"><div id="' + modalId + '"></div></div>');

                $modalBlock
                    .appendTo('body') // Добавляем блок на страницу
                    .find('#' + modalId) // Ищем интересующий нас селектор
                    .html($html) // Вставляем в него полученный код
                    .dialog({ // Показываем модальное окно
                        width: 800
                    });

            })
            .fail(function () {
                console.log("full-story error");
            });
    });



  7. В CSS-файл шаблона вставить код для стилизации выводимых ошибок:

    .afs-error {
        /*Общий стиль для всех ошибок*/
        padding: 20px;
        background: #fff;
        color: #424242;
    }
    .afs-news-error {
        /*Стиль ошибки, если новость не найдена*/
        background: #eceff1;
    }
    .afs-tpl-error {
        /*Стиль ошибки, если не найден шаблон*/
        color: #b71c1c;
    }
    .afs-perm-error {
        /*Стиль ошибки, если не достаточно прав для просмотра полной новости*/
        background: #e65100;
        color: #F5F5F5;
    }

  8. Не забудьте подправить JS и CSS код под свой сайт smile.

Параметры, принимаемые модулем


Модуль принимает через GET-запросы следующие параметры:
- newsId - Обязательный параметр. ID новости для показа.
- template - Путь к шаблону модуля относительно текущей папки с шаблоном сайта. Если на сайте разрешена смена скина, то путь будет построен относительно активного в данный момент шаблона сайта. По умолчанию:
{THEME}/ajax/fullstory

- preset - Путь к файлу с настройками модуля. По умолчанию не используется.

Настройки модуля


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

При формировании настроек необходимо соблюдать следующий синтаксис:
- Параметры необходимо писать по одному в строке.
- Имя параметра и его значение необходимо разделять знаком равенства.

На данный момент возможно использование следующих параметров:
  • fields - Поля, отбираемые из БД.
    Доступны следующие поля для запроса:
    - short_story, full_story, xfields, comm_num, fixed, tags
    - Так же можно использовать поле all, тогда будут отобраны все возможные поля новости из БД. Аналогичный результат будет, если не передавать в модуль переменную preset или передать её пустой.
  • cachePrefix - Префикс кеша, создаваемого модулем. По умолчанию full. Если вы хотите, чтобы кеш модуля автоматически не чистился - можно изменить этот параметр.

Подробнее о настройках и работе с модулем читайте в обновляемой документации.

Надеюсь модуль будет полезен не только мне. Жду ваших отзывов!

Комментарии пользователей (50)

scaver
6

119 | 17

scaver - 23 января 2015 00:05 - Юзер

Паш, научи плохому:
Скрыть скролл под модальным окном, сделать скролл для модального окна
Закрыть при нажатии на любое место за пределами модального окна
затемнить фон за модальным окном

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 23 января 2015 00:19 - Админ

Достаточно использовать нормальный скрипт модальных окон см. пример с ajax вызовом.

Каков вопрос - таков и ответ. Просто помните об этом.

scaver
6

119 | 17

scaver - 23 января 2015 01:48 - Юзер

Может модуль интегрируешь в этот скрипт модального окна? там же черт голову скрутит :-(

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 1 февраля 2015 22:47 - Админ

$(document).on('click', '[data-afs-id]', function () {
    var $this = $(this),
        $data = $this.data();

    $.magnificPopup.open({
        items: {
            src: dle_root + 'engine/ajax/full-story.php',
            type: 'ajax',
            ajax: {
                settings: {
                    type: 'GET',
                    dataType: 'html',
                    data: {
                        newsId: $data.afsId, // Обязательная переменная
                        preset: ($data.afsPreset) ? $data.afsPreset : '', // название файла с настройками
                        template: ($data.afsTemplate) ? $data.afsTemplate : '', // Название файла с шаблоном
                    }
                },

                cursor: 'mfp-ajax-cur', // CSS class that will be added to body during the loading (adds "progress" cursor)
                tError: '<a href="%url%">The content</a> could not be loaded.' //  Error message, can contain %curr% and %total% tags if gallery is enabled
            }
        }
    });
});

как то так. Написал навскидку, не проверял.

Каков вопрос - таков и ответ. Просто помните об этом.

scaver
6

119 | 17

scaver - 2 февраля 2015 10:25 - Юзер

Паш, идет Loading, после затемненный экран и все

ilgizon87
34 | 1

ilgizon87 - 24 марта 2015 10:39 - Юзер

ну, как? решение нашлось?

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 24 марта 2015 10:44 - Админ

Адрес сайта?

Каков вопрос - таков и ответ. Просто помните об этом.

ilgizon87
34 | 1

ilgizon87 - 24 марта 2015 10:54 - Юзер

модуль хорош, было бы замечательно сделать его сразу с Magnific Popup

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 24 марта 2015 11:04 - Админ

magnificpopup прикручивается легче, чем стандартное недоокно DLE.
Изначально в качестве модальног окна использовался как раз magnificpopup, но потом я пришёл к выводу что не всем оно надо.

Каков вопрос - таков и ответ. Просто помните об этом.

ilgizon87
34 | 1

ilgizon87 - 24 марта 2015 12:30 - Юзер

смотрел историю на github и не нашел такой вариант.

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 24 марта 2015 12:37 - Админ

Там этого и нет.

Каков вопрос - таков и ответ. Просто помните об этом.

ilgizon87
34 | 1

ilgizon87 - 24 марта 2015 13:34 - Юзер

только затемненный экран
это к коду выше с Magnific Popup

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 24 марта 2015 13:38 - Админ

повторюсь, адрес сайта есть?

Каков вопрос - таков и ответ. Просто помните об этом.

ilgizon87
34 | 1

ilgizon87 - 24 марта 2015 13:43 - Юзер


ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 24 марта 2015 21:33 - Админ

Да, я допустил ошибку в коде, правильный код такой:
$(document).on('click', '[data-afs-id]', function () {
    var $this = $(this),
        $data = $this.data();

    $.magnificPopup.open({
        items: {
            src: dle_root + 'engine/ajax/full-story.php',
            type: 'ajax'
        },
        ajax: {
            settings: {
                type: 'GET',
                dataType: 'html',
                data: {
                    newsId: $data.afsId, // Обязательная переменная
                    preset: ($data.afsPreset) ? $data.afsPreset : '', // название файла с настройками
                    template: ($data.afsTemplate) ? $data.afsTemplate : '', // Название файла с шаблоном
                }
            },

            cursor: 'mfp-ajax-cur', // CSS class that will be added to body during the loading (adds "progress" cursor)
            tError: '<a href="%url%">The content</a> could not be loaded.' //  Error message, can contain %curr% and %total% tags if gallery is enabled
        }
    });
});

Каков вопрос - таков и ответ. Просто помните об этом.

ilgizon87
34 | 1

ilgizon87 - 24 марта 2015 23:10 - Юзер

спасибо за участие, но там опять что-то не срастается. смотрел в console - есть ошибка, но я в этом не силен.

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 24 марта 2015 23:14 - Админ

поправил код, похоже надо больше отдыхать.

Каков вопрос - таков и ответ. Просто помните об этом.

ilgizon87
34 | 1

ilgizon87 - 25 марта 2015 08:07 - Юзер

я поправил себя код, но все по-прежнему (Затемнение и Loading...)
В консоли также ошибка Error: Syntax error, unrecognized expression:

vadims
10

373 | 63

vadims - 1 февраля 2015 13:43 - Юзер

Можно ли этот модуль использовать вместе с Block.Pro?

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 1 февраля 2015 22:48 - Админ

да, этот модуль можно с любым модулем использовать.

Каков вопрос - таков и ответ. Просто помните об этом.

vadims
10

373 | 63

vadims - 2 февраля 2015 00:23 - Юзер

Но так не работает -
{foreach $list as $el}<span data-afs-id='{news-id}'>{$el.title}</span>{/foreach}

vadims
10

373 | 63

vadims - 2 февраля 2015 00:39 - Юзер

{$el.id} помогло =)

vadims
10

373 | 63

vadims - 2 февраля 2015 00:47 - Юзер

Отличный модуль! Но возможно ли выводить полную новость не модальным окном, а спойлером?

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 2 февраля 2015 01:55 - Админ

Да хоть в новом окне))

Каков вопрос - таков и ответ. Просто помните об этом.

vadims
10

373 | 63

vadims - 2 февраля 2015 02:09 - Юзер

Павел, ну подскажите пожалуйста на что нужно заменить -
var $modalBlock = $('<div style="display: none;"><div id="' + modalId + '"></div></div>');

чтобы спойлером было.

vadims
10

373 | 63

vadims - 9 февраля 2015 09:32 - Юзер

Павел, подскажите как сделать 2 вывода в 1 шаблоне?

<span data-afs-id="{news-id}">Быстрый просмотр</span>
<span data-afs-id="{news-id}2">Быстрый просмотр 2</span>

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 9 февраля 2015 09:44 - Админ

<span data-afs-id="{news-id}">Быстрый просмотр</span>
<span data-afs-id="{news-id}" data-afs-preset="first" data-afs-template="firsttemplate">Быстрый просмотр</span>
<span data-afs-id="{news-id}" data-afs-preset="second" data-afs-template="secondtemplate">Быстрый просмотр</span>

и т.д.
Количество вызовов может быть неограниченным. Вы можете даже одинаковые кнопки размещать, разницы нет.

Каков вопрос - таков и ответ. Просто помните об этом.

vadims
10

373 | 63

vadims - 9 февраля 2015 09:59 - Юзер

Павел, большое Вам спасибо! А то я уже начал колхозить, переделывать Ваш full-story.php :)

Вопрос - если в кеше будет например 4000 файлов от модуля BlockPro + 4000 от AJAX фулстори, то это не как не скажется на быстроте работы сайта?
Использую VPS с Intel Xeon E5 + 2GB RAM+ SSD (кстати, советую
Внимание! У вас нет прав для просмотра скрытого текста.
) . Посещаемость не большая, 1000-1200 уников в день.
Просто интересно, если много кеша то хорошо ли это?

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 9 февраля 2015 10:08 - Админ

Ну сразу столько файлов вряд ли будет т.к. кеш будет чиститься при добавлении комментариев, но вообще лучше бы использовать memcache, только время жизни кеша тогда действовать не будет в этом случаи.
Цитата: vadims
ru.rootwelt.de

А как там обстоят дела с соблюдением законодательства о хранении перс.данных юзеров на территории росии?

Каков вопрос - таков и ответ. Просто помните об этом.

vadims
10

373 | 63

vadims - 9 февраля 2015 11:45 - Юзер

Ответ суппорта -
Здравствуйте.

Конечно, могли бы. У нас компания основная зарегистрирована на территории Великобритании, дочерние структуры в Германии, Чехии и Латвии. Законодательства этих указанных стран в частности и директивы ЕС в целом мы, конечно, соблюдаем. Но вот к законотворчеству третьих стран мы не имеем никакого отношения, соответственно, пока законы РФ не будут действовать на территории UK или EC, соблюдать их мы не имеем никакого резона. Сегодня они придумали данные на территории РФ хранить, завтра какой-нибудь Буркина Фасо введут закон, что при активации сервера надо приносить в жертву обезъяну, а в Саудовской Аравии что за использование чужой картинки на сайте - руки отрубать, причем хостеру клиенту.

--
Alex K.


По поводу кеширование. Установил memcache, получается что теперь пока не нажму кнопку очистки кеша, не чего не удалится из кеша (blockpro и ajax fullstory)?

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 11 марта 2015 21:12 - Админ

Должно чиститься само, префиксы кеша у модулей совпадают с префиксами новостей.

Каков вопрос - таков и ответ. Просто помните об этом.

ilgizon87
34 | 1

ilgizon87 - 11 марта 2015 19:23 - Юзер

у меня есть код трейлера в доп поле, можно ли адаптировать под вывод трейлера через ajax?

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 11 марта 2015 21:13 - Админ

Зависит от кода

Каков вопрос - таков и ответ. Просто помните об этом.

ilgizon87
34 | 1

ilgizon87 - 12 марта 2015 11:13 - Юзер

все реализовал, просто вывел в ajax/fullstory.tpl значение доп поля. круто, как раз то, что я искал и даже с запасом, можно же еще контент выводить.

ilgizon87
34 | 1

ilgizon87 - 26 марта 2015 10:48 - Юзер


Запарился я с html плеерами)
поставил Uppod.swf, все устраивает)

ElefanD
1

ElefanD - 10 февраля 2015 22:12 - Юзер

Подскажите пожалуйста, как сделать, что бы модальное окно появлялось не стандартное, а magnific popup - способ указанный выше не работает

Creochrome
22

Creochrome - 17 марта 2015 14:09 - Юзер

Здравствуйте. Замечательный модуль! Всё работает как надо, за исключением кнопки закрытия. Если открыть модальное окно, и открутить страницу вверх, вызванное окно ведёт себя непредсказуемо, посмотреть можно тут.

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 17 марта 2015 21:59 - Админ

В комплекте с модулем дан лишь пример его вывода на страницу, для того, чтобы вывести данные так как это вам необходимо, вам необходимо самостоятельно реализовать обработку на js.

Каков вопрос - таков и ответ. Просто помните об этом.

ravchik
66

375 | 123

ravchik - 19 марта 2015 18:49 - Юзер

Доброго времени.
В полной новости, открываемой в модальном окне, есть превью картинок, при клике на которые они открываются в новом окне, а не в highslide. Как быть?

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 19 марта 2015 20:40 - Админ

навесить другую галерею.

Каков вопрос - таков и ответ. Просто помните об этом.

ravchik
66

375 | 123

ravchik - 19 марта 2015 22:07 - Юзер

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

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 19 марта 2015 23:16 - Админ

Цитата: ravchik
Ну... с таким подходом лучше вообще использовать другую CMS...

Отчасти так и есть, DLE не располагает к просторам фантазии.
Кто ж виноват, что в стандарте используется хреновая библиотека, которую нельзя вызвать при перестроении dom-дерева без изощрений и костылей?

Каков вопрос - таков и ответ. Просто помните об этом.

scaver
6

119 | 17

scaver - 19 марта 2015 21:46 - Юзер

обсуждалось уже. необходима инициализация

ravchik
66

375 | 123

ravchik - 19 марта 2015 22:05 - Юзер

Не ткнете носом в обсуждение? Или может подскажете, как инициализировать?

ilgizon87
34 | 1

ilgizon87 - 23 марта 2015 23:21 - Юзер

<script type="text/javascript" src="{THEME}/js/projekktor-1.3.09.min.js"></script>
<video id="{news-id}" class="projekktor" poster="/uploads/posts/thumbs/[xfvalue_poster]" title="Трейлер - {title}" width="540" height="320" controls>
<source src="[xfvalue_trailer]" type="video/mp4" />
</video>
<span class="randomptrailer">Трейлер к {title}</span>
<script type="text/javascript">
$(document).ready(function() {
    projekktor('#{news-id}', {
    volume: 0.8,
    playerFlashMP4: '{THEME}/css/swf/StrobeMediaPlayback/StrobeMediaPlayback.swf'
    });
});
</script>

этот код в fullstory.tpl
вывожу в модальном окне трейлер через плеер projekktor. Все работает, все замечательно. Закрываю модальное окно и снова вызываю тот же трейлер, модальное окно открывается, но уже без подключенного плеера, стилей плеера.

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 24 марта 2015 10:43 - Админ

<script type="text/javascript" src="{THEME}/js/projekktor-1.3.09.min.js"></script>

это нужно выносить вне fullstory.tpl

projekktor('#{news-id}', {
    volume: 0.8,
    playerFlashMP4: '{THEME}/css/swf/StrobeMediaPlayback/StrobeMediaPlayback.swf'
    });

это нужно запускать по окончании ajax запроса.

Каков вопрос - таков и ответ. Просто помните об этом.

ilgizon87
34 | 1

ilgizon87 - 24 марта 2015 11:12 - Юзер

ПафНутиЙ, мне кажется проблема решается путем очистки содержимого модального окна после его закрытия (у меня к тому же еще и видео продолжает играть после закрытия). Может двигаться в этом направлении? Я так понял использование Magnific Popup решают проблему. Или как-то подпилить стандартное модальное окно?

scaver
6

119 | 17

scaver - 2 апреля 2015 18:46 - Юзер

где нибудь в конце попробуйте
<script type="text/javascript">
$('body').on('click', '.mfp-content a.highslide', function(){return hs.expand(this)});
</script>

rustik25
1

rustik25 - 10 августа 2015 18:48 - Юзер

Павел, ну подскажите пожалуйста, как сделать переход
Следующая новость и предыдущая новость?

Magnific Popup подключен, модальное окно открывается, стрелки влево вправо выведены, что прописать к стрелкам чтобы заработало задуманное?

ПафНутиЙ
1065

3396 | 2434

ПафНутиЙ - 10 августа 2015 19:10 - Админ

Ну для начала следует вывести ID предыдущей и последующей новости.
После чего смело добавляйте в модальное окно
<span data-afs-id="ID_предыдущей_новости">Предыдущая новость</span>
<span data-afs-id="ID_следующей_новости">Следующая новость</span>

И допишите при клике на data-afs-id закрытие модального окна. Если не ошибаюсь:
$.mgnificPopup.close()

Каков вопрос - таков и ответ. Просто помните об этом.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте