Better Categories

Creating and modifying plugins.
Post Reply
Guest

Better Categories

Post by Guest »

I have enhanced the existing Categories plugin to allow users to specify what markup to place before and after category lists and items.

Code: Select all

<?php
$probelang = dirname(__FILE__) . '/lang_' . $serendipity['lang'] . '.inc.php';
if (file_exists($probelang)) {
    include $probelang;
}

switch ($serendipity['lang']) {
    case 'en':
    default:
        @define('PLUGIN_BETTERCAT','Better Categories');
        @define('PLUGIN_BETTERCAT_BLAHBLAH', 'A plugin to give better control over category listings');
        @define('PLUGIN_BETTERCAT_TOFETCH','Categories to fetch');
        @define('PLUGIN_BETTERCAT_TOFETCH_D','Fetch categories from which author?');
        @define('PLUGIN_BETTERCAT_XMLIMG','XML Button');
        @define('PLUGIN_BETTERCAT_XMLIMG_D','Links to XML Feeds will be displayed by this image. Leave empty for default, enter "none" to disable.');
        @define('PLUGIN_BETTERCAT_LISTOPEN','List open');
        @define('PLUGIN_BETTERCAT_LISTOPEN_D','String to open a list (including sublists)');
        @define('PLUGIN_BETTERCAT_LISTCLOSE','List close');
        @define('PLUGIN_BETTERCAT_LISTCLOSE_D','String to close a list (including sublists)');
        @define('PLUGIN_BETTERCAT_ITEMOPEN','Item open');
        @define('PLUGIN_BETTERCAT_ITEMOPEN_D','String to open an item');
        @define('PLUGIN_BETTERCAT_ITEMCLOSE','Item close');
        @define('PLUGIN_BETTERCAT_ITEMCLOSE_D','String to close an item');
        @define('PLUGIN_COMMENTS_ABOUT', '%s about%s');
        break;
}

# Better Categories Plugin
#
# No DHTML, just sweet plain HTML that works right

class serendipity_plugin_bettercat extends serendipity_plugin {
    var $title = 'Categories';

    function introspect(&$propbag) {
        global $serendipity;

        $propbag->add('name',         PLUGIN_BETTERCAT);
        $propbag->add('description',  PLUGIN_BETTERCAT_BLAHBLAH);
        $propbag->add('stackable',    true);
        $propbag->add('author',       'a guest');
        $propbag->add('version',      '1.0');
        $propbag->add('configuration', array(
          'authorid',
          'image',
          'listopen',
          'listclose',
          'itemopen',
          'itemclose',
        ));
        $propbag->add('requirements',  array(
            'serendipity' => '0.8',
            'php'         => '4.1.0'
        ));

    }

    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',         PLUGIN_BETTERCAT_TOFETCH);
                $propbag->add('description',  PLUGIN_BETTERCAT_TOFETCH_D);
                $propbag->add('select_values', $authors);
                $propbag->add('default',     'all');
                break;

            case 'image':
                $propbag->add('type',         'string');
                $propbag->add('name',         PLUGIN_BETTERCAT_XMLIMG);
                $propbag->add('description',  PLUGIN_BETTERCAT_XMLIMG_D);
                $propbag->add('default',     serendipity_getTemplateFile('img/xml.gif'));
                break;
                
            case 'listopen':
                $propbag->add('type', 'string');
                $propbag->add('name', PLUGIN_BETTERCAT_LISTOPEN);
                $propbag->add('description',PLUGIN_BETTERCAT_LISTOPEN_D);
                $propbag->add('default','<ul>');
                break;

            case 'listclose':
                $propbag->add('type', 'string');
                $propbag->add('name', PLUGIN_BETTERCAT_LISTCLOSE);
                $propbag->add('description',PLUGIN_BETTERCAT_LISTCLOSE_D);
                $propbag->add('default','</ul>');
                break;

            case 'itemopen':
                $propbag->add('type', 'string');
                $propbag->add('name', PLUGIN_BETTERCAT_ITEMOPEN);
                $propbag->add('description',PLUGIN_BETTERCAT_ITEMOPEN_D);
                $propbag->add('default','<li>');
                break;

            case 'itemclose':
                $propbag->add('type', 'string');
                $propbag->add('name', PLUGIN_BETTERCAT_ITEMCLOSE);
                $propbag->add('description',PLUGIN_BETTERCAT_ITEMCLOSE_D);
                $propbag->add('default','</li>');
                break;

            default:
                return false;
        }
        return true;
    }

    function generate_content(&$title) {
        global $serendipity;

        $which_category = $this->get_config('authorid');
        $lopen  = $this->get_config('listopen');
        $lclose = $this->get_config('listclose');
        $iopen  = $this->get_config('itemopen');
        $iclose = $this->get_config('itemclose');
        
        $categories = serendipity_fetchCategories(empty($which_category) ? 'all' : $which_category);
        $title = $this->title;
        $html  = $lopen;
        $image = $this->get_config('image', serendipity_getTemplateFile('img/xml.gif'));
        $image = (($image == "'none'" || $image == 'none') ? '' : $image);

        if (is_array($categories) && count($categories)) {
            $categories = serendipity_walkRecursive($categories, 'categoryid', 'parentid', VIEWMODE_THREADED);
            
            $olddepth = 0;
            foreach ( $categories as $cat ) {
                $depth = $cat['depth'];
                
                if ( $depth > $olddepth ) $html .= $lopen;
                if ( $depth < $olddepth ) $html .= $lclose."\n";
            
                $html .= $iopen;
                if ( !empty($image) ) {
                    $html .= '<a href="'. serendipity_rewriteURL(PATH_FEEDS .'/'. PATH_CATEGORIES .'/'. serendipity_makePermalink(PERM_FEEDS_CATEGORIES, array('id' => $cat['categoryid'], 'title' => $cat['category_name']))) .'"><img src="'. $image .'" alt="XML" style="border: 0px" /></a> ';
                }
                $html .= '<a href="'. serendipity_rewriteURL(PATH_CATEGORIES . '/' . serendipity_makePermalink(PERM_CATEGORIES, array('id' => $cat['categoryid'], 'title' => $cat['category_name'])), 'serendipityHTTPPath') .'" title="'. $cat['category_name'] .'">'. $cat['category_name'] .'</a>';
                $html .= $iclose."\n";
                $olddepth = $depth;
            }
        }
        $html .= $lclose."\n";

        $html .= sprintf(
          '<p><a href="%s" title="%s">%s</p>',

          $serendipity['serendipityHTTPPath'] . $serendipity['indexFile'],
          ALL_CATEGORIES,
          ALL_CATEGORIES
        }

        print $html;
    }
}

?>
Enjoy.
Post Reply