Редактор темы

Реклама
Реклама
Реклама
Реклама

Помогите правильно доделать алфавитное меню

  • Автор темы Автор темы MaHarder
  • Дата начала Дата начала

MaHarder

Местный
Регистрация
9 Июн 2015
Сообщения
1.054
Рейтинг реакций
288
Баллы
83
Возраст
34
Адрес
Xanten
1/3
Автор темы
Ребят, в сети нашёл некое подобие автоматического алфавитного меню из базы.
вот, что есть:
в файл engine/modules/main.php добавляем это
Код:
/*Меню алфавитное*/
   
$alfa_menu = dle_cache( "menu_for_main", $config['skin'], true );

if ($alfa_menu === FALSE) {
    $serials_alfa = Array();
    $cats = $db->query("SELECT id,date,title,category,alt_name FROM " . PREFIX . "_post ORDER BY title ASC");
    while ($row = $db->get_row($cats)) {
   
        if (ord(substr($row['title'], 0, 1)) >= 48 AND ord(substr($row['title'], 0, 1)) <= 57)
            $symbol = "0-9";
        elseif ((ord(strtoupper(substr($row['title'], 0, 1))) >= 65) AND (ord(strtoupper(substr($row['title'], 0, 1))) <= 90))
            $symbol = "A-Z";
        else
            $symbol = ord(substr($row['title'], 0, 1));
           
        $serials_alfa[$symbol][$row['id']] = $row;
    }

    $tpl1 = new dle_template();
    $tpl1->dir = TEMPLATE_DIR;
    $tpl1->load_template( 'menu_block.tpl' );

    foreach ($serials_alfa as $id => $array) {
       
        if ($id == '0-9' OR $id == 'A-Z')
            $tpl1->set("{symbol}", $id);
        else
            $tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));
           
        $tpl1->set("{col}", count($array));
       
        $tpl12 = new dle_template();
        $tpl12->dir = TEMPLATE_DIR;
        $tpl12->load_template( 'menu_link.tpl' );
       
        foreach ($array as $key => $info) {

            $link = $config['http_home_url'] .$info['id']."-". $info['alt_name'] . ".html";
           
            $tpl12->set( '[full-link]', "<a href=\"" . $link . "\">" );
            $tpl12->set( '[/full-link]', "</a>" );   
            $tpl12->set( '{name}', $info['title'] );
            $tpl12->set( '{alt_name}', $info['metatitle'] );
            $tpl12->set( '{id}', $info['id'] );
            $tpl12->compile( 'menu_links' );
           
           
        }
       
        $tpl1->set("{menu_links}", $tpl12->result['menu_links']); unset($tpl12);
        $tpl1->compile( 'alfa_menu' );
    }
   
    $alfa_menu = $tpl1->result['alfa_menu']; unset($tpl1);
    create_cache( "menu_for_main", $alfa_menu, $config['skin'], true );
   
}   
    $tpl->set("{menu}", $alfa_menu);
в шаблон вставляю тег { menu }

вот содержание файлов шаблонов:
menu_block.tpl
Код:
<div class="panel panel-default">
    <div class="panel-heading" role="tab" id="{symbol}">
      <h4 class="panel-title">
        <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapse{symbol}" aria-expanded="false" aria-controls="collapse{symbol}">{symbol}<span class="badge">(фильмов: {col})</span></a>
      </h4>
    </div>
    <div id="collapse{symbol}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="{symbol}">
      <div class="panel-body">
            <ul class="menu_2">
                {menu_links}
            </ul>
        </div>
    </div>
  </div>

menu_link.tpl

Код:
<li>
    [full-link]{name}[/full-link]
</li>
Вся суть проблемы в том, что неверно алфабетизирует русскоязычные названия.
видно лишь это:
fb02a470af3c9ee413cbf7bfb7ea9d79.png

все тайтлы идут под один спойлер, нежели под буквенный.

судя по всему, этот код ответственен за вывод меню
Код:
foreach ($serials_alfa as $id => $array) {
       
        if ($id == '0-9' OR $id == 'A-Z')
            $tpl1->set("{symbol}", $id);
        else
            $tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));
           
        $tpl1->set("{col}", count($array));
       
        $tpl12 = new dle_template();
        $tpl12->dir = TEMPLATE_DIR;
        $tpl12->load_template( 'menu_link.tpl' );
       
        foreach ($array as $key => $info) {

            $link = $config['http_home_url'] .$info['id']."-". $info['alt_name'] . ".html";
           
            $tpl12->set( '[full-link]', "<a href=\"" . $link . "\">" );
            $tpl12->set( '[/full-link]', "</a>" );   
            $tpl12->set( '{name}', $info['title'] );
            $tpl12->set( '{alt_name}', $info['metatitle'] );
            $tpl12->set( '{id}', $info['id'] );
            $tpl12->compile( 'menu_links' );
           
           
        }

