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

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


     19.01.2015    Модули для DLE    7664    53 комментария

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

Автор: ПафНутиЙ
Версия 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. Если вы хотите, чтобы кеш модуля автоматически не чистился - можно изменить этот параметр.

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

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

53 комментария

scaver
Юзер

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

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

ПафНутиЙ
Админ

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

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

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

scaver
Юзер

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

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

ПафНутиЙ
Админ

ПафНутиЙ - 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
Юзер

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

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

ilgizon87
Юзер

ilgizon87 - 24 марта 2015 10:39 -

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

ПафНутиЙ
Админ

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

Адрес сайта?

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

ilgizon87
Юзер

ilgizon87 - 24 марта 2015 10:54 -

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

ПафНутиЙ
Админ

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

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

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

ilgizon87
Юзер

ilgizon87 - 24 марта 2015 12:30 -

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

ПафНутиЙ
Админ

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

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

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

ilgizon87
Юзер

ilgizon87 - 24 марта 2015 13:34 -

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

ПафНутиЙ
Админ

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

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

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

ilgizon87
Юзер

ilgizon87 - 24 марта 2015 13:43 -


ПафНутиЙ
Админ

ПафНутиЙ - 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
Юзер

ilgizon87 - 24 марта 2015 23:10 -

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

ПафНутиЙ
Админ

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

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

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

ilgizon87
Юзер

ilgizon87 - 25 марта 2015 08:07 -

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

vadims
Гости

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

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

ПафНутиЙ
Админ

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

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

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

vadims
Гости

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

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

vadims
Гости

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

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

vadims
Гости

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

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

ПафНутиЙ
Админ

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

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

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

vadims
Гости

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

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

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

vadims
Гости

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

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

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

ПафНутиЙ
Админ

ПафНутиЙ - 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
Гости

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

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

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

ПафНутиЙ
Админ

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

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

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

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

vadims
Гости

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

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

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

--
Alex K.


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

ПафНутиЙ
Админ

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

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

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

ilgizon87
Юзер

ilgizon87 - 11 марта 2015 19:23 -

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

ПафНутиЙ
Админ

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

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

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

ilgizon87
Юзер

ilgizon87 - 12 марта 2015 11:13 -

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

ilgizon87
Юзер

ilgizon87 - 26 марта 2015 10:48 -


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

ElefanD
Юзер

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

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

Creochrome
Юзер

Creochrome - 17 марта 2015 14:09 -

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

ПафНутиЙ
Админ

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

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

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

ravchik
Юзер

ravchik - 19 марта 2015 18:49 -

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

ПафНутиЙ
Админ

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

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

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

ravchik
Юзер

ravchik - 19 марта 2015 22:07 -

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

ПафНутиЙ
Админ

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

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

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

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

scaver
Юзер

scaver - 19 марта 2015 21:46 -

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

ravchik
Юзер

ravchik - 19 марта 2015 22:05 -

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

ilgizon87
Юзер

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. Все работает, все замечательно. Закрываю модальное окно и снова вызываю тот же трейлер, модальное окно открывается, но уже без подключенного плеера, стилей плеера.

ПафНутиЙ
Админ

ПафНутиЙ - 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
Юзер

ilgizon87 - 24 марта 2015 11:12 -

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

scaver
Юзер

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

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

rustik25
Юзер

rustik25 - 10 августа 2015 18:48 -

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

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

ПафНутиЙ
Админ

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

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

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

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

super.bog19
Юзер

super.bog19 - 3 августа 2018 13:55 -

А будит обновление для dle 13.0 ?

progressive
Юзер

progressive - 14 августа 2018 08:05 -

тоже интересует!

super.bog19
Юзер

super.bog19 - 28 августа 2018 13:49 -

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

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