Что нового

Бесплатно AJAX навигация или подгрузка новостей в {custom} (1 Viewer)

  • Автор темы ravchik
  • Дата начала
ravchik

ravchik

Участник
OLD SkripTers
Регистрация
18 Дек 2019
Сообщения
54
Реакции
161
Для DLE есть несколько платных плагинов для AJAX-навигации или AJAX подгрузки новостей в {custom}. Но мы не ищем лёгких путёв и не хотим платить за каждый домен...
Поэтому решил создать свой. Пораскинув мозгами, решил не умничать и взял за основу древнюю статью Sander'a "AJAX навигация в теге Custom - реализация".
Адаптировал, допилил, добавил, убавил... И получилось вот это ))

Установка:
1. Установить плагин.
2. Добавить в JS вашего шаблона:
JavaScript:
/* AJAX навигация в custom */
$(document).on('click', 'a[data-page]', function(){
    let id = $(this).data('id'), page = $(this).data('page'), t = ($(this).data('next')) ? this : '';
    custom_navig(id,page,t);
    return false;
})
$(function(){
    $('.custom_block').each(function(){
        let id = $(this).attr('id'), page = localStorage.getItem('custom_'+id);
        if(page != '1') custom_navig(id, page);
        console.log(page);       
    })
})
function custom_navig(id,page,t){
    let hh = $('.header').height();
    $.get(dle_root + 'engine/ajax/controller.php?mod=custom',{id:id,page:page},function(d){
        if(!t){
            $("#"+id).html(d);
            localStorage.setItem('custom_'+id,page);
        } else {
            t.remove();
            $("#"+id).append(d);
            $('html,body').animate({scrollTop: $('#'+id+page).offset().top-(hh*2)},600);
        }
    })
}
3. Очистить кэш.

Использование
HTML:
<div class="custom_block" id="lenta">{custom block="lenta" navtpl="custom_nav"}</div>
где lenta - это ID родительского блока {custom} (обязательный параметр), класс custom_block - обязательный параметр (для нескольких блоков), custom_nav - файл шаблона для навигации (если параметр не указан, выводится стандартная ссылка на подгрузку). В качестве шаблона можно указать стандартный шаблон navigation.tpl, все теги поддерживаются.

В шаблоне custom_nav.tpl (или в любом, который вы указали) доступны теги:
[next]Текст[/next] - для вывода ссылки для подгрузки
[prev-link]Текст[/prev-link] - для вывода ссылки на предыдущую страницу
[next-link]Текст[/next-link] - для вывода ссылки на следующую страницу
{pages} - для вывода списка страниц

Количество страниц до разделителя "..." указывается в функции custom_navig() в переменной $count (в движке где-то прописано это количество?).

P.S.: Тестировался только на DLE 17, но по идее должно работать и на более ранних версиях.

Update 16.12.2023: Переработан и оптимизирован код, из ссылок навигации убран js (onclick) и добавлены ссылки на страницы. Переделана работа с кэшом. Параметр в {custom} изменён на block!

Файл перезалит! Необходимо переустановить плагин и заменить старый JS-код на новый! Изменить имя параметра в {custom} на block="lenta"



17018466034791701846645492
 
Последнее редактирование:
Привет, работает только в main.tpl?
 
Привет, работает только в main.tpl?
Привет. А обычный {custom} работает только в main.tpl? Плагин просто добавляет ajax-навигацию, остальных отличий от обычного custom нет.
 
Привет. А обычный {custom} работает только в main.tpl? Плагин просто добавляет ajax-навигацию, остальных отличий от обычного custom нет.
Да я попробовал на статике вывести и что-то не пошло, перекачал архив, вроде работает. ) 15.1
 
Добавил кэширование и запоминание последней выбранной страницы при постраничной навигации.
Файл перезалит. JS-код обновлён. Необходимо переустановить плагин и заменить старый JS-код на новый.

Если обнаружатся баги - пишите.
 
