RSS

zapisz się: RSS Artykuły

szukaj

Podział menu kategorii na sekcje

Komentarze 2

Linki ze spinaczyDzisiejsza modyfikacja ma w sobie duży potencjał. Można dzięki niej podzielić menu kategorii na oddzielne sekcje (obszary). Dzięki temu można tworzyć bardziej rozbudowane menu oparte na kategoriach. Na innej mojej stronie, która opiera się o sNews 1.7 potrzebowałem, aby subkategoria posiadała również subkategorię - 2 poziomy niżej od kategorii. Mod ten w pewien sposób rozwiązał mój problem (jednak, jeśli chcesz w samych kategoriach robić również wpisy to ta modyfikacja może nie spełnić Twoich oczekiwań).

Ok dosyć gadania, czas działać :) Docelowo mod ten stworzył Rui Mendes dla wersji sNews 1.6. Natomiast H.A.C przeniósł go do wersji 1.7. Najpierw robimy oczywiście kopię zapasową plików oraz bazy danych.

Krok 1. Najpierw dodajemy do bazy danych następujący kod (dodawanie do bazy danych zostało omówione we wpisie o instalacji sNews 1.7):

alter table categories add catnumber int(6) default '0';
alter table categories add showcount varchar(4) NOT NULL default 'YES';
alter table categories add showsitemap varchar(4) NOT NULL default 'YES';

Krok 2. W pliku snews.php zamieniamy oryginalną funkcję "categories", czyli zamieniamy kod:

