0
+ − 1
<?php
+ − 2
/*
+ − 3
Plugin Name: Category list
+ − 4
Plugin URI: http://enanocms.org/
+ − 5
Description: A simple parser hook to display the contents of a category within another page. Syntax is {{Category:<cat name>|sub=(on|off)|pages=(on|off)}}. (Both sub [subcategories] and pages default to on)
+ − 6
Author: Dan Fuhry
+ − 7
Version: 1.0
+ − 8
Author URI: http://enanocms.org/
+ − 9
*/
+ − 10
+ − 11
// attach parser hook
+ − 12
$plugins->attachHook('render_wikiformat_pre', 'catlist_parser_hook($text);');
+ − 13
+ − 14
function catlist_parser_hook(&$text)
+ − 15
{
+ − 16
if ( preg_match_all('/\{\{
+ − 17
Category:
+ − 18
([^|\r\n\a\t]+?) # category name
+ − 19
(\|(?:(?:[a-z0-9_]+)(?:[\s]*)=(?:[\s]*)(?:[^\}\r\n\a\t]+))) # parameters
+ − 20
\}\}/x', $text, $matches) )
+ − 21
{
+ − 22
foreach ( $matches[0] as $i => $match )
+ − 23
{
+ − 24
$cat_name =& $matches[1][$i];
+ − 25
$params =& $matches[2][$i];
+ − 26
$params = catlist_parse_params($params);
+ − 27
+ − 28
$do_subs = ( isset($params['sub']) && $params['sub'] === 'off' ) ? false : true;
+ − 29
$do_pages = ( isset($params['pages']) && $params['pages'] === 'off' ) ? false : true;
+ − 30
+ − 31
$result = catlist_print_category($cat_name, $do_subs, $do_pages);
+ − 32
$text = str_replace($match, $result, $text);
+ − 33
}
+ − 34
}
+ − 35
}
+ − 36
+ − 37
function catlist_parse_params($params)
+ − 38
{
+ − 39
$params = trim($params, '|');
+ − 40
$params = explode('|', $params);
+ − 41
$return = array();
+ − 42
foreach ( $params as $val )
+ − 43
{
+ − 44
if ( preg_match('/^([a-z0-9_]+)(?:[\s]*)=(?:[\s]*)([^\}\r\n\a\t]+)$/', $val, $match) )
+ − 45
{
+ − 46
$return[ $match[1] ] = $match[2];
+ − 47
}
+ − 48
}
+ − 49
return $return;
+ − 50
}
+ − 51
+ − 52
function catlist_print_category($cat_name, $do_subs, $do_pages)
+ − 53
{
+ − 54
// nicely format and print the category out, then return HTML
+ − 55
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 56
+ − 57
// make sane the category ID
+ − 58
$cat_id = $db->escape(sanitize_page_id($cat_name));
+ − 59
+ − 60
// if we're doing both, use the more complicated query
+ − 61
if ( $do_subs && $do_pages )
+ − 62
{
+ − 63
+ − 64
$q = $db->sql_query('SELECT c.page_id, c.namespace, p.name, ( c.namespace = \'Category\' ) AS is_subcategory FROM ' . table_prefix . "categories AS c\n"
+ − 65
. " LEFT JOIN " . table_prefix . "pages AS p\n"
+ − 66
. " ON ( p.urlname = c.page_id AND p.namespace = c.namespace )\n"
+ − 67
. " WHERE c.category_id = '$cat_id'\n"
+ − 68
. " ORDER BY is_subcategory DESC;");
+ − 69
}
+ − 70
else
+ − 71
{
+ − 72
// nice little where clause...
+ − 73
if ( $do_subs && !$do_pages )
+ − 74
{
+ − 75
$where = 'c.namespace = \'Category\'';
+ − 76
}
+ − 77
else if ( $do_pages && !$do_subs )
+ − 78
{
+ − 79
$where = 'c.namespace != \'Category\'';
+ − 80
}
+ − 81
else
+ − 82
{
+ − 83
// ok, subs = off AND pages = off. some people are dummies.
+ − 84
return '';
+ − 85
}
+ − 86
$q = $db->sql_query('SELECT c.page_id, c.namespace, p.name, ( c.namespace = \'Category\' ) AS is_subcategory FROM ' . table_prefix . "categories AS c\n"
+ − 87
. " LEFT JOIN " . table_prefix . "pages AS p\n"
+ − 88
. " ON ( p.urlname = c.page_id AND p.namespace = c.namespace )\n"
+ − 89
. " WHERE c.category_id = '$cat_id' AND $where\n"
+ − 90
. " ORDER BY is_subcategory DESC;");
+ − 91
}
+ − 92
if ( !$q )
+ − 93
$db->_die();
+ − 94
+ − 95
$html = '';
+ − 96
if ( $do_subs && $do_pages )
+ − 97
{
+ − 98
$html .= '<h3>Subcategories</h3>';
+ − 99
}
+ − 100
if ( $do_subs )
+ − 101
{
+ − 102
// LIST: subcategories
+ − 103
$html .= '<div class="tblholder">';
+ − 104
$html .= '<table border="0" cellspacing="1" cellpadding="4">';
+ − 105
$html .= '<tr>';
+ − 106
$ticker = 0;
+ − 107
$have_subcats = false;
+ − 108
$class = 'row1';
+ − 109
while ( $row = $db->fetchrow() )
+ − 110
{
+ − 111
if ( empty($row['is_subcategory']) )
+ − 112
break;
+ − 113
+ − 114
$have_subcats = true;
+ − 115
+ − 116
$ticker++;
+ − 117
if ( $ticker == 3 )
+ − 118
{
+ − 119
$ticker = 0;
+ − 120
$html = '</tr><tr>';
+ − 121
$class = ( $class == 'row1' ) ? 'row2' : 'row1';
+ − 122
}
+ − 123
$inner = '<a href="' . makeUrlNS($row['namespace'], $row['page_id'], false, true) . '">' . htmlspecialchars($row['name']) . '</a>';
+ − 124
$html .= '<td style="width: 33.3%;" class="' . $class . '">' . $inner . '</td>';
+ − 125
}
+ − 126
if ( !$have_subcats )
+ − 127
{
+ − 128
$ticker++;
+ − 129
$html .= '<td style="width: 33.3%;" class="' . $class . '">No subcategories.</td>';
+ − 130
}
+ − 131
// fill in the rest of the table
+ − 132
while ( $ticker < 3 )
+ − 133
{
+ − 134
$ticker++;
+ − 135
$html .= '<td style="width: 33.3%;" class="' . $class . '"></td>';
+ − 136
}
+ − 137
$html .= '</table></div>';
+ − 138
}
+ − 139
if ( $do_subs && $do_pages )
+ − 140
{
+ − 141
$html .= '<h3>Pages</h3>';
+ − 142
}
+ − 143
if ( $do_pages )
+ − 144
{
+ − 145
// LIST: member pages
+ − 146
$html .= '<div class="tblholder">';
+ − 147
$html .= '<table border="0" cellspacing="1" cellpadding="4">';
+ − 148
$html .= '<tr>';
+ − 149
$ticker = 0;
+ − 150
$have_pages = false;
+ − 151
$class = 'row1';
+ − 152
// using do-while because the last row was already fetched if we had to do subcategories
+ − 153
do
+ − 154
{
+ − 155
if ( !$do_subs && !isset($row) )
+ − 156
$row = $db->fetchrow();
+ − 157
+ − 158
if ( !$row )
+ − 159
break;
+ − 160
+ − 161
$have_pages = true;
+ − 162
+ − 163
$ticker++;
+ − 164
if ( $ticker == 3 )
+ − 165
{
+ − 166
$ticker = 0;
+ − 167
$html = '</tr><tr>';
+ − 168
$class = ( $class == 'row1' ) ? 'row2' : 'row1';
+ − 169
}
+ − 170
$inner = '<a href="' . makeUrlNS($row['namespace'], $row['page_id'], false, true) . '">' . htmlspecialchars($row['name']) . '</a>';
+ − 171
$html .= '<td style="width: 33.3%;" class="' . $class . '">' . $inner . '</td>';
+ − 172
}
+ − 173
while ( $row = $db->fetchrow() );
+ − 174
+ − 175
if ( !$have_pages )
+ − 176
{
+ − 177
$ticker++;
+ − 178
$html .= '<td style="width: 33.3%;" class="' . $class . '">No pages in this category.</td>';
+ − 179
}
+ − 180
// fill in the rest of the table
+ − 181
while ( $ticker < 3 )
+ − 182
{
+ − 183
$ticker++;
+ − 184
$html .= '<td style="width: 33.3%;" class="' . $class . '"></td>';
+ − 185
}
+ − 186
$html .= '</table></div>';
+ − 187
}
+ − 188
return $html;
+ − 189
}