Update 11.12.2023: Поправил кэширование. Поправил запоминание страниц в постраничной навигации.
Файл перезалит! Необходимо переустановить плагин и заменить старый JS-код на новый!
 
Лишняя скобка } будет косячить ссылку на последнюю страницу:

По поводу запоминание страниц в постраничной навигации, то тут на любителя или от надобности. К примеру если custom внутри новости то если запомнит в одной новости страницу 3 то при заходе в другую будут новости уже с страници 3 и т.д.
Супер решение, надо будет на customcomments еще попробовать сделать.
 
Update 16.12.2023: Переработан и оптимизирован код, из ссылок навигации убран js (onclick) и добавлены ссылки на страницы. Переделана работа с кэшом. Изменён JS-код для работы с навигацией.

Файл перезалит! Необходимо переустановить плагин и заменить старый JS-код на новый! Изменить имя параметра в {custom} на block="lenta"
 
Еще не устанавливал, но очень интересует вопрос. При нажатии показать больше новостей, URL меняется или нет?
 
Еще не устанавливал, но очень интересует вопрос. При нажатии показать больше новостей, URL меняется или нет?
Нет, URL не меняется.
А для чего нужно менять URL? А если на странице несколько блоков? URL которого из них нужно ставить в адресную строку?
 
Нет, URL не меняется.
А для чего нужно менять URL? А если на странице несколько блоков? URL которого из них нужно ставить в адресную строку?
Как раз таки и не нужно. Просто были способы в сети подгрузки и они меняли URL, что не очень хорошо для SEO. Ну раз не меняет, тогда обязательно поставлю для теста. Спасибо за ответ)
 
Установил, в целом реалзация даже лучше чем у New-Dev, у него вобще каша и не SEO ориентирвоано. Но есть нюанс, хотелось бы поддержки ленивой загруки изображений. Точнее если она включена, то новые блоки прогружаются без изображений. Надо как-то условие сделать, чтобы при загрузке блоков вообще отключалось Lazzy-load
 
Установил, в целом реалзация даже лучше чем у New-Dev, у него вобще каша и не SEO ориентирвоано. Но есть нюанс, хотелось бы поддержки ленивой загруки изображений. Точнее если она включена, то новые блоки прогружаются без изображений. Надо как-то условие сделать, чтобы при загрузке блоков вообще отключалось Lazzy-load
Спасибо за оценку. На счет lazyload - у себя такого не наблюдаю (неотображение картинок в подгруженных новостях).

Попробуйте в плагине в файле engine/modules/funcions.php, в первом блоке, после $custom_cache_id = $block.'_'.$page; добавить $config['image_lazy'] = false;
 
Последнее редактирование:
Спасибо за оценку. На счет lazyload - у себя такого не наблюдаю (неотображение картинок в подгруженных новостях).

Попробуйте в плагине в файле engine/modules/funcions.php, в первом блоке, после $custom_cache_id = $block.'_'.$page; добавить $config['image_lazy'] = false;
Странно, в таком случае престали вобще отображаться все изображения на сайте. В любом случае спасибо за помощь. Пока постараюсь сам найти способ.
 
Нашел решение, в php не силен, но вроде сработло и начало подгружаться. Посмотрите, насколько верно?

PHP:
function custom_ajax($id, $page=false) {
    global $config, $cacheTimestamp;
    $tpl = new dle_template( );
    $tpl->dir = ROOT_DIR . '/templates/'.$config['skin'];
    define( 'TEMPLATE_DIR', $tpl->dir );
    $string = $_SESSION['custom_'.$id]['string'];
    $limit = preg_match("#limit=['\"](.+?)['\"]#i", $string, $m) ? intval($m[1]) : $config['news_number'];
    $from = $limit * ($page - 1);
    if(!preg_match("#from=['\"](.+?)['\"]#i", $string)) $string .= ' from="'.$from.'"';
    else $string = preg_replace("#(from=\")[0-9]+(\")#i", '${1}'.$from.'${2}', $string);
    $result = custom_print(array('',$string));
 
    //Моя модицикация Lazy
    if ($config['image_lazy']) {
    $result = str_replace(' data-src="', ' src="', $result);
    }
 
    return '<span class="custom_line" id="'.$id.$page.'"></span>' . $result;
    }
 