// DISPLAY CATEGORIES
 function categories() {
 global $categorySEF;
 $qwr = !_ADMIN ? ' AND a.visible=\'YES\'' : '';
 if (s('num_categories') == 'on') {
 $count = ', COUNT(DISTINCT a.id) as total';
 $join = 'LEFT OUTER JOIN '._PRE.'articles'.' AS a
 ON (a.category = c.id AND a.position = 1  AND a.published = 1'.$qwr.')';
 } else {
 $count ='';
 $join='';
 }
 $result = mysql_query('SELECT
 c.seftitle, c.name, description, c.id AS parent'.$count.'
 FROM '._PRE.'categories'.' AS c '.$join.'
 WHERE c.subcat = 0 AND c.published = \'YES\'
 GROUP BY c.id
 ORDER BY c.catorder,c.id');
 if (mysql_num_rows($result) > 0){
 while ($r = mysql_fetch_array($result)) {
 $category_title = $r['seftitle'];
 $r['name'] = (s('language')!='EN' && $r['name'] == 'Uncategorized' && $r['parent']==1) ? l('uncategorised') : $r['name'];
 $class = $category_title == $categorySEF ? ' class="current"' : '';
 if (isset($r['total'])) { $num='('.$r['total'].')'; }
 echo '<li><a'.$class.' href="'._SITE.$category_title.'/" title="'.$r['name'].' - '.$r['description'].'">'.$r['name'].$num.'</a>';
 $parent = $r['parent'];
 if ($category_title == $categorySEF) { subcategories($parent); }
 echo '</li>';
 }
 } else {
 echo '<li>'.l('no_categories').'</li>';
 }
 }

na następujący:

// DISPLAY CATEGORIES
   function categories($numcat, $showhome, $showcnt, $start, $size) {
   global $categorySEF;
//Multiple Areas for Categories (MAC) - by Rui Mendes - sNews 1.7 ported by H.A.C (02/01/2009)
   if ($numcat=='') $numcat = 0;
   if ($showhome == ''|| $showhome !='false') $showhome='true'; else $showhome='false';
   if ($showcnt == '' || $showcnt !='false') $showcnt='true'; else $showcnt='false';
   if ($numcat==0 || $showhome=='true') echo '<li><a'.$class.' href="'._SITE.'" title="'.l('home').'">'.l('home').'</a></li>';
   //- MAC
   
   $qwr = !_ADMIN ? ' AND a.visible=\'YES\'' : '';
   //added (showcnt == 'true') - MAC by H.A.C
   if ((s('num_categories') == 'on') AND ($showcnt == 'true')) {
   $count = ', COUNT(DISTINCT a.id) as total';
   $join = 'LEFT OUTER JOIN '._PRE.'articles'.' AS a
   ON (a.category = c.id AND a.position = 1  AND a.published = 1 '.$qwr.')'; 
   } else {
   $count ='';
   $join='';
   }
   //below added AND catnumber=$numcat - MAC
   $result = mysql_query('SELECT
   c.seftitle, c.name, description, c.id AS parent'.$count.'
   FROM '._PRE.'categories'.' AS c '.$join."
   WHERE c.subcat = 0 AND c.catnumber = $numcat AND c.published = \'YES\'
   GROUP BY c.id
   ORDER BY c.catorder,c.id");
   if (!empty($start) && !empty($size)) $query .=" LIMIT $start, $size"; //MAC
   if (mysql_num_rows($result) > 0){
   while ($r = mysql_fetch_array($result)) {
   $category_title = $r['seftitle'];
   $r['name'] = (s('language')!='EN' && $r['name'] == 'Uncategorized' && $r['parent']==1) ? l('uncategorised') : $r['name'];
   $class = $category_title == $categorySEF ? ' class="current"' : '';
   if (isset($r['total'])) { $num='('.$r['total'].')'; }
   echo '<li><a'.$class.' href="'._SITE.$category_title.'/" title="'.$r['name'].' - '.$r['description'].'">'.$r['name'].$num.'</a>';
   $parent = $r['parent'];
   if ($category_title == $categorySEF) { subcategories($parent); }
   echo '</li>';
   }
   } else {
   echo '<li>'.l('no_categories').'</li>';
   }
   }

Krok 3. Dodajemy do funkcji "sitemap" zaznaczoną linijkę:

 $cat_query = 'SELECT id, name, seftitle, description, subcat
      FROM '._PRE.'categories'.'
      WHERE published = \'YES\'
         AND subcat = 0
         AND showsitemap = \'YES\'
         ORDER BY catorder,id';

Krok 4. W funkcji "form_categories" dodajemy poniżej zaznaczone fragmenty:

function form_categories($subcat='cat') {
   if (isset($_GET['id']) && is_numeric($_GET['id']) && !is_null($_GET['id'])) {
      $categoryid = $_GET['id'];
      $query = mysql_query('SELECT id,name,seftitle,published,description,subcat,catorder,catnumber,showsitemap, showcount FROM '._PRE.'categories'.' WHERE id='.$categoryid);

....

$frm_description = $r['description'];
$frm_publish = $r['published'] == 'YES' ? 'ok' : '';
$frm_numcat = $r['catnumber'];
$frm_showsitemap = $r['showsitemap'] == 'YES' ? 'ok' : '';
$frm_showcount = $r['showcount'] == 'YES' ? 'ok' : '';

....

$frm_description = '';
$frm_publish = 'ok';
$frm_numcat = 0;
$frm_showsitemap = 'ok';
$frm_showcount = 'ok';

....

$publish = $subcat == 'cat' ? l('publish_category') : l('publish_subcategory');
echo html_input('checkbox', 'publish', 'pub', 'YES', $publish, '', '', '', '', $frm_publish, '', '', '', '', '');
echo html_input('text', 'cat_num', 'catnum', $frm_numcat, l('cat_num'), '', '', '', '', '', '', '', '', '', '');
echo html_input('checkbox', 'showcount', 'scnt', 'YES', l('show_count'), '', '', '', '', $frm_showcount, '', '', '', '', '');
echo html_input('checkbox', 'showsitemap', 'ssm', 'YES', l('show_sitemap'), '', '', '', '', $frm_showsitemap, '', '', '', '', '');

Krok 5. Następnie przechodzimy do funkcji "processing", w której dodajemy zaznaczone fragmenty:

$show_on_home = ($_POST['show_on_home'] == 'on' || $position > 1) ? 'YES' : 'NO';
$publish_category = $_POST['publish'] == 'on' ? 'YES' : 'NO';
$catnumber = $_POST['cat_num'];
$showsitemap = $_POST['showsitemap'] == 'on' ? 'YES' : 'NO';
$showcount = $_POST['showcount'] == 'on' ? 'YES' : 'NO';

....

switch(true) {
   case(isset($_POST['add_category'])):
      $catorder = mysql_fetch_array(mysql_query(
         "SELECT MAX(catorder) as max
         FROM "._PRE.'categories'." WHERE subcat = $subcat"));
      $catorder = $catorder['max'] + 1;
      mysql_query("INSERT INTO "._PRE.'categories'."
         (name, seftitle, description, published, catorder, subcat, catnumber, showcount, showsitemap)
         VALUES('$name', '$seftitle', '$description', '$publish_category', '$catorder','$subcat', '$catnumber', '$showcount', '$showsitemap')");
      break;
   case(isset($_POST['edit_category'])):
      $catorder = mysql_fetch_array(mysql_query(
         "SELECT MAX(catorder) as max
         FROM "._PRE.'categories'." WHERE subcat = $subcat"));
      $catorder = isset($_POST['catorder']) ? $_POST['catorder'] : $catorder['max'] + 1;
      mysql_query("UPDATE "._PRE.'categories'." SET
         name = '$name',
         seftitle = '$seftitle',
         description = '$description',
         published = '$publish_category',
         subcat='$subcat',
         catorder='$catorder',
         catnumber ='$catnumber',
         showcount = '$showcount',
         showsitemap ='$showsitemap'
         WHERE id = $id LIMIT 1");
      break;

Krok 6. Na koniec dodajemy do pliku języka PL.php 3 poniższe linijki:

$l['cat_num'] = 'Obszar kategorii';
$l['show_count'] = 'Pokaż ilość artykułów w kategorii';
$l['show_sitemap'] = 'Pokaż w mapie strony';

Zrzut ekranu - edycja kategorii w sNews 1.7 (nowe opcje)To właściwie koniec modyfikacji. Teraz można przejść do użycia moda. Dodając lub edytując kategorie mamy teraz dodatkowe opcje. W polu "Obszar kategorii" wpisujemy numer od 1 wzwyż. Wszystkie kategorie z tym samym numerem będą należały do tego samego obszaru (sekcji). Oprócz tego mamy opcję "Pokaż ilość artykułów w kategorii". Niestety z niewiadomych mi powodów zaznaczenie bądź odznaczenie tej opcji nie działa w żaden sposób. Jednak jest możliwość dodania liczby artykułów, ale o tym będzie dalej. Jest jeszcze opcja "Pokaż w mapie strony". Opcja ta działa i w zależności od zaznaczenia lub nie dana kategoria, jej subkategorie i artykuły są wyświetlane w mapie strony lub nie.

Ok jeśli mamy już podzielone kategorie w obszary to czas na wprowadzenie tych sekcji na stronie. W tym celu należy w index.php dodać odpowiednie sekcje przy pomocy funkcji "categories". Z założenia wpisujemy funkcję "categories" w taki sposób w wybranym przez nas miejscu:

<?php categories(obszar, strona-glowna, ilosc-artykulow, start, ilosc); ?>

gdzie:

  • obszar - tu wpisujemy numer obszaru, jaki ma być wyświetlony;
  • strona-glowna - wpisujemy 'true' jeśli chcemy, aby w tym obszarze był również link do strony głównej; lub wpisujemy 'false' jeśli link do strony głównej ma się nie pojawić;
  • ilosc-artykułow - wpisujemy 'true' jeśli chcemy, aby obok kategorii była wyświetlana ilość artykułów (aby to zadziałało trzeba mieć włączone domyślnie w ustawieniach CMSa "Pokaż liczbę artykułów w kategorii"); lub wpisujemy 'false' jeśli nie chcemy, aby obok kategorii była pokazana ilość artykułów;
  • start - numer pierwszej kategorii (niestety nie wiem dlaczego, ale nie działa ta opcja)
  • ilosc - ile kategorii ma być wyświetlanych w sekcji (również nie działa)

Przykład zastosowania w pliku index.php może być następujący:

<h3>Sekcja 1</h3>
    <ul>
    <?php categories(1,'true','false',1,5); ?>
    </ul>
 <h3>Sekcja 2</h3>
    <ul>
    <?php categories(2,'false','false'); ?>
    </ul>
 <h3>Sekcja 3</h3>
    <ul>
    <?php categories(3,'false','false'); ?>
    </ul>

Zrzut ekranu - menu kategorii podzielone na sekcjeW tym wypadku przy pierwszej wywołanej funkcji "categories" będą wyświetlane tylko kategorie z obszaru o numerze 1. Kolejno wartość 'true' oznacza, że będzie również wyświetlany odnośnik do strony głównej. Następnie 'false' oznacza, że nie będzie wyświetlana ilość artykułów obok kategorii. Kolejne dwie cyfry docelowo powinny sprawić, że będą wyświetlane kategorie od 1 do 5 w tej sekcji. Niestety wyświetlane są wszystkie.

W przypadku drugiego wywołania funkcji różnica jest taka, że będą wyświetlane kategorii z obszaru nr 2 oraz nie będzie wyświetlany link do strony głównej. W trzecim wypadku będzie podobnie jak w drugim, z tym, że będą wyświetlane kategorie z obszaru nr 3.

Pomimo niedziałających niektórych opcji mod ten jest bardzo przydatny. Opcja "start" i "ilość" nie są właściwie niezbędne. Wystarczy dodać odpowiednie obszary do kategorii, które chcemy, aby były wyświetlane.

Podziel się

Bookmark and Share

  1. sekol
    sekol napisał(a):

    w funkcji categories zamiast:

    c.catnumber = $numcat
    powinno byc:

    c.catnumber = '.$numcat.'

    fajna modyfikacja tak w ogole :-)

  2. Paweł Landzberg
    Paweł Landzberg napisał(a):

    Chyba raczej nie... U mnie działa tak, jak jest.

Komentowanie zostało zablokowane