Anzahl der Einträge in den Kategorien

Hier können Probleme und alles andere in Deutscher Sprache gelöst werden.
Post Reply
Yvonne Winter

Anzahl der Einträge in den Kategorien

Post by Yvonne Winter »

Hallo,

ich würde ganz gerne hinter den Kategorien in der Sitebar, die Anzahl der Einträge in dieser Kategorie anzeigen lassen. Irgendjemand eine Idee wie?

Gruß Yvonne
http://www.yvonne-winter.de
garvinhicking
Core Developer
Posts: 30022
Joined: Tue Sep 16, 2003 9:45 pm
Location: Cologne, Germany
Contact:

Re: Anzahl der Einträge in den Kategorien

Post by garvinhicking »

Dafür gibt es leider noch keine Option/Plugin, da das zählen alle Einträge sehr viel Performance schluckt...

Theoretisch wäre das von einem PHP/SQL-begabten aber schnell erledigt. Wurde bisher nur noch nie gefordert. :)

Viele Grüße,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
Yvonne Winter

Post by Yvonne Winter »

Bin weder in dem einen noch in dem anderen sonderlich begabt.

Allerdings ist mir gerade aufgefallen das auf der Statistik-Seite im Adminbereich genau sowas angezeigt wird:
Verteilung der Artikel auf Kategorien

Gefragtes
6 eingetragene(r) Artikel
Erlebtes
3 eingetragene(r) Artikel
Sneak
3 eingetragene(r) Artikel
Kann man das nicht irgendwie nutzen?
garvinhicking
Core Developer
Posts: 30022
Joined: Tue Sep 16, 2003 9:45 pm
Location: Cologne, Germany
Contact:

Post by garvinhicking »

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:

Code: Select all

{if $is_form}
<form id="serendipity_category_form" action="{$form_url}" method="post">
    <div id="serendipity_category_form_content">
{/if}

    <ul id="serendipity_categories_list" style="list-style: none; margin: 0px; padding: 0px">
{foreach from=$categories item="plugin_category"}
        <li style="display: block;">
        {if $is_form}    
            <input style="width: 15px" type="checkbox" name="serendipity[multiCat][]" value="{$plugin_category.categoryid}" />
        {/if}
    
        {if !empty($category_image)}
            <a class="serendipity_xml_icon" href="{$plugin_category.feedCategoryURL}"><img src="{$category_image}" alt="XML" style="border: 0px" /></a>
        {/if}

            <a href="{$plugin_category.categoryURL}" title="{$plugin_category.category_description|escape}" style="padding-left: {$plugin_category.paddingPx}px">{$plugin_category.category_name|escape}</a>
        </li>
{/foreach}
    </ul>

{if $is_form}
    <br /><input type="submit" name="serendipity[isMultiCat]" value="{$CONST.GO}" /><br />
{/if}

    <br /><a href="{$form_url}" title="{$CONST.ALL_CATEGORIES}">{$CONST.ALL_CATEGORIES}</a>

{if $is_form}
    </div>
</form>
{/if}
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.

Viele Grüße,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
kho
Regular
Posts: 342
Joined: Fri Mar 04, 2005 8:34 pm

Anzahl Kategorien...

Post by kho »

@Garvin

ich hatte ja auch mal vor einiger Zeit nach einer Möglichkeit gefragt, die Anzahl Einträge pro Kategorie auszugeben...

Ehrlich gesagt kann ich nicht ganz nachvollziehen, wie ich das, was du beschreibst, auch in der von mir eingesetzten Version 0.84 machen kann.

Ich habe den Code in der genannten Datei ersetzt, allerdings weiss ich nicht, was für eine tpl-Datei du meinst mit der plugin_categories.tpl... Soll die Datei neu angelegt werden?

Der Versuch, das nachvollziehen, hat bei mir nicht zum Erfolg geführt, ausser das bei den Kategorien der Optionsbutton für eine Mehrfachauswahl erschien.

Verstanden habe ich ehrlich gesagt auch nicht, an welcher Stelle ich da noch was genau "aktivieren" muss...

Oder stehe ich heute besonders auf dem Schlauch:-)

Wäre nett, wenn du das noch einmal kurz erläutern könntest...

Vielen Dank im Voraus!

Liebe Grüsse, kho

kho: Bilder, Geschichten, Begegnungen...
www.k-ho.de/blog
garvinhicking
Core Developer
Posts: 30022
Joined: Tue Sep 16, 2003 9:45 pm
Location: Cologne, Germany
Contact:

Re: Anzahl Kategorien...

Post by garvinhicking »

kho:

Die .tpl Datei habe ich doch in meinem Beitrag mit gepostet. :) Die ist ansonsten Bestandteil der neuen nightlies.
Der Versuch, das nachvollziehen, hat bei mir nicht zum Erfolg geführt, ausser das bei den Kategorien der Optionsbutton für eine Mehrfachauswahl erschien.
Auch dran gedacht, die Konfiguration des Kategorienplugins zu betreten um das Zählen der Einträge zu aktivieren? :)

Hoffe, Dich vom Schlauch gestellt zu haben,
viele Grüße,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
kho
Regular
Posts: 342
Joined: Fri Mar 04, 2005 8:34 pm

Anzahl Postings pro Kategorie...

Post by kho »

@Garvin

Ja danke! Also, vom Schlauch bin ich jetzt runter:-)))

Die Version 0.9 gibt das ja alles her. Ich denke, ich werde so lange warten, bis das endgültige release da ist.

Btw. könntest du denn aus dem jetzigen Stand abschätzen, ob man die neue Version schon in einem "Produktivblog" einsetzen kann? Im Test sieht das ja alles schon gut aus... Aber ich hab mich bisher noch nicht getraut, die Version im aktiven blog bei mir einzusetzen...

Im Übrigen kann ich nur sagen, s9y macht wirklich Spass!!

Und an dieser Stelle auch mal einen ausdrücklichen Dank an Dich und die unermüdliche Arbeit, die du hier leistest!!

Liebe Grüsse, kho

kho: Bilder, Geschichten, Begegnungen...
www.k-ho.de/blog
garvinhicking
Core Developer
Posts: 30022
Joined: Tue Sep 16, 2003 9:45 pm
Location: Cologne, Germany
Contact:

Re: Anzahl Postings pro Kategorie...

Post by garvinhicking »

Wunderbar :)

Die 0.9 Version sollte nach aktuellem Plan Ende des Monats veröffentlicht werden. Ich empfinde die Version bis dato als recht stabil und sehe keine Gründe die gegen einen Produktiveinsatz sprechen.

Vielen Dank für das Lob, das freut mich sehr! Auch weiterhin viel Spaß! :)

Viele Grüße,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
Post Reply