Source for file chapters.ctrl.php
Documentation is available at chapters.ctrl.php
* This file implements ther UI controler for chapters management.
* This file is part of Quam Plures - {@link http://quamplures.net/}
* See also {@link https://launchpad.net/quam-plures}.
* @copyright (c) 2009 - 2011 by the Quam Plures developers - {@link http://quamplures.net/}
* @copyright (c)2003-2009 by Francois PLANQUE - {@link http://fplanque.net/}
* {@internal License choice
* - If you have received this file as part of a package, please find the license.txt file in
* the same folder or the closest folder above for complete license terms.
* - If you have received this file individually (e-g: from http://evocms.cvs.sourceforge.net/)
* then you must choose one of the following licenses before using the file:
* - GNU General Public License 2 (GPL) - http://www.opensource.org/licenses/gpl-license.php
* - Mozilla Public License 1.1 (MPL) - http://www.opensource.org/licenses/mozilla1.1.php
if( !defined('QP_MAIN_INIT') ) die( 'Please, do not access this page directly.' );
$current_User->check_perm( 'blog_cats', 'edit', true, $blog );
$AdminUI->set_path( 'blogs', 'chapters' );
$delete_restrictions = array(
array( 'table'=> 'T_categories', 'fk'=> 'cat_parent_ID', 'msg'=> T_('%d sub categories') ),
array( 'table'=> 'T_items__item', 'fk'=> 'post_main_cat_ID', 'msg'=> T_('%d posts within category through main cat') ),
array( 'table'=> 'T_postcats', 'fk'=> 'postcat_cat_ID', 'msg'=> T_('%d posts within category through extra cat') ),
$restrict_title = T_('Cannot delete category'); //«%s»
// This must be initialized to false before checking the delete restrictions
load_class( 'chapters/model/_chaptercache.class.php' );
* Display page header, menus & messages:
$AdminUI->set_coll_list_params( 'blog_cats', 'edit',
array( 'ctrl' => $ctrl ), T_('List'), '?ctrl=collections&blog=0' );
// Restrict to chapters of the specific blog:
$list_view_path = 'chapters/views/_chapter_list.view.php';
$permission_to_edit = $current_User->check_perm( 'blog_cats', '', false, $blog );
// The form will be on its own page:
$form_below_list = false;
$edit_view_path = 'chapters/views/_chapter.form.php';
// ---- Below is a modified generic categtory list editor: -----
// fp> this is an example of where we could benefit from controler classes wich could be derived
// fp> we basically need to add a "move" action.
method get_params() // and init object
the $AdminUI->foo() structural calls would move to the dispatcher.
// fp> TODO: find 4 other cases before refactoring this way. (fp)
param( 'action', 'string', 'list' );
// Init fadeout result array:
$result_fadeout = array();
if( param( $GenericCategoryCache->dbIDname, 'integer', NULL, true, false, false ) )
if( ($edited_GenericCategory = & $GenericCategoryCache->get_by_ID( $ {$GenericCategoryCache->dbIDname}, false, true, $subset_ID )) === false )
{ // We could not find the element to edit:
unset ( $edited_GenericCategory );
$Messages->head = T_('Cannot edit element!');
$Messages->add( T_('Requested element does not exist any longer.'), 'error' );
if( !is_null( param( $GenericCategoryCache->dbprefix. 'parent_ID', 'integer', NULL ) ) )
if( ( $edited_parent_GenericElement = & $GenericCategoryCache->get_by_ID( $ {$GenericCategoryCache->dbprefix. 'parent_ID'}, false, true, $subset_ID ) ) === false )
{ // Parent generic category doesn't exist any longer.
unset ( $GenericCategoryCache->dbIDname );
$Messages->head = T_('Cannot edit element!');
$Messages->add( T_('Requested element does not exist any longer.'), 'error' );
// Init fadeout result array of IDs:
$result_fadeout = array();
if( !empty( $locked_IDs )
&& in_array( $action, array( 'edit', 'update', 'delete' ) )
&& in_array( $ $GenericCategoryCache->dbIDname, $locked_IDs ) )
$Messages->add( T_('This element is locked and cannot be edited!') );
if( ! $permission_to_edit )
$edited_GenericCategory = & $GenericCategoryCache->new_obj( NULL, $subset_ID );
if( isset ( $edited_parent_GenericElement ) )
$edited_GenericCategory->parent_ID = $edited_parent_GenericElement->ID;
$edited_GenericCategory->parent_name = $edited_parent_GenericElement->name;
$edited_GenericCategory->parent_name = T_('Root');
case 'move': // EXTENSION
if( ! $Settings->get('allow_moving_chapters') )
debug_die( 'Moving of chapters is disabled' );
// Make sure we got an ID:
param( $GenericCategoryCache->dbIDname, 'integer', true );
if( ! $permission_to_edit )
// Get the page number we come from:
$previous_page = param( 'results'. $GenericCategoryCache->dbprefix. 'page', 'integer', 1, true );
// Insert new element...:
if( ! $permission_to_edit )
$edited_GenericCategory = & $GenericCategoryCache->new_obj( NULL, $subset_ID );
// load data from request
if( $edited_GenericCategory->load_from_Request() )
{ // We could load data from form without errors:
if( $edited_GenericCategory->dbinsert() !== false )
$Messages->add( T_('New element created.'), 'success' ); // TODO CHANGES THIS
// Add the ID of the new element to the result fadeout
$result_fadeout[$edited_GenericCategory->dbIDname][] = $edited_GenericCategory->ID;
// Make sure we got an ID:
param( $GenericCategoryCache->dbIDname, 'integer', true );
if( ! $permission_to_edit )
if( $edited_GenericCategory->load_from_Request() )
{ // We could load data from form without errors:
if( $edited_GenericCategory->dbupdate() !== false )
$Messages->add( T_('Element updated.'), 'success' ); //ToDO change htis
// Add the ID of the updated element to the result fadeout
$result_fadeout[$edited_GenericCategory->dbIDname][] = $edited_GenericCategory->ID;
// Get the page number we come from:
$previous_page = param( 'results'. $GenericCategoryCache->dbprefix. 'page', 'integer', 1, true );
if( ! $Settings->get('allow_moving_chapters') )
debug_die( 'Moving of chapters is disabled' );
// Make sure we got an ID:
param( $GenericCategoryCache->dbIDname, 'integer', true );
// Control permission to edit source blog:
$edited_Blog = & $edited_GenericCategory->get_Blog();
if( ! $current_User->check_perm( 'blog_cats', '', false, $edited_Blog->ID ) )
debug_die( 'No permission to edit source collection.' );
// Control permission to edit destination blog:
param( 'cat_coll_ID', 'integer', true );
if( ! $current_User->check_perm( 'blog_cats', '', false, $cat_coll_ID ) )
// fp> TODO: prevent move in UI.
$Messages->add( 'No permission to edit destination blog.', 'error' ); // NO TRANS b/c temporary
if( $cat_coll_ID == $edited_Blog->ID )
$Messages->add( T_('Category has not been moved.'), 'note' );
// Do the actual move! (This WILL reset the cache!)
$GenericCategoryCache->move_Chapter_subtree( $edited_GenericCategory->ID, $subset_ID, $cat_coll_ID );
$dest_Blog = & $BlogCache->get_by_ID( $cat_coll_ID );
$Messages->add( /* TRANS: first %s is the moved category's name, the second one the new parent category */ sprintf( T_('The category «%s» has been moved (with children) to «%s»\'s root. You may want to nest it in another parent category below...'), $edited_GenericCategory->dget('name'), $dest_Blog->dget( 'shortname' ) ), 'success' );
header_redirect( url_add_param( $admin_url, 'ctrl=chapters&action=edit&blog='. $cat_coll_ID. '&cat_ID='. $cat_ID, '&' ) ); // will save $Messages
// In case we changed the redirect someday:
unset ($edited_GenericCategory);
param( $GenericCategoryCache->dbIDname, 'integer', true );
if( ! $permission_to_edit )
// Set restrictions for element
$edited_GenericCategory->delete_restrictions = $delete_restrictions;
if( param( 'confirm', 'integer', 0 ) )
{ // confirmed, Delete from DB:
$msg = sprintf( T_('Element «%s» deleted.'), $edited_GenericCategory->dget( 'name' ) );
$GenericCategoryCache->dbdelete_by_ID( $edited_GenericCategory->ID );
unset ($edited_GenericCategory);
$Messages->add( $msg, 'success' );
{ // not confirmed, Check for restrictions:
// Get the page number we come from:
$previous_page = param( 'results_'. $GenericCategoryCache->dbprefix. 'page', 'integer', 1, true );
if( ! $edited_GenericCategory->check_delete( sprintf( T_('Cannot delete element «%s»'), $edited_GenericCategory->dget( 'name' ) ) ) )
{ // There are restrictions:
if( ! $permission_to_edit )
$edited_Blog->set_setting( 'default_cat_ID', $edited_GenericCategory->ID );
// Display <html><head>...</head> section! (Note: should be done early if actions do not redirect)
$AdminUI->disp_html_head();
// Display title, menu, messages, etc. (Note: messages MUST be displayed AFTER the actions)
$AdminUI->disp_body_top();
$AdminUI->disp_payload_begin();
$AdminUI->disp_view( 'chapters/views/_chapter_move.form.php' );
$AdminUI->disp_payload_end();
$AdminUI->disp_payload_begin();
if( $action == 'delete' )
{ // We need to ask for confirmation:
$edited_GenericCategory->confirm_delete(
sprintf( T_('Delete element «%s»?'), $edited_GenericCategory->dget( 'name' ) ),
// Display list VIEW before form view:
if( !empty( $list_view_path ) )
$AdminUI->disp_view( $list_view_path );
$AdminUI->disp_view( 'generic/_generic_recursive_list.inc.php' );
// Display category edit form:
if( !empty( $edit_view_path ) )
$AdminUI->disp_view( $edit_view_path );
$AdminUI->disp_view( 'generic/_generic_category.form.php' );
$AdminUI->disp_payload_end();
$AdminUI->disp_payload_begin();
if( !empty( $list_view_path ) )
$AdminUI->disp_view( $list_view_path );
$AdminUI->disp_view( 'generic/_generic_recursive_list.inc.php' );
$AdminUI->disp_payload_end();
// Display body bottom, debug info and close </html>:
$AdminUI->disp_global_footer();
|