Не так давно я писал статью о
невозможности ajax навигации в теге custom. Но так же я в ней упомянул о возможности создания этой самой навигации, но на костылях.
Вот решил поделиться с вами данной реализацией в качестве подарка. С Новым Годом!
Суть данного метода заключается в том, что в момент создания самого Custom блока идет перехват и обработка его параметров с последующим сохранением в сессии. Таким образом мы получаем полноценно работающую навигацию и полностью скрытый от пользователя код. Но как и любой костыль, этот тоже имеет определенный минус. Т.к. параметры хранятся в сессии, то по истечении времени хранения сессии пользователю надо будет обновить страницу сайта, чтобы навигация работала и блок отображался.
Собственно пример работы можете посмотреть у меня на
демо сайте
d101.sandev.proА так же добавил его тут, на
sandev.pro в блоке
Топ дняУстановкаОткрыть файл
engine/modules/functions.phpНайти строку:
$sql_select .= " WHERE ".implode(' AND ', $where)." ORDER BY " . $fixed . $news_sort . " " . $news_msort . " LIMIT " . $custom_from . "," . $custom_limit;
ПЕРЕД ней вставить:
if(preg_match("#idblock=['\"](.+?)['\"]#i",$param_str,$match)){
$_SESSION['custom_'.$match[1]] = array("string"=>$param_str,"where"=>implode(' AND ', $where));
}
В папке
engine/ajax/ создать файл
custom.php с содержимым:
<?php
/*
Автор: Sander
http://sandev.pro/
*/
@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();
}
$tpl = new dle_template( );
$tpl->dir = ROOT_DIR . '/templates/'.$config['skin'];
define( 'TEMPLATE_DIR', $tpl->dir );
$id = $db->safesql( trim( $_GET['id'] ) );
if( $id == "" OR !$_SESSION['custom_'.$id]) die();
$page = intval($_GET['page']);
if($page<1) $page = 1;
$ajax_adds = true;
if( preg_match( "#limit=['\"](.+?)['\"]#i", $_SESSION['custom_'.$id]['string'], $match ) ) $custom_limit = intval($match[1]);
else $custom_limit = $config['news_number'];
$from = ($page-1) * $custom_limit;
$string = preg_replace("#from=\"([0-9]+)\"#i","from=\"{$from}\"",$_SESSION['custom_'.$id]['string']);
echo custom_print(array("",$string));
require_once ENGINE_DIR."/modules/custom_navigation.php";
?>
В папке
engine/modules/ создать файл
custom_navigation.php с содержимым:
<?PHP
/*
Автор: Sander
http://sandev.pro/
*/
if(!defined('DATALIFEENGINE'))die("Hacking attempt!");
if($_SESSION['custom_'.$id]){
if(!$page) $page = 1;
$spred = 3;
if(!$_SESSION['custom_'.$id]['count_all']){
if( preg_match( "#limit=['\"](.+?)['\"]#i", $_SESSION['custom_'.$id]['string'], $match ) ) $custom_limit = intval($match[1]);
else $custom_limit = $config['news_number'];
$count_all = $db->super_query("SELECT count(*) as c FROM ".PREFIX."_post p LEFT JOIN ".PREFIX."_post_extras e ON p.id=e.news_id WHERE ".$_SESSION['custom_'.$id]['where']);
$count_all = ceil($count_all['c']/$custom_limit);
$_SESSION['custom_'.$id]['count_all'] = $count_all;
}else $count_all = $_SESSION['custom_'.$id]['count_all'];
if ($page != 1) $pervpage = "<a href=\"#\" title=\"В начало\" onclick=\"custom_navigation('{$id}',1);return false;\"><<</a><a href=\"#\" title=\"Назад\" onclick=\"custom_navigation('{$id}',".($page - 1).");return false;\"><</a>";
else $pervpage = "<span><<</span><span><</span>";
if ($page != $count_all) $nextpage = "<a href=\"#\" title=\"Вперед\" onclick=\"custom_navigation('{$id}',".($page + 1).");return false;\">></a><a href=\"#\" title=\"В конец\" onclick=\"custom_navigation('{$id}',{$count_all});return false;\">>></a>";
else $nextpage = "<span>></span><span>>></span>";
if($page-$spred>1) $pervpage .= "<span class=\"nav_ext\">...</span>";
if($page+$spred<$count_all) $nextpage = "<span class=\"nav_ext\">...</span>".$nextpage;
$sidepage = array();
for($i=$spred;$i>0;$i--) if(($page - $i)>0) $sidepage[] = "<a href=\"#\" onclick=\"custom_navigation('{$id}',".($page - $i).");return false;\">".($page - $i)."</a>";
$sidepage[] = "<span>{$page}</span>";
for($i=1;$i<=$spred;$i++) if(($page+$i)<=$count_all) $sidepage[] = "<a href=\"#\" onclick=\"custom_navigation('{$id}',".($page + $i).");return false;\">".($page + $i)."</a>";
echo "<div class=\"navigation\">".$pervpage.implode("",$sidepage).$nextpage."</div>";
}
?>
В любом подключенном к шаблону JS файле прописать код функции:
function custom_navigation(id,p){
$.get(dle_root+"engine/ajax/custom.php",{id:id,page:p},function(d){
$("#"+id).html(d);
});
return false;
}
И основная часть - шаблон:
<div id="custom-ajax-test">
{custom category="8" from="0" limit="5" idblock="custom-ajax-test"}
{include file="engine/modules/custom_navigation.php?id=custom-ajax-test"}
</div>
Обратите внимание, что
custom-ajax-test повторяется 3 раза. Это и есть ID блока в котором будут меняться страницы.
Так же последние 3 параметра тега custom - являются строго обязательными к заполнению, в том числе
from="0"Настройку стилей и шаблонов возложу на ваши хрупкие плечи. Уверен, вы справитесь ;)
С уважением,
Олег Александрович a.k.a. Sander