Войти на сайт Регистрация
Добавить шаблон В каталоге: 578
Fance.ru
AJAX навигация для тега Custom для DLE
02.01.2014
  • 972 Просмотров:
  • 0 Скачиваний:
  • 0 Комментариев:
  • 0.0 Рейтинг:
  • (Голосов: 0)
Описание:
По факту, полноценная навигация в теге 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);
  }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"

Настройку стилей и шаблонов возложу на ваши хрупкие плечи. Уверен, вы справитесь wink

Автор хака: Олег Александрович a.k.a. Sander
Источник: www.Fance.ru
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]