Dzisiejsza 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';
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:
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>
W 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.
w funkcji categories zamiast:
c.catnumber = $numcat
powinno byc:
c.catnumber = '.$numcat.'
fajna modyfikacja tak w ogole :-)
Chyba raczej nie... U mnie działa tak, jak jest.