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.phpby 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 :)