Скрыть объявление
ВАШИ ПРАВА ОГРАНИЧЕНЫ!

Зарегистрируйтесь на форуме, чтобы стать полноценным участником сообщества!

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

Тема в разделе "Вопросы- ответы", создана пользователем MaHarder, 5 окт 2015.

05.10.15 в 19:17
09.01.17 в 19:02
19
3.935
0
  1. TopicStarter Overlay
    MaHarder

    MaHarder Местный

    Регистрация:
    9 июн 2015
    Сообщения:
    1.054
    Лучших ответов:
    0
    Рейтинги:
    +333 / 0 / -0
    Ребят, в сети нашёл некое подобие автоматического алфавитного меню из базы.
    вот, что есть:
    в файл 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>
    Вся суть проблемы в том, что неверно алфабетизирует русскоязычные названия.
    видно лишь это:
    [​IMG]
    все тайтлы идут под один спойлер, нежели под буквенный.

    судя по всему, этот код ответственен за вывод меню
    Код:
    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' );
               
               
            }
    Уже не в первой прошу помощи с этим кодом, пока никак не решилось
     
  2. TopicStarter Overlay
    MaHarder

    MaHarder Местный

    Регистрация:
    9 июн 2015
    Сообщения:
    1.054
    Лучших ответов:
    0
    Рейтинги:
    +333 / 0 / -0
    забыл указать, всё в UTF-8
     
  3. Marek

    Marek Бывалый

    Регистрация:
    14 июн 2015
    Сообщения:
    250
    Лучших ответов:
    0
    Рейтинги:
    +64 / 0 / -0
    Наверное все дело в этом if ($id == '0-9' OR $id == 'A-Z') тут только цифры и англ буквы поэтому так себя ведет не силен в программировании но для русского наверное будет вот так if ($id == '0-9' OR $id == 'A-Z' OR $id == 'А-Я')
     
  4. Marek

    Marek Бывалый

    Регистрация:
    14 июн 2015
    Сообщения:
    250
    Лучших ответов:
    0
    Рейтинги:
    +64 / 0 / -0
    Ой сори затупил вроде код должен быть так гарантию не даю
    /*Меню алфавитное*/

    $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);
     
  5. Marek

    Marek Бывалый

    Регистрация:
    14 июн 2015
    Сообщения:
    250
    Лучших ответов:
    0
    Рейтинги:
    +64 / 0 / -0
    Только тут есть маленький недочет если название новости будет с маленькой то будет глючить тут нужно добавлять условие
     
  6. Marek

    Marek Бывалый

    Регистрация:
    14 июн 2015
    Сообщения:
    250
    Лучших ответов:
    0
    Рейтинги:
    +64 / 0 / -0
    И если новость с маленькой буквы вместо большой то этот код должен раскидать все правильно
    /*Меню алфавитное*/

    $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 Если все работает то отпишись чтоб потом другие не гадали
     
    • Нравится Нравится x 1
  7. TopicStarter Overlay
    MaHarder

    MaHarder Местный

    Регистрация:
    9 июн 2015
    Сообщения:
    1.054
    Лучших ответов:
    0
    Рейтинги:
    +333 / 0 / -0
    Да, так оно отображает, однако, оно не должно все русскоязычные названия под один спойлер кидать, а разбивать по алфавиту.
    я понял в чём проблема, проблема в том, что он видит 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/
     
  8. Marek

    Marek Бывалый

    Регистрация:
    14 июн 2015
    Сообщения:
    250
    Лучших ответов:
    0
    Рейтинги:
    +64 / 0 / -0
    Смотри бока могут быть тут


    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)));
     
    • Нравится Нравится x 1
  9. TopicStarter Overlay
    MaHarder

    MaHarder Местный

    Регистрация:
    9 июн 2015
    Сообщения:
    1.054
    Лучших ответов:
    0
    Рейтинги:
    +333 / 0 / -0
    не, не получается.
     
  10. TopicStarter Overlay
    MaHarder

    MaHarder Местный

    Регистрация:
    9 июн 2015
    Сообщения:
    1.054
    Лучших ответов:
    0
    Рейтинги:
    +333 / 0 / -0
    получается двойная кодировка
     
  11. Marek

    Marek Бывалый

    Регистрация:
    14 июн 2015
    Сообщения:
    250
    Лучших ответов:
    0
    Рейтинги:
    +64 / 0 / -0
    а у тебя сами файлы все в одной кодировке ??
     
  12. TopicStarter Overlay
    MaHarder

    MaHarder Местный

    Регистрация:
    9 июн 2015
    Сообщения:
    1.054
    Лучших ответов:
    0
    Рейтинги:
    +333 / 0 / -0
    да, весь движок и база на утф8. в этом то и проблема, не понимаю - откуда он берёт кодировку cp1251
     
  13. Marek

    Marek Бывалый

    Регистрация:
    14 июн 2015
    Сообщения:
    250
    Лучших ответов:
    0
    Рейтинги:
    +64 / 0 / -0
    и он тоже menu_link.tpl ???
     
  14. Marek

    Marek Бывалый

    Регистрация:
    14 июн 2015
    Сообщения:
    250
    Лучших ответов:
    0
    Рейтинги:
    +64 / 0 / -0
    у меня раз так было провтыкал с файлом шаблона
     
  15. TopicStarter Overlay
    MaHarder

    MaHarder Местный

    Регистрация:
    9 июн 2015
    Сообщения:
    1.054
    Лучших ответов:
    0
    Рейтинги:
    +333 / 0 / -0
  16. x360kg

    x360kg Посетитель

    Регистрация:
    16 июн 2016
    Сообщения:
    76
    Лучших ответов:
    0
    Рейтинги:
    +10 / 2 / -0
    Как в Ваш код можно вывести информацию из дополнительного поля?
     
  17. minoli

    minoli Зелёный

    Регистрация:
    5 ноя 2015
    Сообщения:
    7
    Лучших ответов:
    0
    Рейтинги:
    +0 / 0 / -0
    Что вывести необходимо?
     
  18. x360kg

    x360kg Посетитель

    Регистрация:
    16 июн 2016
    Сообщения:
    76
    Лучших ответов:
    0
    Рейтинги:
    +10 / 2 / -0
    Для примера
    [xfgiven_test]
     
  19. TopicStarter Overlay
    MaHarder

    MaHarder Местный

    Регистрация:
    9 июн 2015
    Сообщения:
    1.054
    Лучших ответов:
    0
    Рейтинги:
    +333 / 0 / -0
    До февраля занят. потом пиши
     
  20. x360kg

    x360kg Посетитель

    Регистрация:
    16 июн 2016
    Сообщения:
    76
    Лучших ответов:
    0
    Рейтинги:
    +10 / 2 / -0
    Если сам разберусь,тут и решение дам
     
Яндекс.Метрика