'select',
'#title' => t('Select the vocabulary to list'),
'#default_value' => variable_get('jquery_drawer', '1'),
// TODO: won't work with taxonomy_get_vocabularies()
'#options' => menu_parent_options(taxonomy_get_vocabularies(), 0),
);
return $form;
case 'save':
variable_set('jquery_drawer', $edit['jquery_drawer']);
break;
case 'view':
// Get all terms from a given vocabulary
$vid = variable_get('jquery_drawer', '1');
$menu = taxonomy_node_tree_parents($vid);
$block['content'] = theme('jquery_drawer', $menu);
return $block;
}
}
/**
* Implementation of hook_menu();
*/
function jquery_drawer_menu() {
$items['jquery_drawer'] = array(
'title' => 'jQuery Drawer',
'description' => 'Displays content inside a jQuery Drawer.',
'page callback' => 'jquery_drawer_page',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* Implementation of hook_theme();
*/
function jquery_drawer_theme() {
return array(
'jquery_drawer' => array(
'arguments' => array(
'menu' => NULL,
),
),
'jquery_drawer_javascript' => array(
'arguments' => array(),
),
'jquery_drawer_css' => array(
'arguments' => array(),
),
'jquery_drawer_link' => array(
'arguments' => array(),
),
);
}
/**
* Drawer logic.
* @ingroup themeable
*/
function theme_jquery_drawer($menu) {
$output = '
';
$output .= implode((array) module_invoke_all('jquery_drawer'));
foreach ($menu as $item) {
$link['title'] = $item->name;
$link['href'] = 'jquery_drawer/'. $item->tid;
$output .= theme('jquery_drawer_link', $link);
}
$output .= '
';
$output .= '';
$output .= '
';
return $output;
}
/**
* Menu callback.
*/
function jquery_drawer_page($tid = NULL) {
// First render all nodes whose parent is $term
$output = '';
$nodes = taxonomy_select_nodes(array($tid));
while ($node = db_fetch_object($nodes)) {
$link['title'] = $node->title;
$link['href'] = 'node/'. $node->nid;
$output .= theme('jquery_drawer_link', $link);
}
// Then render all nodes whose terms are children of $term
$vocabulary = variable_get('jquery_drawer', '1');
$terms = taxonomy_node_tree_taxonomy_get_tree($vocabulary, $tid);
foreach ($terms as $term) {
$filter[] = $term->tid;
}
$query = 'SELECT node.nid, node.title, term_node.tid FROM {node} LEFT JOIN
{term_node} ON term_node.nid = node.nid WHERE term_node.tid IN (%s)
AND node.status = "1"';
$result = db_query(db_rewrite_sql($query), implode(',', $filter));
$tree = taxonomy_node_tree_build($result, $terms);
// format output
$output .= '';
foreach ($tree as $term) {
$output .= jquery_drawer_menu_build($term);
}
$output .= '
';
// Display output
echo($output);
// We need to exit here to avoid themeable output
exit();
}
/**
* Recursively build the menu.
*
* @ingroup themeable
*/
function jquery_drawer_menu_build($term) {
global $_jquery_drawer_id;
if ($_jquery_drawer_id == NULL) {
$_jquery_drawer_id = 0;
}
$_jquery_drawer_id++;
if (isset($term->tid)) {
$output .= '';
$output .= $term->name;
if (isset($term->below)) {
$output .= '';
foreach ($term->below as $child) {
$output .= jquery_drawer_menu_build($child);
}
$output .= '
';
}
else if (isset($term->nodes)) {
$output .= '';
foreach ($term->nodes as $node) {
$output .= '- ';
$output .= ''. $node->title .'';
}
$output .= '
';
$output .= '';
}
$output .= '';
}
return $output;
}
/**
* jQuery Drawer Javascript theme function.
*
* @ingroup themeable
*/
function theme_jquery_drawer_javascript() {
drupal_add_js(drupal_get_path('module', 'jquery_drawer') .'/jquery_drawer/drw/scripts.js');
}
/**
* jQuery Drawer CSS theme function.
*
* @ingroup themeable
*/
function theme_jquery_drawer_css() {
drupal_add_css(drupal_get_path('module', 'jquery_drawer') .'/jquery_drawer/drw/styles.css');
drupal_add_css(drupal_get_path('module', 'jquery_drawer') .'/jquery_drawer.css');
}
/**
* jQuery Drawer Link theme function.
*
* @ingroup themeable
*/
function theme_jquery_drawer_link($link) {
if (empty($link['localized_options'])) {
$link['localized_options'] = array();
}
$link['attributes']['rel'] = 'drw';
$output = '';
$output .= l($link['title'], $link['href'], array('attributes' => array('rel' => 'drw')));
$output .= '';
return $output;
}