Как еще можно исправить этот неприятный момент при загрузки custom блока. В полноценной мобильной версии (smartphone) загружается шаблон из десктоаной версии (Default). Как сделать чтобы в мобильной версии загружался шаблон из папки smartphone? Крайне непонятная логика.

17uz Galaxy Note II
 
Как еще можно исправить этот неприятный момент при загрузки custom блока. В полноценной мобильной версии (smartphone) загружается шаблон из десктоаной версии (Default). Как сделать чтобы в мобильной версии загружался шаблон из папки smartphone? Крайне непонятная логика.

Посмотреть вложение 3905
Попробуйте следующий вариант:
В плагине в файле engine/modules/functions.php изменить код
PHP:
function custom_navig($id, $page=false) {
    global $db, $config;
    if($_SESSION['custom_'.$id]){
        $custom_limit = (preg_match("#limit=['\"](.+?)['\"]#i", $_SESSION['custom_'.$id]['string'], $match)) ? intval($match[1]) : $config['news_number'];
        $count_all = $_SESSION['custom_'.$id]['count_all'];
        $count_all = ceil($count_all/$custom_limit);
        $tpl = new dle_template();
        $tpl->dir = ROOT_DIR . '/templates/' . $config['skin'];
заменить на
PHP:
function custom_navig($id, $page=false) {
    global $db, $config, $smartphone_detected;
    if($_SESSION['custom_'.$id]){
        $custom_limit = (preg_match("#limit=['\"](.+?)['\"]#i", $_SESSION['custom_'.$id]['string'], $match)) ? intval($match[1]) : $config['news_number'];
        $count_all = $_SESSION['custom_'.$id]['count_all'];
        $count_all = ceil($count_all/$custom_limit);
        $tpl = new dle_template();
        if($smartphone_detected) $config['skin'] = 'smartphone';
        $tpl->dir = ROOT_DIR . '/templates/' . $config['skin'];
 
Попробуйте следующий вариант:
В плагине в файле engine/modules/functions.php изменить код
PHP:
function custom_navig($id, $page=false) {
    global $db, $config;
    if($_SESSION['custom_'.$id]){
        $custom_limit = (preg_match("#limit=['\"](.+?)['\"]#i", $_SESSION['custom_'.$id]['string'], $match)) ? intval($match[1]) : $config['news_number'];
        $count_all = $_SESSION['custom_'.$id]['count_all'];
        $count_all = ceil($count_all/$custom_limit);
        $tpl = new dle_template();
        $tpl->dir = ROOT_DIR . '/templates/' . $config['skin'];
заменить на
PHP:
function custom_navig($id, $page=false) {
    global $db, $config, $smartphone_detected;
    if($_SESSION['custom_'.$id]){
        $custom_limit = (preg_match("#limit=['\"](.+?)['\"]#i", $_SESSION['custom_'.$id]['string'], $match)) ? intval($match[1]) : $config['news_number'];
        $count_all = $_SESSION['custom_'.$id]['count_all'];
        $count_all = ceil($count_all/$custom_limit);
        $tpl = new dle_template();
        if($smartphone_detected) $config['skin'] = 'smartphone';
        $tpl->dir = ROOT_DIR . '/templates/' . $config['skin'];
Увы никак не хочет работать, я уже всю голову сломал) Видимо не предусмотрена подгрузка блоков из мобильной версии. Идет какой-то конфликт. Плюс к этому из мобильной версии изображения вообще не прогружаются, даже без lazyload. Странности в общем одни
 
Последнее редактирование:

Пользователи, просматривающие данную тему

Верх