Хак Хак Алфавитный фильтр для DLE
Хак будет полезен в первую очередь тем, у кого тематический сайт-каталог. Например, сайт только с клипами, сайт только с книгами Д.Донцовой :-), сайт только с рок-музыкой и т.д. Но в принципе, можно использовать на любом варезнике.
Возможности:
1) Фильтрация новостей по буквам латинского алфавита и цифрам. Фильтр по буквам кириллицы производится по фильтру «RUS»
2) Автоматическое добавление первой буквы/цифры названия при добавлении/редактировании новости в поле «Символьный код» (если буква кириллицы – добавляется RUS). При этом производится проверка на невозможность добавления спецсимволов, пробелов и т.д.
Хак тестировался на версиях 8.2 и 7.5 (если в пунктах описания не указано, для какой версии, значит подходит для обеих). Расмотрю варианты локализации для других версий.
Демо: _http://1024kbytes.com
Начнем:
1) Создаем в блокноте файл с именем afilter.php
Копируем в него код
<?php
/*
=====================================================
Алфавитный фильтр
=====================================================
Данный код защищен авторскими правами (kandriy2004@ukr.net, ICQ#271522951)
=====================================================
Файл: afiltr.php
----------------------------------------------------------
Назначение: Создание алфавитного списка
=====================================================
*/
if(!defined('DATALIFEENGINE'))
{
die("Hacking attempt!");
}
$alphafilter = '<TABLE cellSpacing=0 cellPadding=0 width=100%><TR><td align = "center">';
$alphafilter .= '<a href="http://'.$_SERVER['HTTP_HOST'].'/catalog/RUS/">RUS</a> ';
for ($i = 97; $i <= 122; $i++)
{
$alphafilter .= '<a href="http://'.$_SERVER['HTTP_HOST'].'/catalog/'.chr($i).'/">'.chr($i).'</a> ';
}
$alphafilter .= ' ';
for ($i = 0; $i <= 9; $i++)
{
$alphafilter .= '<a href="http://'.$_SERVER['HTTP_HOST'].'/catalog/'.$i.'/">'.$i.'</a> ';
}
$alphafilter .= '</td></tr></TABLE>';
$tpl->load_template('afilter.tpl');
$tpl->set('{alphafilter}', $alphafilter);
$tpl->compile('afilter');
$tpl->set('{afilter}', $tpl->result['afilter']);
?>
2) Копируем только что созданый afilter.php в /engine/moduls
3) Открываем /engine/moduls/functions.php, находим строчку
?>
и ВЫШЕ ее вставляем код:
function GetSymbolKod($title){
$res = '000';
$title = strtolower(ltrim($title));
if (preg_match("/[a-zA-Zа-яА-Я0-9]/", $title, $out_arr ))
{
if (preg_match("/[a-zA-Z0-9]/", $out_arr[0])) $res = $out_arr[0];
if (preg_match("/[а-яА-Я]/", $out_arr[0])) $res = "RUS";
}
return $res;
}
4) Открываем /engine/inc/include/functions.inc.php (в ранних версиях может быть в /engine/inc/functions.inc.php)
?>
и ВЫШЕ вставляем код:
function GetSymbolKod($title){
$res = '000';
$title = strtolower(ltrim($title));
if (preg_match("/[a-zA-Zа-яА-Я0-9]/", $title, $out_arr ))
{
if (preg_match("/[a-zA-Z0-9]/", $out_arr[0])) $res = $out_arr[0];
if (preg_match("/[а-яА-Я]/", $out_arr[0])) $res = "RUS";
}
return $res;
}
5) (для версти 8.2)
Открываем /engine/moduls/addnews.php, находим ПЕРВОЕ вхождение:
if( $found ) {
и ВЫШЕ вставляем код:
/********* afilter ***********************/
$catalog_url = GetSymbolKod($title);
/********* !afilter **********************/
5) (для версии 7.5)
Открываем /engine/moduls/addnews.php, находим строку
$symbol = $title[0];
ВПЕРЕДИ (не выше, а именно спереди строки) нее ставим «//» (без кавычек), а НИЖЕ вставляем код:
$symbol = GetSymbolKod($title);
Далее находим часть строки:
symbol='ABC'
и ЗАМЕНЯЕМ на:
symbol='$symbol'
Опять находим часть строки:
'III'
и ЗАМЕНЯЕМ на:
'$symbol'
6) Открываем /engine/inc/addnews.php и находим строку:
$catalog_url =
ВПЕРЕДИ (не выше, а именно спереди строки) нее ставим «//» (без кавычек), а НИЖЕ вставляем код:
/********* afilter ***********************/
$catalog_url = GetSymbolKod($title);
/********* !afilter **********************/
7) Открываем /engine/inc/editnews.php и находим строку:
$catalog_url =
ВПЕРЕДИ (не выше, а именно спереди строки) нее ставим «//» (без кавычек), а НИЖЕ вставляем код:
/********* afilter ***********************/
$catalog_url = GetSymbolKod($title);
/********* !afilter **********************/
Хак имеет шаблон. Это для того, чтобы каждый мог сделать внешний вид фильтра по своему усмотрению. По умолчанию (то, что предложу я), подойдет большинству ибо простой и использует стиль спидбара (speedbar). Менять можно по своему усмотрению :-)
Итак, все просто:
8) В блокноте создаем файл afilter.tpl
В него копируем код:
<noindex>
<DIV class="afilter">{alphafilter}</DIV>
</noindex>
Кстати, тэг можно и убрать :-)
9) Копируем только что созданный файл в /templates/ваш_шаблон.
Как видно из шаблона, я использую стиль "afilter". Чтоб долго не думать, как шаблон сделать подходящим к общему стилю сайта, я взял и скопировал класс спидбара (speedbar) и назвал его afilter (хотя можно еще проще – в шаблоне указать класс speedbar – но это чревато последствиями…).
Делал это так.
10) Открываем файл /templates/ваш_шаблон/css/style.css и ишем строку с описанием стиля «.speedbar», «.speedbar a» и «.speedbar a:hover» . У меня это выглядит так:
.speedbar {
color: #727272;
font-size: 11px;
font-family: tahoma;
padding-left: 6px;
}
.speedbar a {
color: #0574D3;
text-decoration:none;
}
.speedbar a:hover {
text-decoration: underline;
color: #0574D3;
}
Скопируйте этот код в самый конец файла, только замените название speedbar на afilter и добавьте
font-size: 11px;
к «.speedbar a» и «.speedbar a:hover» стилям.
Вот что у меня получилось:
.afilter {
color: #727272;
font-size: 11px;
font-family: tahoma;
padding-left: 6px;
}
.afilter a {
color: #0574D3;
font-size: 11px;
text-decoration:none;
}
.afilter a:hover {
text-decoration: underline;
color: #0574D3;
font-size: 11px;
}
11) Копируем только что отредактированный файл style.css обратно в /templates/ваш_шаблон/css/
Это мое видение шаблона :-). Повторяю – Вы же можете шаблон замутить, как надо именно Вам.
12) Предпоследний шаг.
Берем /templates/ваш_шаблон/main.tpl, находим строку {speedbar}. А тут как хотите – выше или ниже этой строки ставите тэг {afilter}. У меня на скриншоте – тэг выше {speedbar}.
13) И последнее - подключим наш Хак к сайту:
Открываем файл index.php, находим строчку
require_once ROOT_DIR . '/engine/init.php';
и НИЖЕ вставляем код:
//***************** afilter *************************
require_once ROOT_DIR.'/engine/modules/afilter.php';
//***************** afilter *************************
14) И еще один важный момент.
Т.к. поле «Символьный код» в новости, значение которого участвует в фильтре , заполняется автоматически только при add/edit новости, то у всех предыдущих новостей поле будет пустым (или заполненный не так, как нам надо). Решения есть два:
1) пересохранить все новости (надо потратить много времени)
2) запустить скрипт, который автоматом все правильно исправит (времени не надо тратить. Кому этот вариант ближе - пишите на мыло, ICQ271522951, в личку)
Удачи!
P.S. Есть готовое решение Хака, в котором реализована фильтрация в том числе и по буквам кириллицы. Кому интересно - пишите на мыло, icq271522951, в личку.