Хак Ajax подгрузка custom в нужный блок

Kubo

Приватовец
Приватовец
Регистрация
27 Фев 2017
Сообщения
42
Реакции
15
Баллы
8
Реализуем подгрузку новостей по custom через ajax, что позволит увеличить скорость загрузки страницы сайта.

Удобно применять, когда есть на странице несколько табов с выводом новостей, и чтобы не грузить все новости из табов одним разом можно использовать данный хак. Так же он используется в шаблоне 123Movies.

Screenshot_4.jpg

1. В /engine/ajax/ создайте файл с названием custom.php в него вставьте этот код:

Код:
<?php
// by PunPun.name Back-End разработчик и SEO оптимизатор
@error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );

define( 'DATALIFEENGINE', true );
define( 'ROOT_DIR', substr( dirname(  __FILE__ ), 0, -12 ) );
define( 'ENGINE_DIR', ROOT_DIR . '/engine' );

include ENGINE_DIR . '/data/config.php';
require_once ENGINE_DIR . '/classes/mysql.php';
require_once ENGINE_DIR . '/data/dbconfig.php';
require_once ENGINE_DIR . '/modules/functions.php';
require_once ENGINE_DIR . '/classes/templates.class.php';

dle_session();

require_once ENGINE_DIR . '/modules/sitelogin.php';
require_once ROOT_DIR . '/language/' . $config['langs'] . '/website.lng';
@header( "Content-type: text/html; charset=" . $config['charset'] );

if(!$is_logged) $member_id['user_group'] = 5;

//################# Определение групп пользователей
$user_group = get_vars( "usergroup" );
if( ! $user_group ) {
    $user_group = array ();
    $db->query( "SELECT * FROM " . USERPREFIX . "_usergroups ORDER BY id ASC" );
    while ( $row = $db->get_row() ) {
        $user_group[$row['id']] = array ();
        foreach ( $row as $key => $value ) $user_group[$row['id']][$key] = stripslashes($value);
    }
    set_vars( "usergroup", $user_group );
    $db->free();
}
//################# Определение категорий и их параметры
$cat_info = get_vars( "category" );
if( ! is_array( $cat_info ) ) {
    $cat_info = array ();
    $db->query( "SELECT * FROM " . PREFIX . "_category ORDER BY posi ASC" );
    while ( $row = $db->get_row() ) {
        $cat_info[$row['id']] = array ();
        foreach ( $row as $key => $value ) $cat_info[$row['id']][$key] = stripslashes( $value );
    }
    set_vars( "category", $cat_info );
    $db->free();
}
define( 'TEMPLATE_DIR', ROOT_DIR . '/templates/'.$config['skin']);
$custom = isset($_POST["castom"]) && is_scalar($_POST["castom"]) ? trim(strip_tags(stripslashes($_POST["castom"]))) : false;
if($custom==false) return;
if( strpos( $custom, "custom" ) !== false ) {
    $custom = "{".$custom."}";
    $custom = preg_replace_callback( "#\\{custom(.+?)\\}#i", "custom_print", $custom );
    if($custom !="") echo $custom;
}
?>

2. В табах на переключателях вставлять:
Код:
data-ajaxc="custom id='1' template='shortstory'"
- где внутри параметры custom без фигурных скобок и вместо двойных кавичек - одинарные.
3. Там где должен выводится контент вставить:

Код:
data-trigercajax="set"
4. Перед тегом
Код:
</body>
вставить:

Код:
<script>
   $(function($){
       $("body").on("click", "[data-ajaxc]", function(){
           var $castom = $(this).attr("data-ajaxc");
           $.post(dle_root+"engine/ajax/custom.php", {castom:$castom}, function(data){
               $("[data-trigercajax]").html(data);
           });
       })
   });
</script>
Пример конструкции:
Код:
<span data-ajaxc="custom id='1' template='shortstory'">Таб 0</span>
<span data-ajaxc="custom id='2' template='shortstory'">Таб 1</span>
<span data-ajaxc="custom id='3' template='shortstory'">Таб 2</span>
<div data-trigercajax="set">{custom id="1" template="shortstory"}</div>
Автор: punpun.name
 

