Nakrmte vyhledávače archívy
Webdesign, CMS
05.12.06
Napsal jsem pro BLOG:CMS triviální plugin, který na stránce archívů vypíše abecední seznam všech existujících článků členěných podle skupin kategorií a subkategorií. Je to dobrá „potrava“ pro vyhledávače, a domnívám se, že rovněž pro čtenáře…
Kód pluginu NP_AllItems.php
<?php /** * BLOG:CMS: Personal Content Management System * http://blogcms.com/ * * Radek HULAN, 2006 * http://hulan.cz/ **/ class NP_AllItems extends NucleusPlugin { function getName() { return 'AllItems'; } function getAuthor() { return 'Radek HULAN'; } function getURL() { return 'http://hulan.cz/'; } function getVersion() { return '1.0'; } function getDescription() { return 'This plugin displays all items.'; } function supportsFeature($f) { return ($f == 'SqlTablePrefix') ? 1 : 0; } function doSkinVar($skinType) { global $blog, $catid; $blogid = $blog->getID(); if (intval($catid)) $catfilter = " AND c.catid = $catid "; else $catfilter = ''; $query = sql_query( 'SELECT s.name as catgroup, c.cname as catname, i.inumber AS id, i.ititle AS title, UNIX_TIMESTAMP(itime) AS published '. 'FROM '.sql_table('item').' i, '.sql_table('subcategory').' s, '.sql_table('category').' c '. 'WHERE s.blogid='.$blogid.' AND s.groupid=c.cgroup AND c.catid = i.icat '.$catfilter.' AND i.idraft=0 '. 'ORDER by catgroup, catname, title ASC'); $catgroup = ''; $catname = ''; while ($row = sql_fetch_object($query)) { // category name if ($catname != $row->catname) { if ($catname) echo '</table>'; // category group if ($catgroup != $row->catgroup) { echo '<h4>', htmlspecialchars(sql_unescape($row->catgroup)), '</h4>'; $catgroup = $row->catgroup; } echo '<h5>', htmlspecialchars(sql_unescape($row->catname)), '</h5>'; $catname = $row->catname; echo '<table><tr><th style="width:330px">Článek</th><th style="width:80px">Publikováno</th><th style="width:80px">Čteno</th></tr>'; } // article $viewed = intval(quickQuery('SELECT views as result FROM '.sql_table('plugin_views').' WHERE id='.$row->id)). 'x'; echo '<tr><td><a href="'.createItemLink($row->id).'">', sql_unescape($row->title), '</a></td><td>', date("d.m.y",$row->published), "</td><td>$viewed</td></tr>\n"; } if ($catname) echo "</table>\n"; } } ?>
Radku, proč data vytažená z databáze "unescapuješ", viz volání sql_unescape(...) ?
[1] některé DB to potřebují, je to z důvodu konzistence
Stáhl jsem si BLOGCMS, koukl do zdrojáků, říkám to nerad, ale tvoříš v omylu. Řetězce se escapují, aby je bylo možno zakomponovat jako součást SQL příkazu, ale z databáze se dostávají v čisté podobě. Použití stripslashes() pro MySQL je operace navíc, tj. nikoliv zbytečná, ale kontraproduktivní. Fakt si to vyzkoušej na malém příkladě.
[3] souhlas, v
db.php
by stripslashes() u mysql(i) chtělo dát pryč..Radku, je to hodně dobrý, ale názvy kategorií by mohly být jako odkaz (záložka), abych mohl na nějakou takovou sekci pěkně zaodkazovat a neříkat "sescrolluj dolů".
díky, to vypadá výborně. ještě jsem neměl čas to zkusit implementovat, tak se zeptám rovnou - jak je to s podporou u starších verzí BLOG:CMS?
[6] mělo by stačit to instalovat a na stránce archívů zavolat <%AllItems%>
[7] funguje to, děkuji :)