1

Тема: Сортировка категорий по алфавиту

Strawberry 1.1.1 (MySQL)
Вообщем хотелось бы зделать такую вещь как сортировка категорий по алфавиту.
Фот есть функция <?=cn_category(); ?> что нужно дописать в файле plugins/etc.php  в разделе функции cn_category , что бы при выводе категорий этой функцией , оно выводило их и сортировало в алфавитном порядке.

Заранее спасибо wink

Вышел 3аяц по нужде и нуждой прилип к тру6е

Re: Сортировка категорий по алфавиту

Apocall-mc, стандартной функцией cn_category лучше этого не делать, так как сортировка по алфавиту смешает вложенность "родительских" и "детских" категорий, да и от нее многое зависит в других частях скрипта.

Лучше написать свою функцию, хоть даже в том же etc.php. Только из спортивного интереса:

global $sql;
foreach($sql->select(array(
'table' => 'categories', 
'orderby' => array('name', 'ASC')
)) as $row) {
echo $row['name'].'<br>';
}

А если вместо

echo $row['name'].'<br>';

написать

echo '<a href="?category='.$row['id'].'">'.$row['name'].'</a><br>';

то еще и ссылки активные будут. Усовершенствуете сами?

3

Re: Сортировка категорий по алфавиту

Да далее справлюсь wink
2ANT-Soft, Огромное вам спасибо wink

Вышел 3аяц по нужде и нуждой прилип к тру6е

4

Re: Сортировка категорий по алфавиту

Apocall-mc, А если в активной ссылке еще сделать так:

echo '<a href="?category='.$row['id'].'">'.$row['name'].' (<?=count_category_entry($crow['id'])</a><br>';

То можно будет увидеть и количество новостей в каждой из категории... lol

Strawberry 1.1.1

Re: Сортировка категорий по алфавиту

Подскажите, как вывести для сортировки по алфавиту детей конкретной категории?


Strawberry 1.1.1. MySQL

Отредактировано DeGe (01 Nov 2009 19:14:27)

Re: Сортировка категорий по алфавиту

DeGe, "дети" выводятся в виде номеров категорий (через запятую) вот этой функцией:

category_get_children($id);

где $id - номер "родительской" категории.

Эта функция задана в файле inc/functions.inc.php. Поколдовав с ней, можно решить вашу задачу.

Только я не понял, что вы имеете в виду под "сортировкой по алфавиту детей конкретной категории"? Конкретизируйте задачу.

Re: Сортировка категорий по алфавиту

smile, Родительская категория Библиотека. Дети этой категории - жанры. По ходу жизни сайта жанры могут добавляться. Поэтому и хотелось сделать вывод по алфавиту, чтобы был порядок.

Re: Сортировка категорий по алфавиту

DeGe, вот так:

$arr = explode(',',category_get_children($id,false)); //$id - номер родительской категории

$cat = array();

for($i = 0; $i<count($arr); $i++) {
    $cat[$arr[$i]] = $categories[$arr[$i]]['name'];
}

asort($cat);
reset($cat); 

Теперь, например, если у вас для категории 8 - Библиотека дочерние категории:

10 - Триллер
11 - Пьеса
12 - Роман
13 - Детектив

То в результате выполнения моего кода, вы получаете массив $cat вида:

[13] => Детектив
[11] => Пьеса
[12] => Роман
[10] => Триллер

Теперь через foreach делайте с ним всё, что хотите. Например, вывод меню:

foreach ($cat as $num => $val) {
    echo '<a href="?category='.$num.'">'.$val.'</a><br>';
}

Оно?

Re: Сортировка категорий по алфавиту

Спасибо big_smile нашел то, что искал  в последнем посте+)

еще чуток доработал чтоб выводилось количество новостей в подкатегории.

foreach ($cat as $num => $val) {echo '<a href="?category='.$num.'">'.$val.'</a>'; ?><?=count_category_entry($num);?>
<br> <? } ?>
Strawberry 1.1.1

Re: Сортировка категорий по алфавиту

