2007-09-11 17:35:58 +00:00
< ? php
/**
* @ file
* User page callbacks for the book module .
*/
2012-04-26 16:44:37 +00:00
use Drupal\node\Node ;
2012-06-04 12:06:09 +00:00
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException ;
2012-06-02 19:41:40 +00:00
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException ;
2012-04-26 16:44:37 +00:00
2007-09-11 17:35:58 +00:00
/**
2011-12-13 03:13:23 +00:00
* Page callback : Prints a listing of all books .
*
* @ see book_menu ()
2007-09-11 17:35:58 +00:00
*/
function book_render () {
$book_list = array ();
foreach ( book_get_books () as $book ) {
$book_list [] = l ( $book [ 'title' ], $book [ 'href' ], $book [ 'options' ]);
}
2009-10-09 01:00:08 +00:00
return theme ( 'item_list' , array ( 'items' => $book_list ));
2007-09-11 17:35:58 +00:00
}
/**
2011-12-13 03:13:23 +00:00
* Page callback : Generates representations of a book page and its children .
2007-09-11 17:35:58 +00:00
*
2011-12-13 03:13:23 +00:00
* The function delegates the generation of output to helper functions . The
* function name is derived by prepending 'book_export_' to the given output
* type . So , e . g . , a type of 'html' results in a call to the function
* book_export_html () .
2007-09-11 17:35:58 +00:00
*
2011-12-13 03:13:23 +00:00
* @ param $type
* A string encoding the type of output requested . The following types are
* currently supported in book module :
* - html : Printer - friendly HTML .
2007-09-11 17:35:58 +00:00
* Other types may be supported in contributed modules .
* @ param $nid
* An integer representing the node id ( nid ) of the node to export
2011-12-13 03:13:23 +00:00
*
2007-09-11 17:35:58 +00:00
* @ return
2011-12-13 03:13:23 +00:00
* A string representing the node and its children in the book hierarchy in a
* format determined by the $type parameter .
*
* @ see book_menu ()
2007-09-11 17:35:58 +00:00
*/
function book_export ( $type , $nid ) {
$type = drupal_strtolower ( $type );
2008-04-14 17:48:46 +00:00
$export_function = 'book_export_' . $type ;
2007-09-11 17:35:58 +00:00
if ( function_exists ( $export_function )) {
print call_user_func ( $export_function , $nid );
}
else {
drupal_set_message ( t ( 'Unknown export format.' ));
2012-06-02 19:41:40 +00:00
throw new NotFoundHttpException ();
2007-09-11 17:35:58 +00:00
}
}
/**
2012-03-29 20:50:53 +00:00
* Generates HTML for export when invoked by book_export () .
2007-09-11 17:35:58 +00:00
*
2011-12-13 03:13:23 +00:00
* The given node is embedded to its absolute depth in a top level section . For
* example , a child node with depth 2 in the hierarchy is contained in
* ( otherwise empty ) < div > elements corresponding to depth 0 and depth 1.
* This is intended to support WYSIWYG output - e . g . , level 3 sections always
* look like level 3 sections , no matter their depth relative to the node
* selected to be exported as printer - friendly HTML .
2007-09-11 17:35:58 +00:00
*
* @ param $nid
* An integer representing the node id ( nid ) of the node to export .
2011-12-13 03:13:23 +00:00
*
2007-09-11 17:35:58 +00:00
* @ return
* A string containing HTML representing the node and its children in
* the book hierarchy .
*/
function book_export_html ( $nid ) {
if ( user_access ( 'access printer-friendly version' )) {
2007-11-04 14:29:09 +00:00
$export_data = array ();
2007-09-11 17:35:58 +00:00
$node = node_load ( $nid );
if ( isset ( $node -> book )) {
$tree = book_menu_subtree_data ( $node -> book );
2007-11-04 14:29:09 +00:00
$contents = book_export_traverse ( $tree , 'book_node_export' );
2012-07-22 18:07:00 +00:00
return theme ( 'book_export_html' , array ( 'title' => $node -> label (), 'contents' => $contents , 'depth' => $node -> book [ 'depth' ]));
2011-01-28 08:04:59 +00:00
}
else {
2012-06-02 19:41:40 +00:00
throw new NotFoundHttpException ();
2007-09-11 17:35:58 +00:00
}
}
else {
2012-06-04 12:06:09 +00:00
throw new AccessDeniedHttpException ();
2007-09-11 17:35:58 +00:00
}
}
/**
2011-12-13 03:13:23 +00:00
* Page callback : Shows the outline form for a single node .
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2011-12-13 03:13:23 +00:00
* The book node for which to show the outline .
*
* @ see book_menu ()
2007-09-11 17:35:58 +00:00
*/
2012-04-26 16:44:37 +00:00
function book_outline ( Node $node ) {
2012-07-22 18:07:00 +00:00
drupal_set_title ( $node -> label ());
2007-09-11 17:35:58 +00:00
return drupal_get_form ( 'book_outline_form' , $node );
}
/**
2011-12-13 03:13:23 +00:00
* Form constructor for the book outline form .
*
* Allows handling of all book outline operations via the outline tab .
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2011-12-13 03:13:23 +00:00
* The book node for which to show the outline .
2007-09-11 17:35:58 +00:00
*
* @ see book_outline_form_submit ()
* @ see book_remove_button_submit ()
* @ ingroup forms
*/
2012-04-26 16:44:37 +00:00
function book_outline_form ( $form , & $form_state , Node $node ) {
2007-09-11 17:35:58 +00:00
if ( ! isset ( $node -> book )) {
// The node is not part of any book yet - set default options.
$node -> book = _book_link_defaults ( $node -> nid );
}
else {
$node -> book [ 'original_bid' ] = $node -> book [ 'bid' ];
}
2008-05-15 21:19:24 +00:00
2007-09-11 17:35:58 +00:00
// Find the depth limit for the parent select.
if ( ! isset ( $node -> book [ 'parent_depth_limit' ])) {
$node -> book [ 'parent_depth_limit' ] = _book_parent_depth_limit ( $node -> book );
}
$form [ '#node' ] = $node ;
$form [ '#id' ] = 'book-outline' ;
2009-11-18 18:51:11 +00:00
_book_add_form_elements ( $form , $form_state , $node );
2007-09-11 17:35:58 +00:00
$form [ 'book' ][ '#collapsible' ] = FALSE ;
$form [ 'update' ] = array (
'#type' => 'submit' ,
'#value' => $node -> book [ 'original_bid' ] ? t ( 'Update book outline' ) : t ( 'Add to book outline' ),
'#weight' => 15 ,
);
$form [ 'remove' ] = array (
'#type' => 'submit' ,
'#value' => t ( 'Remove from book outline' ),
2012-02-14 13:38:27 +00:00
'#access' => _book_node_is_removable ( $node ),
2007-09-11 17:35:58 +00:00
'#weight' => 20 ,
'#submit' => array ( 'book_remove_button_submit' ),
);
return $form ;
}
/**
2011-12-13 03:13:23 +00:00
* Form submission handler for book_outline_form () .
2007-09-11 17:35:58 +00:00
*
2011-12-13 03:13:23 +00:00
* Redirects to removal confirmation form .
*
* @ see book_outline_form_submit ()
2007-09-11 17:35:58 +00:00
*/
2007-12-22 23:24:26 +00:00
function book_remove_button_submit ( $form , & $form_state ) {
2008-04-14 17:48:46 +00:00
$form_state [ 'redirect' ] = 'node/' . $form [ '#node' ] -> nid . '/outline/remove' ;
2007-09-11 17:35:58 +00:00
}
/**
2011-12-13 03:13:23 +00:00
* Form submission handler for book_outline_form () .
2007-09-11 17:35:58 +00:00
*
2011-12-13 03:13:23 +00:00
* @ see book_remove_button_submit ()
2007-09-11 17:35:58 +00:00
*/
function book_outline_form_submit ( $form , & $form_state ) {
$node = $form [ '#node' ];
2008-04-14 17:48:46 +00:00
$form_state [ 'redirect' ] = " node/ " . $node -> nid ;
2007-09-11 17:35:58 +00:00
$book_link = $form_state [ 'values' ][ 'book' ];
if ( ! $book_link [ 'bid' ]) {
drupal_set_message ( t ( 'No changes were made' ));
2008-05-15 21:19:24 +00:00
2007-09-11 17:35:58 +00:00
return ;
}
$book_link [ 'menu_name' ] = book_menu_name ( $book_link [ 'bid' ]);
$node -> book = $book_link ;
if ( _book_update_outline ( $node )) {
if ( $node -> book [ 'parent_mismatch' ]) {
// This will usually only happen when JS is disabled.
drupal_set_message ( t ( 'The post has been added to the selected book. You may now position it relative to other pages.' ));
2008-04-14 17:48:46 +00:00
$form_state [ 'redirect' ] = " node/ " . $node -> nid . " /outline " ;
2007-09-11 17:35:58 +00:00
}
else {
drupal_set_message ( t ( 'The book outline has been updated.' ));
}
}
else {
drupal_set_message ( t ( 'There was an error adding the post to the book.' ), 'error' );
}
}
/**
2011-12-13 03:13:23 +00:00
* Form constructor to confirm removal of a node from a book .
2007-09-11 17:35:58 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2011-12-13 03:13:23 +00:00
* The node to delete .
2007-09-11 17:35:58 +00:00
*
2011-12-13 03:13:23 +00:00
* @ see book_remove_form_submit ()
* @ see book_menu ()
2007-09-11 17:35:58 +00:00
* @ ingroup forms
*/
2012-04-26 16:44:37 +00:00
function book_remove_form ( $form , & $form_state , Node $node ) {
2007-09-11 17:35:58 +00:00
$form [ '#node' ] = $node ;
2012-07-22 18:07:00 +00:00
$title = array ( '%title' => $node -> label ());
2007-09-11 17:35:58 +00:00
if ( $node -> book [ 'has_children' ]) {
$description = t ( '%title has associated child pages, which will be relocated automatically to maintain their connection to the book. To recreate the hierarchy (as it was before removing this page), %title may be added again using the Outline tab, and each of its former child pages will need to be relocated manually.' , $title );
}
else {
$description = t ( '%title may be added to hierarchy again using the Outline tab.' , $title );
}
2008-04-14 17:48:46 +00:00
return confirm_form ( $form , t ( 'Are you sure you want to remove %title from the book hierarchy?' , $title ), 'node/' . $node -> nid , $description , t ( 'Remove' ));
2007-09-11 17:35:58 +00:00
}
/**
2011-12-13 03:13:23 +00:00
* Form submission handler for book_remove_form () .
2007-09-11 17:35:58 +00:00
*/
function book_remove_form_submit ( $form , & $form_state ) {
$node = $form [ '#node' ];
2012-02-14 13:38:27 +00:00
if ( _book_node_is_removable ( $node )) {
2007-09-11 17:35:58 +00:00
menu_link_delete ( $node -> book [ 'mlid' ]);
2008-11-16 15:02:45 +00:00
db_delete ( 'book' )
-> condition ( 'nid' , $node -> nid )
-> execute ();
2007-09-11 17:35:58 +00:00
drupal_set_message ( t ( 'The post has been removed from the book.' ));
}
2008-04-14 17:48:46 +00:00
$form_state [ 'redirect' ] = 'node/' . $node -> nid ;
2007-09-11 17:35:58 +00:00
}