Уже не в первой прошу помощи с этим кодом, пока никак не решилось
 
Автор темы
забыл указать, всё в UTF-8
 
Наверное все дело в этом if ($id == '0-9' OR $id == 'A-Z') тут только цифры и англ буквы поэтому так себя ведет не силен в программировании но для русского наверное будет вот так if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')
 
Ой сори затупил вроде код должен быть так гарантию не даю
/*Меню алфавитное*/

$alfa_menu = dle_cache( "menu_for_main", $config['skin'], true );

if ($alfa_menu === FALSE) {
$serials_alfa = Array();
$cats = $db->query("SELECT id,date,title,category,alt_name FROM " . PREFIX . "_post ORDER BY title ASC");
while ($row = $db->get_row($cats)) {

if (ord(substr($row['title'], 0, 1)) >= 48 AND ord(substr($row['title'], 0, 1)) <= 57)
$symbol = "0-9";
elseif ((ord(strtoupper(substr($row['title'], 0, 1))) >= 65) AND (ord(strtoupper(substr($row['title'], 0, 1))) <= 90))
$symbol = "A-Z";
elseif ((ord(strtoupper(substr($row['title'], 0, 1))) >= 192) AND (ord(strtoupper(substr($row['title'], 0, 1))) <= 223))
$symbol = "А-Я";
else
$symbol = ord(substr($row['title'], 0, 1));

$serials_alfa[$symbol][$row['id']] = $row;
}

$tpl1 = new dle_template();
$tpl1->dir = TEMPLATE_DIR;
$tpl1->load_template( 'menu_block.tpl' );

foreach ($serials_alfa as $id => $array) {

if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')
$tpl1->set("{symbol}", $id);
else
$tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));

$tpl1->set("{col}", count($array));

$tpl12 = new dle_template();
$tpl12->dir = TEMPLATE_DIR;
$tpl12->load_template( 'menu_link.tpl' );

foreach ($array as $key => $info) {

$link = $config['http_home_url'] .$info['id']."-". $info['alt_name'] . ".html";

$tpl12->set( '[full-link]', "<a href=\"" . $link . "\">" );
$tpl12->set( '[/full-link]', "</a>" );
$tpl12->set( '{name}', $info['title'] );
$tpl12->set( '{alt_name}', $info['metatitle'] );
$tpl12->set( '{id}', $info['id'] );
$tpl12->compile( 'menu_links' );


}

$tpl1->set("{menu_links}", $tpl12->result['menu_links']); unset($tpl12);
$tpl1->compile( 'alfa_menu' );
}

$alfa_menu = $tpl1->result['alfa_menu']; unset($tpl1);
create_cache( "menu_for_main", $alfa_menu, $config['skin'], true );

}
$tpl->set("{menu}", $alfa_menu);
 
Только тут есть маленький недочет если название новости будет с маленькой то будет глючить тут нужно добавлять условие
 
И если новость с маленькой буквы вместо большой то этот код должен раскидать все правильно
/*Меню алфавитное*/

$alfa_menu = dle_cache( "menu_for_main", $config['skin'], true );

if ($alfa_menu === FALSE) {
$serials_alfa = Array();
$cats = $db->query("SELECT id,date,title,category,alt_name FROM " . PREFIX . "_post ORDER BY title ASC");
while ($row = $db->get_row($cats)) {

if (ord(substr($row['title'], 0, 1)) >= 48 AND ord(substr($row['title'], 0, 1)) <= 57)
$symbol = "0-9";
elseif ((ord(strtoupper(substr($row['title'], 0, 1))) >= 65) AND (ord(strtoupper(substr($row['title'], 0, 1))) <= 90))
$symbol = "A-Z";
elseif ((ord(strtoupper(substr($row['title'], 0, 1))) >= 97) AND (ord(strtoupper(substr($row['title'], 0, 1))) <= 122))
$symbol = "A-Z";
elseif ((ord(strtoupper(substr($row['title'], 0, 1))) >= 192) AND (ord(strtoupper(substr($row['title'], 0, 1))) <= 223))
$symbol = "А-Я";
elseif ((ord(strtoupper(substr($row['title'], 0, 1))) >= 224) AND (ord(strtoupper(substr($row['title'], 0, 1))) <= 255))
$symbol = "А-Я";
else
$symbol = ord(substr($row['title'], 0, 1));

$serials_alfa[$symbol][$row['id']] = $row;
}

$tpl1 = new dle_template();
$tpl1->dir = TEMPLATE_DIR;
$tpl1->load_template( 'menu_block.tpl' );

foreach ($serials_alfa as $id => $array) {

if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')
$tpl1->set("{symbol}", $id);
else
$tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));

