Тема: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Задача: В админцетре Strawberry выводить для редактирования список новостей только из определенной категории.

Решение: В моде inc/mod/editnews.mdu 109-ю строку

$cat_arr[] = $categories[$cat]['name'];

заменить на эту

$cat_arr[] = '<a href="?mod=editnews&category='.$categories[$cat]['id'].'">'.$categories[$cat]['name'].'</a>';

В админке в режиме "Редактировать" названия категорий становятся ссылками. При нажатии на название категории в таблице, появится список новостей только из этой категории. Вывод всех категорий достигается нажатием на заголовок колонки "Категория".

Применение: Этим же методом можно выводить список только определенных авторов или только за определенную дату.

Автор: ANT-Soft (идея ifa и еще около двадцати посетителей форума)

2

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Очень нужный для меня мод, но он полностью не решает задачу, так как, если новостей по одной категории много, то, чтобы найти названия других категорий, нужно все равно листать страницы в админке (а страниц новостей у меня уже 54).

Как бы сделать так, чтоб выводился список всех категорий (например внизу страницы админки) в виде активных ссылок, а по кликанию на категорию выводились бы все ее новости?
ОЧЕНЬ НУЖНО! Помогите!

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Галина Б., исключительно только для вас! В файле inc/mod/editnews.mdu самой первой прописана функция function makeList(... Замените ее на эту (долго объяснять, что именно заменить, поэтому замените полностью):

function makeList($array, $every = 0){
global $mod, $categories;
static $i, $result;

    if ($i > 1){
        $result = '';
    }

    foreach ($array as $k => $v){
        if (is_array($v)){
            $i--;
            $result .= '<tr '.cute_that().'>';
            makeList($v, $every, $null);
        } else {
            $result .= (($every and $k%$every == 0) ? '<tr>' : '');
            $result .= '<td><nobr>'.$v.'</nobr></td>';
        }
    }

    $i++;

$dop_table .='<p><b><a href="?mod=editnews">Все категории</a></b> | ';
for ($jj=0; $jj<count($categories); $jj++) {
if ($categories[$jj]['name']) {$dop_table .= '<a href="?mod=editnews&category='.$categories[$jj]['id'].'">'.$categories[$jj]['name'].'</a> | ';}
}
$dop_table .= '</p>';

return '<table id="'.$mod.'" name="'.$mod.'" width="100%">'.$result.'</table>'.$dop_table;
}

// ********************************************************************************

(строку // *****... в конце я ввел, чтобы вы увидели до какого места нужно менять текст функции). В режиме редактирования после списка новостей вы увидите список категорий в виде:

Все категории | Категория 1 |  Категория 2 |  Категория 3 | ...

причем категории будут ссылками. Это то, что нужно?

Можно было бы конечно поупражняться, чтобы список категорий выводился в более удобоваримом виде, например: в виде выпадающего списка, в виде дерева с вложенностью категорий, и т.д. Но думаю для начала достаточно.

4

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

To ANT-Soft
Если новостей в категории больше, чем выводится на страницу, то при переходе на следующую страницу категория не передается. Вопрос - в каком направлении копать чтобы категория передавалась?

Strawberry 1.1.1 MySQL

Я не крутой ...
... я только учусь!

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Hunter Alex, копать в направлении нумерации страниц. В этом же файле найти строку, содержащую t('След. &gt;&gt;') и где-то там прикрутить

'&category='.$category.

6

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

ANT-Soft пишет:

Hunter Alex, копать в направлении нумерации страниц. В этом же файле найти строку, содержащую t('След. &gt;&gt;') и где-то там прикрутить

'&category='.$category.

Благодарю за подсказку. Но пришлось подправить еще один кусок выше.

for ($i = 1; $i <= $pages_count; $i++){
            if ($pages_skip != $skip){
                $pages[] = '<a href="'.$PHP_SELF.'?mod=editnews&order='.$order.'&by='.$by.'&skip='.$pages_skip.'">'.$i.'</a>';

заменить на

for ($i = 1; $i <= $pages_count; $i++){
            if ($pages_skip != $skip){
     $pages[] = '<a href="'.$PHP_SELF.'?mod=editnews&category='.$category.'&order='.$order.'&by='.$by.'&skip='.$pages_skip.'">'.$i.'</a>';

и кусок

 if ($pages_count > 1){
            $pages = ($skip ? '<a href="'.$PHP_SELF.'?mod=editnews&order='.$order.'&by='.$by.'&skip='.($skip - $number).'">'.t('&lt;&lt; Пред.').'</a> ' : '').'[ '.join(' ', $pages).' ]'.((($pages_skip - $number) - $skip) ? ' <a href="'.$PHP_SELF.'?mod=editnews&order='.$order.'&by='.$by.'&skip='.($skip + $number).'">'.t('След. &gt;&gt;').'</a> ' : '');

на

if ($pages_count > 1){
$pages = ($skip ? '<a href="'.$PHP_SELF.'?mod=editnews&category='.$category.'&order='.$order.'&by='.$by.'&skip='.($skip - $number).'">'.t('&lt;&lt; Пред.').'</a> ' : '').'[ '.join(' ', $pages).' ]'.((($pages_skip - $number) - $skip) ? ' <a href="'.$PHP_SELF.'?mod=editnews&category='.$category.'&order='.$order.'&by='.$by.'&skip='.($skip + $number).'">'.t('След. &gt;&gt;').'</a> ' : '');
Я не крутой ...
... я только учусь!

7

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

ANT-Soft, позвольте поравить небольшую ошибочку...
В измененной функции function makeList(...

for ($jj=0; $jj<count($categories); $jj++) {

надо заменить на

for ($jj=0; $jj<=count($categories); $jj++) {

а то выводится список категорий на одну меньше, чем их есть на самом деле...

8

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Поработав немного напильником и мозгами (непонятно чем больше smile) реализовал вывод по вложенности

$dop_table .='<table border=0 cellpadding=0 cellspacing=0><tr><td align=left><b><a href="?mod=editnews">Все категории</a></b></td></tr>';
$dop_table .= '<tr><td>';
for ($jj=0; $jj<=count($categories); $jj++){
if ($categories[$jj]['level'] == '0'){
$jcat = '';
if ($categories[$jj]['id'] == $_GET['category']) {$jcat = 'red';}
$dop_table .= '&#8226;&nbsp;<a href="?mod=editnews&category='.$categories[$jj]['id'].'" style="color:'.$jcat.'"><b>'.$categories[$jj]['name'].'</b></a>&nbsp;&nbsp;';
 }}
$dop_table .= '</td></tr><tr><td>&nbsp;&nbsp;';
for ($jj=0; $jj<=count($categories); $jj++){
if ($categories[$jj]['level'] == '1' and $categories[$jj]['parent'] == $_GET['category']){
$dop_table .= '&#8226;&nbsp;<a href="?mod=editnews&category='.$categories[$jj]['id'].'">'.$categories[$jj]['name'].'</a>&nbsp;&nbsp;';
}}
$dop_table .= '</td></tr></table>';

Чувствую можно изящнее сделать, но ... Мысль крутится, а я ее никак не могу ухватить ...

Я не крутой ...
... я только учусь!

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Вижу тоже нашел ошибку в выводом последней категории, точнее она не выводилась...

for ($jj=0; $jj<=count($categories); $jj++)

Я добавил ко всему скрипту такую фитчу, что б при нажатии сортировки и других номеров страниц, мы не слетали с выбранной категории. Вроде уже выкладывал...


Вот исходная версия с твоими идеями. Тока гораздо упрощено... smile Оформление отличается, но смысл тот же...

$dop_table .='<p><a href="?mod=editnews"><b>Все категории</b></a>';
for ($jj=0; $jj<=count($categories); $jj++) {
if ($categories[$jj]['id'] == $_GET['category']) {$selcat[$categories[$jj]['id']] = 'style="color: green; font-weight: bold;"';}
if ($categories[$jj]['name']) {$dop_table .= ' | <a href="?mod=editnews&amp;category='.$categories[$jj]['id'].'" '.$selcat[$categories[$jj]['id']].'>'.$categories[$jj]['name'].'</a>';}
}
$dop_table .= '</p>';

Отредактировано Miksar (30 Jan 2009 21:17:35)

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

10

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Вопрос: заменил код файла  editnews.mdu для вывода списка всех категорий и исправил строку

for ($jj=0; $jj<=count($categories); $jj++) (чтоб было <= а не <)

но все равно выводит не все категории, а точнее не выводит 2 последние.
дело еще в том что в процессе разработки сайта я создавал и удалял категории и сейчас список категорий имеет вид

#      Название
1      Новости 1        
2     Новости 2   
5     Афиша 1    
6     Афиша 2    
7     Видео
8     Статьи

то есть удалены категории с ID 3 и 4. в админке новостей отображается так:

Все категории | Новости 1 | Новости 2 | Афиша 1 | Афиша 2 |

то есть нет последних 2 категорий.
Вопрос собственно таков: если отсутствие категорий при выводе связано с их ID то можно ли поправить код?

Топорно решил проблему добавлением еще 2 пустых категорий, теперь список категорий такой:

#      Название     
1     Новости 1   
2     Новости 2
5     Афиша 1    
6     Афиша 2
7     Видео    
8     Статьи    
9     Проба    
10     Проба 2

А отображение такое:

Все категории | Новости 1 | Новости 2 | Афиша 1 | Афиша 2 | Видео | Статьи

То есть теперь отображаются все нужные категории а 2 пустых не видно. Но как я уже говорил этот способ уж очень топорный.

Отредактировано Никола (11 Sep 2009 11:02:27)

Есле кних четать ни будиш - скора грамату забудиш!

11

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Никола, count($categories) выводит реальное количество строк в БД-таблице cute_categories. И если у вас нет категорий с номерами 3 и 4, то в таблице всего 6 категорий, следовательно count($categories) выдаст значение 6. Однако, $categories[$jj] (где jj - принимает значения от 1 до 6), пытается вывести категории с id-номерами 1,2,3,4,5,6, игнорируя 7 и 8, но обрабатывая несуществующие 3 и 4.

Решение проблемы - цикл foreach вместо for (исправленный пример из Miksar'овского поста #9):

foreach ($categories as $row) {
    if ($row['id'] == ...
    if ($row['name']) ... 
}

12

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

ANT-Soft Спасибо большое за код цикла, все работает замечательно.

Во время работы с списком категорий возникла такая необходимость:  среди множества новостей на сайте попадаются такие для которых категория не задана (простейший способ скрытия новости от публикации). За время работы сайта скопилось несколько таких "безкатегорных" новостей и они погребены под другими (в базе уже около 3700 новостей за 4 года скопилось). Возникла мысль встроить в имеющийся список категорий выборку именно новостей "без категорий". Логически мысля $post['category']это список из ID категорий. Но если не указана категория то что храниться в переменной? Если пустая строка то как ее искать? Варианты ссылок

href="?mod=editnews&amp;category=""

и

href="?mod=editnews&amp;category=' '

ничего не дают т.е. выводят "Новостей нет". Как быть?

Есле кних четать ни будиш - скора грамату забудиш!

13

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Никола, в админцентре нажмите "Редактировать", появится список новостей. Нажимаете на слово "Категория" (в заголовке колонки), список отсортируется по категориям, причем первыми в списке будут новости без категорий. Всё.

То же самое - в виде кода адресной строки: ?mod=editnews&order=ASC&by=category

14

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

ANT-Soft это да но возможно ли осуществить именно выборку новостей без категорий наподобие выборок новостей с категорией?

Есле кних четать ни будиш - скора грамату забудиш!

15

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Никола, а как вы осуществляете "выборку новостей с категорией"?

16

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

ANT-Soft

href="?mod=editnews&amp;category=IDшник категории 
Есле кних четать ни будиш - скора грамату забудиш!

17

Re: Список новостей заданной категории в админцентре (Strawberry 1.1.1)

Никола, нет, таким же образом не получится, потому что если новости не присвоена категория, то у поля category нет идентификатора, то есть оно пустое. Не помогает даже category= (пусто после знака равенства).

Остаётся только

?mod=editnews&order=ASC&by=category