Anisunn

Новичок
Регистрация
8 Апр 2018
Сообщения
4
Реакции
0
Баллы
1
Со slick slider не работает почему-то, прошу помощи. Вставляю $('main-carousel').slick('refresh'); итемы в слайдере при переключении вкладок просто бесконечно начинают дублироваться.
Использую такую конструкцию:

Код:
<span data-ajaxc="custom id='1-100' template='carousel_item'">1</span>
<span data-ajaxc="custom id='2-100' template='carousel_item'">2</span>
<span data-ajaxc="custom id='3-100' template='carousel_item'">3</span>
Код:
<div class="main-carousel slick-slider slick-dotted">
{custom category="1-100" template="carousel_item" from="0" limit="12" cache="no"}
</div>
Код:
$(function($){
        $("body").on("click", "[data-ajaxc]", function(){
            var $castom = $(this).attr("data-ajaxc");
            $.post(dle_root+"engine/ajax/custom.php", {castom:$castom}, function(data){
               $(".main-carousel").html(data);
               $('.main-carousel').slick('refresh');
            });
        })
    });
 

redissx

Новичок
Регистрация
27 Мар 2017
Сообщения
159
Реакции
146
Баллы
43
@Anisunn, почти уверен, что .main-carousel надо сделать переменной и уже все манипуляции делать с переменной, включая первоначальную инициализацию карусели.
 

Anisunn

Новичок
Регистрация
8 Апр 2018
Сообщения
4
Реакции
0
Баллы
1
@Anisunn, почти уверен, что .main-carousel надо сделать переменной и уже все манипуляции делать с переменной, включая первоначальную инициализацию карусели.
Попробовал так
Код:
 <div class="main-carousel slick-slider slick-dotted">
                <div class="carous">
                {custom category="10" template="carousel_item"}
                    </div>
          </div>
Код:
var $mobilecarousel = $('.main-carousel');
$mobilecarousel.not('.slick-initialized').slick({
            slidesToShow: 3,
            variableWidth: false,
            dots: false,
            arrows: false,
        });
   

$("body").on("click", "[data-ajaxc]", function(){
            var $castom = $(this).attr("data-ajaxc");
            $.post(dle_root+"engine/ajax/custom.php", {castom:$castom}, function(data){
               $('.carous').html(data);
               $mobilecarousel.slick('refresh');
            });
        })
Результата ноль
 

Anisunn

Новичок
Регистрация
8 Апр 2018
Сообщения
4
Реакции
0
Баллы
1
Что только не пробовал, все равно итемы тупо копируются бесконечно и все, то есть к примеру стоит на первой кладке айд 1, на второй 2 и т.п. вот при переключении к примеру с первой на вторую итемы с первого таба добавляются во второй и т.п. до бесконечности, также и при нажатии на первый таб, все итемы дублируются(((
 

PunPun

Coder
Команда форума
Приватовец
Регистрация
23 Фев 2017
Сообщения
618
Реакции
402
Баллы
63
Что только не пробовал, все равно итемы тупо копируются бесконечно и все, то есть к примеру стоит на первой кладке айд 1, на второй 2 и т.п. вот при переключении к примеру с первой на вторую итемы с первого таба добавляются во второй и т.п. до бесконечности, также и при нажатии на первый таб, все итемы дублируются(((
Вам нужно уничтожить dom слайдера и потом его заново инициализировать после вставки данных.
До вставки данных вы уничтожаете его, вставляете данные и заново инициализируете. Так устроен этот скрипт.
 

Anisunn

Новичок
Регистрация
8 Апр 2018
Сообщения
4
Реакции
0
Баллы
1
Вам нужно уничтожить dom слайдера и потом его заново инициализировать после вставки данных.
До вставки данных вы уничтожаете его, вставляете данные и заново инициализируете. Так устроен этот скрипт.
ооооо, огромное Вам спасибо. Ибо я просто уничтожал и инициализировал сразу после вставки данных.
 
Сверху Снизу