Ребят, в сети нашёл некое подобие автоматического алфавитного меню из базы. вот, что есть: в файл 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> Вся суть проблемы в том, что неверно алфабетизирует русскоязычные названия. видно лишь это: все тайтлы идут под один спойлер, нежели под буквенный. судя по всему, этот код ответственен за вывод меню Код: 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' ); } Уже не в первой прошу помощи с этим кодом, пока никак не решилось
Наверное все дело в этом 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)));