You can also define child pages by content-type in !content-type-settings in the BookMadeSimple section',array('!content-type-settings' => l(t('content type settings'),'admin/content/types/list')));
return $output;
break;
}
}
/**
* Implementation of hook_menu().
*/
function book_made_simple_menu() {
$items = array();
$items['admin/settings/book_made_simple'] = array(
'title' => t('BookMadeSimple settings'),
'page callback' => 'drupal_get_form',
'page arguments' => array('book_made_simple_settings_form'),
'access arguments' => array('administer site configuration'),
'description' => t('BookMadeSimple module settings.'),
'type' => MENU_NORMAL_ITEM,
);
$items['node/%/reorder'] = array(
'title' => t('Reorder the book'),
'page callback' => 'book_made_simple_reorder',
'page arguments' => array(1),
'access callback' => 'isBookAccess',
'access arguments' => array(1),
'type' => MENU_LOCAL_TASK,
'weight' =>2
);
return $items;
}
/**
* Return access rights for book
*/
function isBookAccess($arg, $node = NULL) {
if ($node == NULL && is_numeric($arg)) {
$node = node_load($arg);
}
if (isset($node->book) && $node->book['bid'] > 0 && _book_outline_access($node) ) {return true;}
return false;
}
/**
* Shortcut to reorder book page
*/
function book_made_simple_reorder($id) {
$node = node_load($id);
drupal_goto("admin/content/book/" . $node->book['bid'] , "destination=node/" . $node->nid);
}
/**
* Implementation of hook_settings_form).
*/
function book_made_simple_settings_form() {
$types = node_get_types("names");
$form['book_made_simple'] = array(
'#type' => 'fieldset',
'#title' => t('Select node types that can be included in a book'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#description' => t('Check content-type that can be included as child in a book. This selection is overriden by selection in content-type settings.'),
);
$form['book_made_simple']['book_made_simple_add_types'] = array(
'#type' => 'checkboxes',
'#options' => $types,
'#multiple' => true,
'#default_value' => variable_get('book_made_simple_add_types', array()),
);
$form['book_made_simple2'] = array(
'#type' => 'fieldset',
'#title' => t('Select node types to auto-create main book page'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#description' => t('Check content-types if you want they will automatically be created as main page of a book.'),
);
$form['book_made_simple2']['book_made_simple_auto_main_page'] = array(
'#type' => 'checkboxes',
'#options' => $types,
'#multiple' => true,
'#default_value' => variable_get('book_made_simple_auto_main_page', array()),
);
$form['book_made_simple_hide_default_add_child'] = array(
'#type' => 'checkbox',
'#title' => t('Hide default add child link'),
'#default_value' => variable_get('book_made_simple_hide_default_add_child', true),
'#description' => t('Check to hide default add child page link.'),
);
$form['book_made_simple_child_list_style'] = array(
'#type' => 'radios',
'#title' => t('Style of child list'),
'#options' => array("DDLIST" => t("Dropdown listbox"),"LI" => t("Unordered list"),"THEME" => t("Themeable function")),
'#default_value' => variable_get('book_made_simple_child_list_style', "DDLIST"),
'#description' => t('Choose the style of the child list.'),
);
return system_settings_form($form);
}
/**
* Implementation of hook_form_alter().
*/
function book_made_simple_form_alter(&$form, $form_state, $form_id) {
if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] .'_node_form' == $form_id) {
$node = $form['#node'];
$book = $node->book;
if (isBookAccess(null, $form['#node'])) {
$form['book']['reorder'] = array(
'#type' => 'item',
'#value' => l(t("Reorder the book"), "admin/content/book/" . $book['bid'] , array('query' =>"destination=node/" . $node->nid)),
'#description' => t("Shortcut to reorder the entire book"),
'#weight' => 10,
);
}
return $form;
}
switch ($form["#id"]) {
case "node-type-form" : // $type . '_node_settings':
$type = $form["#node_type"]->type;
$default = array_key_exists($type,variable_get('book_made_simple_auto_main_page',array()));
$form['book_made_simple'] = array(
'#type' => 'fieldset',
'#title' => t('BookMadeSimple'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['book_made_simple']['1'] = array(
'#attributes' => array('style' =>'float:left;;width:40%'),
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$types = node_get_types("names");
$form['book_made_simple']['1']['book_made_simple_for_type'] = array(
'#type' => 'checkboxes',
'#title' => t('Select content-types allowed as child.'),
'#options' => $types,
'#multiple' => true,
'#default_value' => variable_get('book_made_simple_for_type_' . $type, array()),
);
$aa = array();
unset($types[$type]);
foreach ($types as $ctype => $name) {
$a = variable_get('book_made_simple_for_type_' . $ctype, array());
if (array_search($type,$a) !== FALSE) {array_push($aa,$ctype);}
}
$form['book_made_simple']['2'] = array(
'#attributes' => array('style' =>'float:right;width:40%'),
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['book_made_simple']['2']['book_made_simple_for_book'] = array(
'#type' => 'checkboxes',
'#title' => t('Select content-types allowed as parent'),
'#options' => $types,
'#multiple' => true,
'#default_value' => $aa,
);
$form['book_made_simple']['3'] = array(
'#attributes' => array('style' =>'float:none;clear:both;'),
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$varTypes = variable_get('book_made_simple_auto_main_page',array());
$default = (array_key_exists($type, $varTypes) && $varTypes[$type] != "0");
$form['book_made_simple']['3']['book_made_simple_auto_main_page'] = array(
'#attributes' => array('style' =>'float:none;clear:both'),
'#type' => 'checkbox',
'#title' => t('Auto create book main page'),
'#default_value' => $default,
'#description' => t('Checked will create a new book main page when adding.'),);
$varTypes = variable_get('book_made_simple_add_types',array());
$default = (array_key_exists($type, $varTypes) && $varTypes[$type] != "0");
$form['book_made_simple']['3']['book_made_simple_add_types'] = array(
'#type' => 'checkbox',
'#title' => t('Allow content type as child of default book.'),
'#default_value' => $default,
'#description' => t('Checked will add this content-type to books where no content-types has been selected.'),
);
array_push($form['#submit'],"book_made_simple_form_submit");
break;
} // endswitch $form_id
} // endfunction book_made_simple_form_alter()
/**
* Implementation of hook_form_submit().
*/
function book_made_simple_form_submit($form, &$form_state) {
$values = $form_state["values"];
$text = $values["book_made_simple_auto_main_page"];
$type = $values["type"];
variable_del("book_made_simple_add_types_" . $type);
variable_del("book_made_simple_auto_main_page_" . $type);
$types = variable_get('book_made_simple_auto_main_page', array());
if ($text != "0") {$types[$type]= $type;}
else {unset($types[$type]);}
variable_set('book_made_simple_auto_main_page', $types);
$text = $values["book_made_simple_add_types"];
$types = variable_get('book_made_simple_add_types', array());
if ($text != "0") {$types[$type]= $type;}
else {unset($types[$type]);}
variable_set('book_made_simple_add_types', $types);
$text = $values["book_made_simple_for_type"];
if (count($text) == 0) {variable_del("book_made_simple_for_type_" . $type);}
$types = node_get_types("names");
$saved = $values["book_made_simple_for_book"];
$a2 = array();
foreach ($types as $ctype => $name) {
if ($ctype != $type) {
$a = variable_get('book_made_simple_for_type_' . $ctype, array());
$ind = array_search($type,$a);
if ($ind !== FALSE) {unset($a[$ind]);}
variable_set('book_made_simple_for_type_' . $ctype, $a);
}
}
foreach ($saved as $ctype => $name) {
if ($name != "0") {
$a = variable_get('book_made_simple_for_type_' . $ctype, array());
$a[$type]= $type;
variable_set('book_made_simple_for_type_' . $ctype, $a);
}
}
variable_del("book_made_simple_for_book_" . $type);
}
/**
* Implementation of hook_link(). Add dropdown listbox to links
*/
function book_made_simple_link($type, $node = null, $teaser = false) {
$links = array();
if ($type == 'node' && !$teaser && isset($node->book["bid"]) && user_access('create book content') && $node->status == 1) {
$html = "";
$allowedTypes = array();
// Search for content-type for this one
$aTypes = variable_get('book_made_simple_for_type_' . $node->type, array());
$style = variable_get('book_made_simple_child_list_style', "DDLIST");
// No content-type, so print all
if (count($aTypes) == 0) {
$aTypes = variable_get('book_made_simple_add_types', array());
}
foreach ($aTypes as $allowedType => $allowedName) {
$type = node_get_types("type",$allowedName);
if (node_access('create', $type->type)) {
$allowedTypes[$type->type] = $type->name;
}
}
$book_link = $node->book;
if (count($allowedTypes) > 0) {
asort($allowedTypes,SORT_STRING);
if ($style == "LI") {
foreach ($allowedTypes as $type => $name ) {
$links['book_add_' . $type] = array(
'title' => t('Add !content-type', array('!content-type' => t($name))),
'href' => "node/add/". str_replace('_', '-', $type),
'query' => "parent=". $node->book['mlid'],
);
}
}
elseif ($style == "DDLIST") {
$links['book_made_simple'] = array(
'title' => "" . book_made_simple_add_child_book_content_types_ddlist($allowedTypes, $node) . "",
'html'=>true);
}
else {
$links['book_made_simple'] = array(
'title' => theme('add_child_book_content_types',$allowedTypes, $node),
'html'=>true);
}
}
}
$links["book_add_child"] = array();
return $links;
}
/**
* Implementation of hook_theme().
*/
function book_made_simple_theme() {
return array(
'add_child_book_content_types' => array(
'arguments' => array('allowedTypes' => NULL, "node"=>null),
),
);
}
/**
* Themeable function to display alloawed child types of book().
* @param $allowedTypes
* Array of allowed child type.
* @param $node
* Source node
* @return
* Html code to display allowed child type
*/
function theme_add_child_book_content_types($allowedTypes, &$node) {
return "";
}
/**
* Display alloawed child type as dropdown listbox.
*/
function book_made_simple_add_child_book_content_types_ddlist($allowedTypes, &$node) {
$child_type = variable_get('book_child_type', 'book');
$html = "";
foreach ($allowedTypes as $type => $name ) {
$html .= "";
}
$isCleanUrl = variable_get('clean_url', 0);
$url = url("node/add/");
$op = "&";
if ($isCleanUrl) {$op = "?";}
$newUrl = $url ."\" + this.value + \"" . $op . "parent=" . $node->book["mlid"];
return "";
}
/**
* Implementation of hook_nodeapi().
*/
function book_made_simple_nodeapi(&$node, $op, $teaser, $page) {
if (empty($node->book["bid"])) {
$type = $node->type;
switch ($op) {
// Node creation
case 'insert':
if ((user_access('add content to books') || user_access('administer book outlines')) && node_access('create', $type) && $node->book['depth'] < MENU_MAX_DEPTH) {
$bookTypes = variable_get('book_made_simple_auto_main_page',array());
$bookType = $bookTypes[$type];
$toCreate = false;
if (null != $bookType && $bookType != "0") {$toCreate = true;}
if ($toCreate && ! isset($_GET['parent'])) {
$node->book["bid"] = $node->nid;
_book_update_outline($node);
}
}
break;
// Hack for translation module. Adding parent property to automatically select parent book.
case "prepare translation":
$translation = $node->translation_source;
if (isset($translation->book) && (! isset($_GET["parent"]))) {
// get parent menu link for the node + language
$plid = $translation->book['plid'];
$parentPage = book_link_load($plid);
if (isset($parentPage)) {
$pnid = $parentPage['nid'];
if (isset($pnid) && $pnid <> "") {
$query= "SELECT bid, mlid FROM {node} n left join {book} b on b.nid = n.nid where tnid= $pnid and language='" . $node->language . "'";
$translatedParent = db_fetch_object(db_query($query));
if ($translatedParent) {
$mlid = $translatedParent->mlid;
$params = array();
$params[] = "parent=$mlid";
foreach ($_GET as $key => $value) {
if ($key == "q") {$path = $value;}
else {$params[] = $key . "=" . $value;}
}
$queryString = implode("&",$params);
drupal_goto($path, $queryString);
$ok = true;
}
else {
drupal_set_message(t("This node has no translated parent, so no book selected"),"warning");
}
}
}
}
break;
}
}
else {
switch ($op) {
// Hide standard add Child link
case 'alter':
if (($node->links) && variable_get('book_made_simple_hide_default_add_child',true)) {
if (array_key_exists("book_add_child",$node->links)) {
unset($node->links["book_add_child"]);
}
}
break;
}
}
}