Ja, das kann man schon nutzen. Weil Du aber so forsch nachgefragt hast, habe ich das gerade in Serendipity 0.9 eingebaut.
Um das in 0.8 einzubauen kannst Du mal probieren die klasse serendipity_categories_plugin in der Datei include/plugins_internal.inc.php durch folgendes zu ersetzen:
Code: Select all
class serendipity_categories_plugin extends serendipity_plugin {
var $title = CATEGORIES;
function introspect(&$propbag) {
global $serendipity;
$propbag->add('name', CATEGORIES);
$propbag->add('description', CATEGORY_PLUGIN_DESC);
$propbag->add('stackable', true);
$propbag->add('author', 'Serendipity Team');
$propbag->add('version', '2.0');
$propbag->add('configuration', array('authorid', 'parent_base', 'image', 'sort_order', 'sort_method', 'allow_select', 'hide_parallel', 'show_count', 'smarty'));
$propbag->add('groups', array('FRONTEND_VIEWS'));
}
function introspect_config_item($name, &$propbag)
{
global $serendipity;
switch($name) {
case 'authorid':
$row_authors = serendipity_db_query("SELECT realname, authorid FROM {$serendipity['dbPrefix']}authors");
$authors = array('all' => ALL_AUTHORS);
if (is_array($row_authors)) {
foreach($row_authors as $row) {
$authors[$row['authorid']] = $row['realname'];
}
}
$propbag->add('type', 'select');
$propbag->add('name', CATEGORIES_TO_FETCH);
$propbag->add('description', CATEGORIES_TO_FETCH_DESC);
$propbag->add('select_values', $authors);
$propbag->add('default', 'all');
break;
case 'parent_base':
$categories = array('all' => ALL_CATEGORIES);
$cats = serendipity_fetchCategories();
if (is_array($cats)) {
$cats = serendipity_walkRecursive($cats, 'categoryid', 'parentid', VIEWMODE_THREADED);
foreach($cats as $cat) {
$categories[$cat['categoryid']] = str_repeat(' . ', $cat['depth']) . $cat['category_name'];
}
}
$propbag->add('type', 'select');
$propbag->add('name', CATEGORIES_PARENT_BASE);
$propbag->add('description', CATEGORIES_PARENT_BASE_DESC);
$propbag->add('select_values', $categories);
$propbag->add('default', 'all');
break;
case 'hide_parallel':
$propbag->add('type', 'boolean');
$propbag->add('name', CATEGORIES_HIDE_PARALLEL);
$propbag->add('description', CATEGORIES_HIDE_PARALLEL_DESC);
$propbag->add('default', false);
break;
case 'allow_select':
$propbag->add('type', 'boolean');
$propbag->add('name', CATEGORIES_ALLOW_SELECT);
$propbag->add('description', CATEGORIES_ALLOW_SELECT_DESC);
$propbag->add('default', true);
break;
case 'sort_order':
$select = array();
$select['category_name'] = CATEGORY;
$select['category_description'] = DESCRIPTION;
$select['categoryid'] = 'ID';
$select['none'] = NONE;
$propbag->add('type', 'select');
$propbag->add('name', SORT_ORDER);
$propbag->add('description', '');
$propbag->add('select_values', $select);
$propbag->add('default', 'category_name');
break;
case 'sort_method':
$select = array();
$select['ASC'] = SORT_ORDER_ASC;
$select['DESC'] = SORT_ORDER_DESC;
$propbag->add('type', 'select');
$propbag->add('name', SORT_ORDER);
$propbag->add('description', '');
$propbag->add('select_values', $select);
$propbag->add('default', 'ASC');
break;
case 'image':
$propbag->add('type', 'string');
$propbag->add('name', XML_IMAGE_TO_DISPLAY);
$propbag->add('description', XML_IMAGE_TO_DISPLAY_DESC);
$propbag->add('default', serendipity_getTemplateFile('img/xml.gif'));
break;
case 'smarty':
$propbag->add('type', 'boolean');
$propbag->add('name', CATEGORY_PLUGIN_TEMPLATE);
$propbag->add('description', CATEGORY_PLUGIN_TEMPLATE_DESC);
$propbag->add('default', false);
break;
case 'show_count':
$propbag->add('type', 'boolean');
$propbag->add('name', CATEGORY_PLUGIN_SHOWCOUNT);
$propbag->add('description', '');
$propbag->add('default', false);
break;
default:
return false;
}
return true;
}
function generate_content(&$title) {
global $serendipity;
$smarty = serendipity_db_bool($this->get_config('smarty', false));
$which_category = $this->get_config('authorid');
$sort = $this->get_config('sort_order');
if ($sort == 'none') {
$sort = '';
} else {
$sort .= ' ' . $this->get_config('sort_method');
}
$is_form = serendipity_db_bool($this->get_config('allow_select'));
$categories = serendipity_fetchCategories(empty($which_category) ? 'all' : $which_category, '', $sort);
$title = $this->title;
$cat_count = array();
if (serendipity_db_bool($this->get_config('show_count'))) {
$cat_sql = "SELECT c.categoryid, c.category_name, count(e.id) as postings
FROM {$serendipity['dbPrefix']}entrycat ec,
{$serendipity['dbPrefix']}category c,
{$serendipity['dbPrefix']}entries e
WHERE ec.categoryid = c.categoryid AND ec.entryid = e.id
GROUP BY ec.categoryid, c.category_name
ORDER BY postings DESC";
$category_rows = serendipity_db_query($cat_sql);
if (is_array($category_rows)) {
foreach($category_rows AS $cat) {
$cat_count[$cat['categoryid']] = $cat['postings'];
}
}
}
$html = '';
if (!$smarty && $is_form) {
$html .= '<form action="' . $serendipity['baseURL'] . $serendipity['indexFile'] . '" method="post"><div>';
}
$image = $this->get_config('image', serendipity_getTemplateFile('img/xml.gif'));
$image = (($image == "'none'" || $image == 'none') ? '' : $image);
$use_parent = $this->get_config('parent_base');
$parentdepth = 0;
$hide_parallel = serendipity_db_bool($this->get_config('hide_parallel'));
$hidedepth = 0;
if (is_array($categories) && count($categories)) {
$categories = serendipity_walkRecursive($categories, 'categoryid', 'parentid', VIEWMODE_THREADED);
foreach ($categories as $cid => $cat) {
// Hide parents not wanted
if ($use_parent && $use_parent != 'all') {
if ($parentdepth == 0 && $cat['parentid'] != $use_parent && $cat['categoryid'] != $use_parent) {
continue;
} else {
if ($cat['depth'] < $parentdepth) {
$parentdepth = 0;
continue;
}
if ($parentdepth == 0) {
$parentdepth = $cat['depth'];
}
}
}
// Hide parents outside of our tree
if ($hide_parallel && $serendipity['GET']['category']) {
if ($hidedepth == 0 && $cat['parentid'] != $serendipity['GET']['category'] && $cat['categoryid'] != $serendipity['GET']['category']) {
continue;
} else {
if ($cat['depth'] < $hidedepth) {
$hidedepth = 0;
continue;
}
if ($hidedepth == 0) {
$hidedepth = $cat['depth'];
}
}
}
$categories[$cid]['feedCategoryURL'] = serendipity_rewriteURL(PATH_FEEDS .'/'. PATH_CATEGORIES .'/'. serendipity_makePermalink(PERM_FEEDS_CATEGORIES, array('id' => $cat['categoryid'], 'title' => $cat['category_name'])));
$categories[$cid]['categoryURL'] = serendipity_rewriteURL(PATH_CATEGORIES . '/' . serendipity_makePermalink(PERM_CATEGORIES, array('id' => $cat['categoryid'], 'title' => $cat['category_name'])), 'serendipityHTTPPath');
$categories[$cid]['paddingPx'] = $cat['depth']*6;
if (!empty($cat_count[$cid])) {
$categories[$cid]['true_category_name'] = $cat['category_name'];
$categories[$cid]['category_name'] .= ' (' . $cat_count[$cid] . ')';
}
if (!$smarty) {
$html .= '<div style="padding-bottom: 2px;">';
if ($is_form) {
$html .= '<input style="width: 15px" type="checkbox" name="serendipity[multiCat][]" value="' . $cat['categoryid'] . '" />';
}
if ( !empty($image) ) {
$html .= '<a href="'. $categories[$cid]['feedCategoryURL'] .'"><img src="'. $image .'" alt="XML" style="border: 0px" /></a> ';
}
$html .= '<a href="'. $categories[$cid]['categoryURL'] .'" title="'. htmlspecialchars($cat['category_description']) .'" style="padding-left: '. $categories[$cid]['paddingPx'] .'px">'. htmlspecialchars($categories[$cid]['category_name']) .'</a>';
$html .= '</div>' . "\n";
}
}
}
if (!$smarty && $is_form) {
$html .= '<br /><input type="submit" name="serendipity[isMultiCat]" value="' . GO . '" /><br />';
}
if (!$smarty) {
$html .= sprintf(
'<br /><a href="%s" title="%s">%s</a>',
$serendipity['serendipityHTTPPath'] . $serendipity['indexFile'],
ALL_CATEGORIES,
ALL_CATEGORIES
);
}
if (!$smarty && $is_form) {
$html .= '</div></form>';
}
if (!$smarty) {
echo $html;
} else {
$serendipity['smarty']->assign(array(
'is_form' => $is_form,
'category_image' => $image,
'form_url' => $serendipity['baseURL'] . $serendipity['indexFile'],
'categories' => is_array($categories) ? $categories : array()
));
echo serendipity_smarty_fetch('CATEGORIES', 'plugin_categories.tpl');
}
}
}
Dann noch die Datei plugin_categories.tpl in Dein Templateverzeichnis kippen:
Und dann in der Konfiguration Sarty-Templating und "Count categories" aktivieren. In Deiner Sprachdatei werden ein paar Konstanten fehlen, das sollte aber nicht so tragisch sein.