$tpl1->set("{col}", count($array));

$tpl12 = new dle_template();
$tpl12->dir = TEMPLATE_DIR;
$tpl12->load_template( 'menu_link.tpl' );

foreach ($array as $key => $info) {

$link = $config['http_home_url'] .$info['id']."-". $info['alt_name'] . ".html";

$tpl12->set( '[full-link]', "<a href=\"" . $link . "\">" );
$tpl12->set( '[/full-link]', "</a>" );
$tpl12->set( '{name}', $info['title'] );
$tpl12->set( '{alt_name}', $info['metatitle'] );
$tpl12->set( '{id}', $info['id'] );
$tpl12->compile( 'menu_links' );


}

$tpl1->set("{menu_links}", $tpl12->result['menu_links']); unset($tpl12);
$tpl1->compile( 'alfa_menu' );
}

$alfa_menu = $tpl1->result['alfa_menu']; unset($tpl1);
create_cache( "menu_for_main", $alfa_menu, $config['skin'], true );

}
$tpl->set("{menu}", $alfa_menu);

PS Если все работает то отпишись чтоб потом другие не гадали
 
Автор темы
Да, так оно отображает, однако, оно не должно все русскоязычные названия под один спойлер кидать, а разбивать по алфавиту.
я понял в чём проблема, проблема в том, что он видит cp1251 кодировку (не знаю откуда она взялась, может изза кириллицы?), но надо её перекодировать в UTF-8.
Я тут подумал, может перенести этот код в энджин и фанкшнс, а в майн просто тег прописать. потому что в фанкшнс я могу добавить это конвертировку
Код:
function CharsetConvert( $id, $to = "auto" ){
            global $config;
              
            $id= stripslashes( $id );
            $charset = mb_detect_encoding( $id, "utf-8,windows-1251" );
            if( $to == "auto" ) $to = $config['charset'];
            if( $charset != $to && $to != "" ) $id = iconv( $charset, $to."//IGNORE", $id );
            return urldecode( $id );
        }
или заюзать имеющуюся
Код:
function convert_unicode($t, $to = 'windows-1251') {

    $to = strtolower( $to );

    if( $to == 'utf-8' ) {
     
        return $t;
 
    } else {

        if( function_exists( 'mb_convert_encoding' ) ) {

            $t = mb_convert_encoding( $t, $to, "UTF-8" );

        } elseif( function_exists( 'iconv' ) ) {

            $t = iconv( "UTF-8", $to . "//IGNORE", $t );

        } else $t = "The library iconv AND mbstring is not supported by your server";
 
    }

    return $t;
}

над этим завтра поразмыслю, пока в эссен буду ехать ))

а так, спасибо, вроде работает: http://sv.maxim-harder.de/
 
Смотри бока могут быть тут


foreach ($serials_alfa as $id => $array) {


if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')

$tpl1->set("{symbol}", $id);

else

$tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));


$tpl1->set("{col}", count($array));


$tpl12 = new dle_template();

$tpl12->dir = TEMPLATE_DIR;

$tpl12->load_template( 'menu_link.tpl' );


А точнее тут:


if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')

$tpl1->set("{symbol}", $id);

else

$tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));



Я думаю что до условия нужно переменную $id перекодировать что то типа этого :


$id = iconv('cp1251', 'utf-8',chr($id));

if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')

$tpl1->set("{symbol}", $id);

else

$tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));
 
Автор темы
Смотри бока могут быть тут


foreach ($serials_alfa as $id => $array) {


if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')

$tpl1->set("{symbol}", $id);

else

$tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));


$tpl1->set("{col}", count($array));


$tpl12 = new dle_template();

$tpl12->dir = TEMPLATE_DIR;

$tpl12->load_template( 'menu_link.tpl' );


А точнее тут:


if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')

$tpl1->set("{symbol}", $id);

else

$tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));



Я думаю что до условия нужно переменную $id перекодировать что то типа этого :


$id = iconv('cp1251', 'utf-8',chr($id));

if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')

$tpl1->set("{symbol}", $id);

else

$tpl1->set("{symbol}", iconv('cp1251', 'utf-8',chr($id)));
не, не получается.
 
Автор темы
а у тебя сами файлы все в одной кодировке ??
 
Автор темы
да, весь движок и база на утф8. в этом то и проблема, не понимаю - откуда он берёт кодировку cp1251
 
и он тоже menu_link.tpl ???
 
у меня раз так было провтыкал с файлом шаблона
 
Как в Ваш код можно вывести информацию из дополнительного поля?
 

Похожие темы Последние темы Популярные темы

Назад
Сверху