hs_book.module in Hierarchical Select 5.3
Implementation of the Hierarchical Select API for the Book module.
File
modules/hs_book.moduleView source
<?php
/**
* @file
* Implementation of the Hierarchical Select API for the Book module.
*/
//----------------------------------------------------------------------------
// Drupal core hooks.
/**
* Implementation of hook_menu().
*/
function hs_book_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
'path' => 'admin/settings/hierarchical_select/book',
'title' => t('Book'),
'description' => t('Hierarchical Select configuration for Book'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'hs_book_admin_settings',
),
'type' => MENU_LOCAL_TASK,
);
}
return $items;
}
/**
* Implementation of hook_form_alter().
*/
function hs_book_form_alter($form_id, &$form) {
if ($form_id == 'book_node_form' && isset($form['parent'])) {
unset($form['parent']['#options']);
$form['parent']['#type'] = 'hierarchical_select';
$form['parent']['#config'] = array(
'module' => 'hs_book',
'params' => array(
'nid' => isset($form['nid']) ? $form['nid']['#value'] : NULL,
),
'save_lineage' => 0,
'enforce_deepest' => 0,
'resizable' => variable_get('hs_book_resizable', 1),
);
$form['parent']['#default_value'] = !is_numeric($form['parent']['#default_value']) ? 0 : $form['parent']['#default_value'];
}
}
//----------------------------------------------------------------------------
// Menu callbacks.
/**
* Form definition; admin settings.
*/
function hs_book_admin_settings() {
$form['hs_book_resizable'] = array(
'#type' => 'radios',
'#title' => t('Resizable'),
'#description' => t("When enabled, a handle appears below the Hierarchical Select to allow\n the user to dynamically resize it. Double clicking will toggle between\n the smallest and a sane 'big size'."),
'#options' => array(
0 => t('Disabled'),
1 => t('Enabled'),
),
'#default_value' => variable_get('hs_book_resizable', 1),
);
return system_settings_form($form);
}
//----------------------------------------------------------------------------
// Hierarchical Select hooks.
/**
* Implementation of hook_hierarchical_select_params().
*/
function hs_book_hierarchical_select_params() {
$params = array(
'nid',
);
return $params;
}
/**
* Implementation of hook_hierarchical_select_root_level().
*/
function hs_book_hierarchical_select_root_level($params) {
$root_level = array();
// If the user has permission to create new books, add the top-level book page to the menu;
if (user_access('create new books')) {
$root_level[0] = '<' . t('top-level') . '>';
}
$root_level += hs_book_hierarchical_select_children(-1, $params);
return $root_level;
}
/**
* Implementation of hook_hierarchical_select_children().
*/
function hs_book_hierarchical_select_children($parent, $params) {
// TRICKY: because the book form assumes that the value "0" corresponds to
// the <top-level page> option (for creating a new menu item at the root
// level) *AND* 0 is also a pseudo-value in the actual hierarchy (it
// represents the root), we have to pretend in the code that -1 is the root
// in the hierarchy instead of 0.
if ($parent == 0) {
return array();
}
if ($parent == -1) {
$parent = 0;
}
$result = db_query(db_rewrite_sql('SELECT n.nid, n.title FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE n.status = 1 AND b.parent = %d ORDER BY b.weight, n.title'), $parent);
$children = array();
while ($node = db_fetch_object($result)) {
// Don't include the given book page in the hierarchy!
if (isset($params['nid']) && $params['nid'] == $node->nid) {
continue;
}
$children[$node->nid] = $node->title;
}
return $children;
}
/**
* Implementation of hook_hierarchical_select_lineage().
*/
function hs_book_hierarchical_select_lineage($item, $params) {
$lineage = array(
$item,
);
while (TRUE) {
$parent = db_result(db_query("SELECT parent FROM {book} WHERE nid = %d", $item));
// 0 is the root menu item, so if $parent == 0, the lineage is complete!
if ($parent == 0) {
break;
}
array_unshift($lineage, $parent);
$item = $parent;
}
return $lineage;
}
/**
* Implementation of hook_hierarchical_select_valid_item().
*/
function hs_book_hierarchical_select_valid_item($item, $params) {
if (!is_numeric($item) || $item < 0) {
return FALSE;
}
// Item 0 corresponds to the special <top-level page> option.
if ($item == 0) {
return TRUE;
}
$count = db_result(db_query(db_rewrite_sql("SELECT COUNT(n.nid) FROM {book} n WHERE n.nid = %d"), $item));
return $count == 1;
}
/**
* Implementation of hook_hierarchical_select_item_get_label().
*/
function hs_book_hierarchical_select_item_get_label($item, $params) {
static $labels = array();
if (!isset($labels[$item])) {
$labels[$item] = t(db_result(db_query("SELECT n.title FROM {book} b INNER JOIN {node} n ON b.vid = n.vid WHERE b.nid = %d", $item)));
}
return $labels[$item];
}
/**
* Implementation of hook_hierarchical_select_implementation_info().
*/
function hs_book_hierarchical_select_implementation_info() {
$info = node_get_types('type', 'book');
return array(
'hierarchy type' => t('Book'),
'entity type' => t('Node (!book_page)', array(
'!book_page' => $info->name,
)),
);
}
Functions
Name | Description |
---|---|
hs_book_admin_settings | Form definition; admin settings. |
hs_book_form_alter | Implementation of hook_form_alter(). |
hs_book_hierarchical_select_children | Implementation of hook_hierarchical_select_children(). |
hs_book_hierarchical_select_implementation_info | Implementation of hook_hierarchical_select_implementation_info(). |
hs_book_hierarchical_select_item_get_label | Implementation of hook_hierarchical_select_item_get_label(). |
hs_book_hierarchical_select_lineage | Implementation of hook_hierarchical_select_lineage(). |
hs_book_hierarchical_select_params | Implementation of hook_hierarchical_select_params(). |
hs_book_hierarchical_select_root_level | Implementation of hook_hierarchical_select_root_level(). |
hs_book_hierarchical_select_valid_item | Implementation of hook_hierarchical_select_valid_item(). |
hs_book_menu | Implementation of hook_menu(). |