global $sql;
foreach($sql->select(array(
'table' => 'categories', 
'orderby' => array('name', 'ASC')
)) as $row) {
echo $row['name'].'<br>';
}

Привет всем, подскажите мне пожалуйста, как вывести по алфавиту только конкретные категории, а не все сразу ?

11

Re: Сортировка категорий по алфавиту

Zerguwa, что значит "конкретные"? Какие именно?

Re: Сортировка категорий по алфавиту

Ну например есть такие категории скажем названные цифрами. 1,2,3,4,5,6,7,8,9.. А мне надо вывести по алфавиту только с 5той по 10 ... Вот я о чём. Спасибо

13

Re: Сортировка категорий по алфавиту

Zerguwa, или через прямой вызов таблицы (как в вашем посте #10):

global $sql;
foreach($sql->select(array(
'table' => 'categories', 
'orderby' => array('name', 'ASC'),
'where' => array('id > 4' , 'and', 'id < 11') //Только нужные категории
)) as $row) {
echo $row['name'].'<br>';
}

Re: Сортировка категорий по алфавиту

global $sql;
foreach($sql->select(array(
'table' => 'categories', 
'orderby' => array('name', 'ASC'),
'where' => array('id > 4' , 'and', 'id < 11') //Только нужные категории
)) as $row) {
echo $row['name'].'<br>';
}

Спасибо за оперативность ) Но есть ещё вопрос, а если я хочу выводить не с 5 по 10тую, а конкретно 4, 6, 11 и 14тую категории !

15

Re: Сортировка категорий по алфавиту

Zerguwa, ну можно было и догадаться! Самый простой вариант:

'id = 4' , 'and', 'id = 6', 'and', 'id = 11' , 'and', 'id = 14'

А посложнее - определить нужные категории массивом и проверять id на соответствие в массиве.

Re: Сортировка категорий по алфавиту

Что-то я пытался и у меня так не вышло ..) Ваше тоже не работает..

'id = 4' , 'and', 'id = 6', 'and', 'id = 11' , 'and', 'id = 14'

Пусто на странице. roll

Отредактировано Zerguwa (15 Sep 2010 19:11:10)

17

Re: Сортировка категорий по алфавиту

Zerguwa, сорри, тормознул! Вместо 'and' нужно было писать 'or'. Ладно, забудьте!

Бонус за мой косяк:

$cat_mas = array('4','6','11','14');

global $sql;
foreach($sql->select(array(
'table' => 'categories', 
'orderby' => array('name', 'ASC'),
'where'  => array('id = ['.join('|', $cat_mas).']') //Только нужные категории
)) as $row) {
echo $row['name'].'<br>';
}

Re: Сортировка категорий по алфавиту

ООО smile) Заработало !!! Спасибо !
И ещё один вопрос Вам. Как сделать, что бы при выводе категории, например пять, в начале показывалось описание этой категории на странице. Сейчас при наведении мышки показывается описание, а хотелось бы в самом начале, перед всем материалом ..)

19

Re: Сортировка категорий по алфавиту

Zerguwa, напоминаю тему топика: "Сортировка категорий по алфавиту" и правило:

