AJAX навигация в теге custom
Данный вопрос уже многих интересует, неоднократно задавали вопросы по этой теме, однако вразумительного ответа никто нигде не получил.
Не буду ходить вокруг да около и сразу отвечу на всех мучающий вопрос - как сделать AJAX навигацию в теге {custom}.
Ответ прост и лаконичен - никак!
А теперь займемся словоблудием и рассуждениями.
Прежде всего стоит понимать принцип работы тега {custom} и его особенности. В мануале довольно подробно описаны все задаваемые параметры, мне для примера хватит и двух. Допустим надо вывести 6 новостей из второй категории:
{content category="2" limit="6"}
При компиляции шаблона, регулярка разбивает эту строку на составляющие, т.е. мы из шаблона передаем значения переменных в обработчик:
$category=2;
$limit=6;
Ни в движке, ни в базе данных, ни в прочих файлах нигде не хранятся значения этих переменных, они берутся из шаблона в момент его обработки. На выходе, как нам известно, мы получаем только сформированный шаблон по заданным критериям, не более.
Надеюсь этот момент понятен, поскольку он очень важен.
Перейдем к AJAX стороне вопроса. Чтобы сформировать "следующую" шестерку новостей в шаблоне мы бы использовали подобную запись:
{content category="2" from="6" limit="6"}
Кстати, один из вариантов реализации "псевдо-AJAX" навигации - это изначальное формирование нескольких таких блоков с разными значениями параметра from="". В некоторых случаях подобный вариант и подойдет, когда место под блок строго определено, а хочется чтобы там было больше новостей. Но о настоящей навигации тут нет и речи, это лишь табы с ограниченным количеством страниц.
Но вернемся к идее полноценной навигации. Чтобы скрипт по AJAX запросу мог сформировать следующие 6 новостей и выдал их в шаблон, он (скрипт) должет получить значения заданных параметров или взять их где-то внутри средствами движка. Но т.к. движок нигде не хранит значения параметров заданных в custom остается один вариант - передача этих параметров из шаблона, например так:
$.get(dle_root+"engine/ajax/custom.php",{category:'2',from:6,limit:6},function(data){...});
С одной стороны все прекрасно и замечательно. В итоге мы получим полноценно работающую навигацию, AJAX подгрузку и прочие плюшки. Однако не стоит забывать о главной стороне вопроса - БЕЗОПАСНОСТЬ! Любой злоумышленник, а такие будут (!), вплоть от недоброжелателей до любопытных детей, сможет вручную задать любой из параметров принимаемых custom-ом, но пожалуй самое неприятное - возможность создать перегрузку mysql-а. Достаточно будет прописать так:
$.get(dle_root+"engine/ajax/custom.php",{category:'1-999',from:0,limit:999999},function(data){...});
Конечно, в обработчике можно наставить ограничений на limit, на category и на все прочие параметры, но об универсальности не будет и речи.
Вот еще простой пример:
$.get(dle_root+"engine/ajax/custom.php",{category:'1',template:"main"},function(data){...});
И в кустоме будет использоваться шаблон главной страницы, и полноценный рип не за горами. Даже не рип, а полная копия шаблона.
Так что в полноценном понимании "AJAX в теге custom" невозможен.
Заметьте, я не говорю, что навигация в принципе не возможна. Ее можно легко реализовать, но с предзаданными параметрами в самом скрипте. Т.е. к примеру используем код вывода:
<div id="block_1">{content category="2" from="0" limit="6" template="short_custom"}</div>
JS:
$.get(dle_root+"engine/ajax/custom.php",{id:"block_1",page:2},function(data){...});
В php передается только 2 параметра.В PHP файле:
$custom = array(
'block_id' => array(
'category' => '2',
'from' => '0',
'limit' => '6',
'template' => 'short_custom',
)
)
Но этот метод как раз то, что называют "костыль". Есть и другие варианты, однако все они будут так же являться костылями. Вполне возможно, что чуть позже напишу статью по реализации навигации по одному из костыльных методов.
На этом пока все, надеюсь я не зря мозолил пальцы и писал эту статью :)
С уважением,
Олег Александрович a.k.a. Sander