Технический сбой

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

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


     Модули для DLE    7785    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 - -

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

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

ПафНутиЙ - -

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

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

scaver
Юзер

scaver - -

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

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

ПафНутиЙ - -

$(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 - -

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

ilgizon87
Юзер

ilgizon87 - -

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

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

ПафНутиЙ - -

Адрес сайта?

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

ilgizon87
Юзер

ilgizon87 - -

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

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

ПафНутиЙ - -

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

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

ilgizon87
Юзер

ilgizon87 - -

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

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

ПафНутиЙ - -

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

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

ilgizon87
Юзер

ilgizon87 - -

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

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

ПафНутиЙ - -

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

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

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

ПафНутиЙ - -

Да, я допустил ошибку в коде, правильный код такой:
$(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 - -

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

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

ПафНутиЙ - -

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

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

ilgizon87
Юзер

ilgizon87 - -

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

vadims
Гости

vadims - -

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

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

ПафНутиЙ - -

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

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

vadims
Гости

vadims - -

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

vadims
Гости

vadims - -

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

vadims
Гости

vadims - -

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

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

ПафНутиЙ - -

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

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

vadims
Гости

vadims - -

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

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

vadims
Гости

vadims - -

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

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

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

ПафНутиЙ - -

<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 - -

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

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

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

ПафНутиЙ - -

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

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

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

vadims
Гости

vadims - -

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

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

--
Alex K.


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

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

ПафНутиЙ - -

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

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

ilgizon87
Юзер

ilgizon87 - -

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

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

ПафНутиЙ - -

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

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

ilgizon87
Юзер

ilgizon87 - -

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

ilgizon87
Юзер

ilgizon87 - -


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

ElefanD
Юзер

ElefanD - -

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

Creochrome
Юзер

Creochrome - -

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

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

ПафНутиЙ - -

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

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

ravchik
Юзер

ravchik - -

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

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

ПафНутиЙ - -

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

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

ravchik
Юзер

ravchik - -

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

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

ПафНутиЙ - -

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

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

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

scaver
Юзер

scaver - -

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

ravchik
Юзер

ravchik - -

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

ilgizon87
Юзер

ilgizon87 - -

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

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

ПафНутиЙ - -

<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 - -

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

scaver
Юзер

scaver - -

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

rustik25
Юзер

rustik25 - -

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

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

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

ПафНутиЙ - -

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

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

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

super.bog19
Юзер

super.bog19 - -

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

progressive
Юзер

progressive - -

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

super.bog19
Юзер

super.bog19 - -

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

наверх