Читайте, пожалуйста, правила

  • 2.5. Одна тема должна содержать один вопрос и вопросы, связанные с решением текущего. Не надо создавать одну тему с сотнями вопросов или нахрапом "чтоб тему не создавать" подписывать свой вопрос. Надо! Отдельную тему создавать надо.
  • Re: Сортировка категорий по алфавиту

    Вопрос по теме. У меня все категории состоят из двух слов.. Это имя и фамилия человека. Например Лена Головач. Имя стоит вначале, затем Фамилия. Так вот,  нужно что бы,  категории выводились не по именам а по фамилиям.. Нужно перед выводом как-то поменять местами фамилию и имя. Не подскажете как такое сделать ?...

    21

    Re: Сортировка категорий по алфавиту

    Zerguwa, как я понял, сортироваться категории будут как есть - "Имя Фамилия":

    Лазарь Шлагбаум
    Лена Головач
    Песя Ватман

    а выводиться "Фамилия Имя":

    Шлагбаум Лазарь
    Головач Лена
    Ватман Песя

    Правильно? Неправильно! Фамилии будут уже не по алфавиту, так как сортировка произошла по именам. Далее - как это исправить.

    Начнём с простого. Поменять местами два слова в строке (фамилию и имя) - элементарно. В коде из поста #17 вместо:

    echo $row['name'].'<br>';

    напишите:

    $names = explode(' ', $row['name']);
    echo $names[1].' '.$names[0].'<br>';

    Но если хотите, чтобы сортировалось именно по фамилиям, хотя фамилия является вторым словом в строке, то тогда так:

    $names = explode(' ', $row['name']);
    $names_arr[] = $names[1].' '.$names[0]; //Не выводим, а добавляем в массив
    } //Это конец вашего цикла foreach
    
    //А уже за циклом сортируем
    sort($names_arr);
    
    //И выводим
    for($i = 0; $i<count($names_arr); $i++) {
      echo $names_arr[$i].'<br>';
    }

    Вот и получится:

    Ватман Песя
    Головач Лена
    Шлагбаум Лазарь

    И, естественно, строка:

    'orderby' => array('name', 'ASC'),

    теряет смысл, поэтому её нужно убрать.

    Re: Сортировка категорий по алфавиту

    $names = explode(' ', $row['name']);
    $names_arr[] = $names[1].' '.$names[0]; //Не выводим, а добавляем в массив
    } //Это конец вашего цикла foreach
    
    //А уже за циклом сортируем
    sort($names_arr);
    
    //И выводим
    for($i = 0; $i<count($names_arr); $i++) {
      echo $names_arr[$i].'<br>';
    }

    Спасибо конечно вам Огромное. Но как это соединить с

    $cat_mas = array('4','6','11','14');
    
    global $sql;
    foreach($sql->select(array(
    'table' => 'categories', 
    'orderby' => array('name', 'ASC'),
    'where'  => array('id = ['.join('|', $cat_mas).']') //Только нужные категории
    )) as $row) {
    echo $row['name'].'<br>';
    }

    Буду благодарен вам, если подскажете ..)

    23

    Re: Сортировка категорий по алфавиту

    Zerguwa, прикалываетесь, да?

    $cat_mas = array('4','6','11','14');
    $names_arr = array();
    
    global $sql;
    foreach($sql->select(array(
    'table' => 'categories', 
    'where'  => array('id = ['.join('|', $cat_mas).']') //Только нужные категории
    )) as $row) {
    
    $names = explode(' ', $row['name']); //Разбиваем строку на "Имя" и "Фамилию"
    $names_arr[] = $names[1].' '.$names[0]; //Меняем местами "Фамилию" и "Имя"
    
    }
    
    //Сортируем
    sort($names_arr);
    
    //Выводим
    for($i = 0; $i<count($names_arr); $i++) {
      echo $names_arr[$i].'<br>';
    }

    Re: Сортировка категорий по алфавиту

    Огромное спасибо ! Теперь только осталось вывести их в ссылках ...

      echo '<a href="?category='.$row['id'].'">'.$names_arr[i].'</a><br>';
    }

    Так не получается... ((

    25

    Re: Сортировка категорий по алфавиту

    Zerguwa, это потому что:

    Во-первых, вы пропустили символ $ перед i в квадратных скобках:

    $names_arr[$i]

    Во-вторых, массив $row['id'] за пределами цикла foreach потерялся. Натолкну на мысль, дальше сами. Должны же вы самостоятельно думать, в конце концов?! Нам нужен двумерный массив:

    $names_arr['names'][] = $names[1].' '.$names[0]; //Меняем местами "Фамилию" и "Имя"
    $names_arr['id'][] = $row['id']; //Запоминаем id категории

    Потом сортируете массив $names_arr по полю ['names'].
    Потом выводите так:

    echo '<a href="?category='.$names_arr['id'][$i].'">'.$names_arr['names'][$i].'</a><br>';

    Вообще-то, всё было бы намного проще, если бы вы в базе данных вместо "Имя Фамилия" сразу бы писали "Фамилия Имя" и не понадобилось бы столько геморроя!