2007-09-14 12:17:58 +00:00
< ? php
// $Id$
/**
* @ file
* Admin page callbacks for the filter module .
*/
/**
2009-01-21 16:58:42 +00:00
* Menu callback ; Displays a list of all text formats and which
2007-09-14 12:17:58 +00:00
* one is the default .
*
* @ ingroup forms
2008-01-08 10:35:43 +00:00
* @ see filter_admin_overview_submit ()
2007-09-14 12:17:58 +00:00
*/
function filter_admin_overview () {
// Overview of all formats.
$formats = filter_formats ();
$error = FALSE ;
2008-02-19 14:07:21 +00:00
$form = array ( '#tree' => TRUE );
2007-09-14 12:17:58 +00:00
foreach ( $formats as $id => $format ) {
$roles = array ();
foreach ( user_roles () as $rid => $name ) {
// Prepare a roles array with roles that may access the filter.
2009-04-26 06:00:31 +00:00
if ( strpos ( $format -> roles , " , $rid , " ) !== FALSE ) {
2007-09-14 12:17:58 +00:00
$roles [] = $name ;
}
}
$default = ( $id == variable_get ( 'filter_default_format' , 1 ));
$options [ $id ] = '' ;
2008-07-16 21:59:29 +00:00
$form [ $id ][ 'name' ] = array ( '#markup' => $format -> name );
2009-01-21 16:58:42 +00:00
$form [ $id ][ 'roles' ] = array ( '#markup' => $default ? t ( 'All roles may use the default format' ) : ( $roles ? implode ( ', ' , $roles ) : t ( 'No roles may use this format' )));
2009-06-08 04:51:46 +00:00
$form [ $id ][ 'configure' ] = array ( '#markup' => l ( t ( 'configure' ), 'admin/settings/formats/' . $id ));
$form [ $id ][ 'delete' ] = array ( '#markup' => $default ? '' : l ( t ( 'delete' ), 'admin/settings/formats/delete/' . $id ));
2008-02-19 14:07:21 +00:00
$form [ $id ][ 'weight' ] = array ( '#type' => 'weight' , '#default_value' => $format -> weight );
2007-09-14 12:17:58 +00:00
}
$form [ 'default' ] = array ( '#type' => 'radios' , '#options' => $options , '#default_value' => variable_get ( 'filter_default_format' , 1 ));
2008-02-19 14:07:21 +00:00
$form [ 'submit' ] = array ( '#type' => 'submit' , '#value' => t ( 'Save changes' ));
2007-09-14 12:17:58 +00:00
return $form ;
}
function filter_admin_overview_submit ( $form , & $form_state ) {
// Process form submission to set the default format.
if ( is_numeric ( $form_state [ 'values' ][ 'default' ])) {
drupal_set_message ( t ( 'Default format updated.' ));
variable_set ( 'filter_default_format' , $form_state [ 'values' ][ 'default' ]);
}
2008-02-19 14:07:21 +00:00
foreach ( $form_state [ 'values' ] as $id => $data ) {
if ( is_array ( $data ) && isset ( $data [ 'weight' ])) {
// Only update if this is a form element with weight.
2009-04-25 18:01:10 +00:00
db_update ( 'filter_format' )
-> fields ( array ( 'weight' => $data [ 'weight' ]))
-> condition ( 'format' , $id )
-> execute ();
2008-02-19 14:07:21 +00:00
}
}
2009-01-21 16:58:42 +00:00
drupal_set_message ( t ( 'The text format ordering has been saved.' ));
2007-09-14 12:17:58 +00:00
}
/**
* Theme the admin overview form .
*
* @ ingroup themeable
*/
function theme_filter_admin_overview ( $form ) {
$rows = array ();
2009-08-15 06:50:29 +00:00
foreach ( element_children ( $form ) as $id ) {
$element = $form [ $id ];
2007-09-14 12:17:58 +00:00
if ( isset ( $element [ 'roles' ]) && is_array ( $element [ 'roles' ])) {
2009-08-22 14:34:23 +00:00
$element [ 'weight' ][ '#attributes' ][ 'class' ] = array ( 'text-format-order-weight' );
2007-09-14 12:17:58 +00:00
$rows [] = array (
2008-02-19 14:07:21 +00:00
'data' => array (
2008-07-24 16:27:51 +00:00
check_plain ( $element [ 'name' ][ '#markup' ]),
2008-02-19 14:07:21 +00:00
drupal_render ( $element [ 'roles' ]),
drupal_render ( $form [ 'default' ][ $id ]),
drupal_render ( $element [ 'weight' ]),
2009-02-05 19:52:02 +00:00
drupal_render ( $element [ 'configure' ]),
2008-02-19 14:07:21 +00:00
drupal_render ( $element [ 'delete' ]),
),
2009-08-22 14:34:23 +00:00
'class' => array ( 'draggable' ),
2007-09-14 12:17:58 +00:00
);
2008-02-19 14:07:21 +00:00
unset ( $form [ $id ]);
2007-09-14 12:17:58 +00:00
}
}
2008-02-19 14:07:21 +00:00
$header = array ( t ( 'Name' ), t ( 'Roles' ), t ( 'Default' ), t ( 'Weight' ), array ( 'data' => t ( 'Operations' ), 'colspan' => 2 ));
2009-03-08 21:25:18 +00:00
$output = theme ( 'table' , $header , $rows , array ( 'id' => 'text-format-order' ));
2009-02-03 18:55:32 +00:00
$output .= drupal_render_children ( $form );
2007-09-14 12:17:58 +00:00
2009-03-08 21:25:18 +00:00
drupal_add_tabledrag ( 'text-format-order' , 'order' , 'sibling' , 'text-format-order-weight' );
2008-02-19 14:07:21 +00:00
2007-09-14 12:17:58 +00:00
return $output ;
}
2007-09-17 09:16:48 +00:00
/**
2009-03-08 21:25:18 +00:00
* Menu callback ; Display a text format form .
2007-09-17 09:16:48 +00:00
*/
function filter_admin_format_page ( $format = NULL ) {
if ( ! isset ( $format -> name )) {
2009-01-21 16:58:42 +00:00
drupal_set_title ( t ( 'Add text format' ), PASS_THROUGH );
2007-09-17 09:16:48 +00:00
$format = ( object ) array ( 'name' => '' , 'roles' => '' , 'format' => '' );
}
return drupal_get_form ( 'filter_admin_format_form' , $format );
}
2007-09-14 12:17:58 +00:00
/**
2009-03-08 21:25:18 +00:00
* Generate a text format form .
2007-09-14 12:17:58 +00:00
*
* @ ingroup forms
2008-01-08 10:35:43 +00:00
* @ see filter_admin_format_form_validate ()
* @ see filter_admin_format_form_submit ()
2007-09-14 12:17:58 +00:00
*/
2007-09-17 09:16:48 +00:00
function filter_admin_format_form ( & $form_state , $format ) {
2007-09-14 12:17:58 +00:00
$default = ( $format -> format == variable_get ( 'filter_default_format' , 1 ));
if ( $default ) {
$help = t ( 'All roles for the default format must be enabled and cannot be changed.' );
$form [ 'default_format' ] = array ( '#type' => 'hidden' , '#value' => 1 );
}
$form [ 'name' ] = array ( '#type' => 'textfield' ,
2008-02-14 18:39:18 +00:00
'#title' => t ( 'Name' ),
2007-09-14 12:17:58 +00:00
'#default_value' => $format -> name ,
2009-03-08 21:25:18 +00:00
'#description' => t ( 'Specify a unique name for this text format.' ),
2007-09-14 12:17:58 +00:00
'#required' => TRUE ,
);
// Add a row of checkboxes for form group.
$form [ 'roles' ] = array ( '#type' => 'fieldset' ,
'#title' => t ( 'Roles' ),
2009-03-08 21:25:18 +00:00
'#description' => $default ? $help : t ( 'Choose which roles may use this text format. Note that roles with the "administer filters" permission can always use all text formats.' ),
2007-09-14 12:17:58 +00:00
'#tree' => TRUE ,
);
foreach ( user_roles () as $rid => $name ) {
2009-04-26 06:00:31 +00:00
$checked = strpos ( $format -> roles , " , $rid , " ) !== FALSE ;
2007-09-14 12:17:58 +00:00
$form [ 'roles' ][ $rid ] = array ( '#type' => 'checkbox' ,
'#title' => $name ,
'#default_value' => ( $default || $checked ),
);
if ( $default ) {
$form [ 'roles' ][ $rid ][ '#disabled' ] = TRUE ;
}
}
// Table with filters
2009-08-25 10:35:33 +00:00
$filter_info = filter_get_filters ();
2007-09-14 12:17:58 +00:00
$enabled = filter_list_format ( $format -> format );
$form [ 'filters' ] = array ( '#type' => 'fieldset' ,
'#title' => t ( 'Filters' ),
2009-03-08 21:25:18 +00:00
'#description' => t ( 'Choose the filters that will be used in this text format.' ),
2007-09-14 12:17:58 +00:00
'#tree' => TRUE ,
);
2009-08-25 10:35:33 +00:00
foreach ( $filter_info as $name => $filter ) {
$form [ 'filters' ][ $name ] = array (
'#type' => 'checkbox' ,
'#title' => $filter [ 'title' ],
'#default_value' => isset ( $enabled [ $name ]),
'#description' => $filter [ 'description' ],
2007-09-14 12:17:58 +00:00
);
}
2007-09-17 09:16:48 +00:00
if ( ! empty ( $format -> format )) {
2007-09-14 12:17:58 +00:00
$form [ 'format' ] = array ( '#type' => 'hidden' , '#value' => $format -> format );
// Composition tips (guidelines)
$tips = _filter_tips ( $format -> format , FALSE );
2008-12-03 19:43:21 +00:00
$tiplist = theme ( 'filter_tips' , $tips , FALSE );
2007-09-14 12:17:58 +00:00
if ( ! $tiplist ) {
2008-04-14 17:48:46 +00:00
$tiplist = '<p>' . t ( 'No guidelines available.' ) . '</p>' ;
2007-09-14 12:17:58 +00:00
}
2008-12-03 19:43:21 +00:00
else {
$tiplist .= theme ( 'filter_tips_more_info' );
}
2009-01-21 16:58:42 +00:00
$group = '<p>' . t ( 'These are the guidelines that users will see for posting in this text format. They are automatically generated from the filter settings.' ) . '</p>' ;
2007-09-14 12:17:58 +00:00
$group .= $tiplist ;
2008-07-16 21:59:29 +00:00
$form [ 'tips' ] = array ( '#markup' => '<h2>' . t ( 'Formatting guidelines' ) . '</h2>' . $group );
2007-09-14 12:17:58 +00:00
}
$form [ 'submit' ] = array ( '#type' => 'submit' , '#value' => t ( 'Save configuration' ));
return $form ;
}
/**
2009-03-08 21:25:18 +00:00
* Validate text format form submissions .
2007-09-14 12:17:58 +00:00
*/
function filter_admin_format_form_validate ( $form , & $form_state ) {
if ( ! isset ( $form_state [ 'values' ][ 'format' ])) {
2009-08-25 10:35:33 +00:00
$format_name = trim ( $form_state [ 'values' ][ 'name' ]);
$result = db_query ( " SELECT format FROM { filter_format} WHERE name = :name " , array ( ':name' => $format_name )) -> fetchField ();
2007-09-14 12:17:58 +00:00
if ( $result ) {
2009-08-21 17:28:27 +00:00
form_set_error ( 'name' , t ( 'Text format names must be unique. A format named %name already exists.' , array ( '%name' => $format_name )));
2007-09-14 12:17:58 +00:00
}
}
}
/**
2009-03-08 21:25:18 +00:00
* Process text format form submissions .
2007-09-14 12:17:58 +00:00
*/
function filter_admin_format_form_submit ( $form , & $form_state ) {
2009-08-26 04:59:26 +00:00
$format = ( object ) $form_state [ 'values' ];
$format -> format = isset ( $form_state [ 'values' ][ 'format' ]) ? $form_state [ 'values' ][ 'format' ] : NULL ;
$status = filter_format_save ( $format );
2007-09-14 12:17:58 +00:00
2009-08-26 04:59:26 +00:00
// If a new filter was added, return to the main list of filters.
// Otherwise, stay on edit filter page to show new changes.
$return = 'admin/settings/formats' ;
2007-09-14 12:17:58 +00:00
2009-08-26 04:59:26 +00:00
switch ( $status ) {
case SAVED_NEW :
drupal_set_message ( t ( 'Added text format %format.' , array ( '%format' => $format -> name )));
$return .= '/' . $format -> format ;
break ;
case SAVED_UPDATED :
drupal_set_message ( t ( 'The text format settings have been updated.' ));
break ;
2007-09-14 12:17:58 +00:00
}
$form_state [ 'redirect' ] = $return ;
return ;
}
/**
* Menu callback ; confirm deletion of a format .
*
* @ ingroup forms
2008-01-08 10:35:43 +00:00
* @ see filter_admin_delete_submit ()
2007-09-14 12:17:58 +00:00
*/
function filter_admin_delete () {
$format = arg ( 4 );
2009-04-25 18:01:10 +00:00
$format = db_query ( 'SELECT * FROM {filter_format} WHERE format = :format' , array ( ':format' => $format )) -> fetchObject ();
2007-09-14 12:17:58 +00:00
if ( $format ) {
if ( $format -> format != variable_get ( 'filter_default_format' , 1 )) {
$form [ 'format' ] = array ( '#type' => 'hidden' , '#value' => $format -> format );
$form [ 'name' ] = array ( '#type' => 'hidden' , '#value' => $format -> name );
2009-06-08 04:51:46 +00:00
return confirm_form ( $form , t ( 'Are you sure you want to delete the text format %format?' , array ( '%format' => $format -> name )), 'admin/settings/formats' , t ( 'If you have any content left in this text format, it will be switched to the default text format. This action cannot be undone.' ), t ( 'Delete' ), t ( 'Cancel' ));
2007-09-14 12:17:58 +00:00
}
else {
drupal_set_message ( t ( 'The default format cannot be deleted.' ));
2009-06-08 04:51:46 +00:00
drupal_goto ( 'admin/settings/formats' );
2007-09-14 12:17:58 +00:00
}
}
else {
drupal_not_found ();
}
}
/**
* Process filter delete form submission .
*/
function filter_admin_delete_submit ( $form , & $form_state ) {
2009-08-26 04:59:26 +00:00
filter_format_delete ( $form_state [ 'values' ][ 'format' ]);
2009-01-21 16:58:42 +00:00
drupal_set_message ( t ( 'Deleted text format %format.' , array ( '%format' => $form_state [ 'values' ][ 'name' ])));
2007-09-14 12:17:58 +00:00
2009-06-08 04:51:46 +00:00
$form_state [ 'redirect' ] = 'admin/settings/formats' ;
2007-09-14 12:17:58 +00:00
return ;
}
2007-09-17 09:16:48 +00:00
/**
* Menu callback ; display settings defined by a format ' s filters .
*/
function filter_admin_configure_page ( $format ) {
2008-10-13 00:33:05 +00:00
drupal_set_title ( t ( " Configure %format " , array ( '%format' => $format -> name )), PASS_THROUGH );
2007-09-17 09:16:48 +00:00
return drupal_get_form ( 'filter_admin_configure' , $format );
}
2007-09-14 12:17:58 +00:00
/**
2007-09-17 09:16:48 +00:00
* Build a form to change the settings for a format ' s filters .
2007-09-14 12:17:58 +00:00
*
* @ ingroup forms
*/
function filter_admin_configure ( & $form_state , $format ) {
$list = filter_list_format ( $format -> format );
2009-08-25 10:35:33 +00:00
$filter_info = filter_get_filters ();
2007-09-14 12:17:58 +00:00
$form = array ();
2009-08-25 10:35:33 +00:00
foreach ( $list as $name => $filter ) {
if ( isset ( $filter_info [ $name ][ 'settings callback' ]) && function_exists ( $filter_info [ $name ][ 'settings callback' ])) {
$form_module = call_user_func ( $filter_info [ $name ][ 'settings callback' ], $format -> format );
2009-08-13 19:53:20 +00:00
}
2007-09-14 12:17:58 +00:00
if ( isset ( $form_module ) && is_array ( $form_module )) {
$form = array_merge ( $form , $form_module );
}
}
if ( ! empty ( $form )) {
2009-01-11 21:19:19 +00:00
$form = system_settings_form ( $form , TRUE );
2007-09-14 12:17:58 +00:00
}
else {
2008-07-16 21:59:29 +00:00
$form [ 'error' ] = array ( '#markup' => t ( 'No settings are available.' ));
2007-09-14 12:17:58 +00:00
}
2007-12-21 11:58:59 +00:00
$form [ 'format' ] = array ( '#type' => 'hidden' , '#value' => $format -> format );
$form [ '#submit' ][] = 'filter_admin_configure_submit' ;
2007-09-14 12:17:58 +00:00
return $form ;
}
2007-12-21 11:58:59 +00:00
/**
* Clear the filter ' s cache when configuration settings are saved .
*/
function filter_admin_configure_submit ( $form , & $form_state ) {
2008-04-14 17:48:46 +00:00
cache_clear_all ( $form_state [ 'values' ][ 'format' ] . ':' , 'cache_filter' , TRUE );
2007-12-21 11:58:59 +00:00
}
2007-09-14 12:17:58 +00:00
/**
* Menu callback ; display form for ordering filters for a format .
2007-09-17 09:16:48 +00:00
*/
function filter_admin_order_page ( $format ) {
2008-10-13 00:33:05 +00:00
drupal_set_title ( t ( " Rearrange %format " , array ( '%format' => $format -> name )), PASS_THROUGH );
2007-09-17 09:16:48 +00:00
return drupal_get_form ( 'filter_admin_order' , $format );
}
/**
* Build the form for ordering filters for a format .
2007-09-14 12:17:58 +00:00
*
* @ ingroup forms
2008-01-08 10:35:43 +00:00
* @ see theme_filter_admin_order ()
* @ see filter_admin_order_submit ()
2007-09-14 12:17:58 +00:00
*/
function filter_admin_order ( & $form_state , $format = NULL ) {
// Get list (with forced refresh).
$filters = filter_list_format ( $format -> format );
$form [ 'weights' ] = array ( '#tree' => TRUE );
foreach ( $filters as $id => $filter ) {
2009-08-25 10:35:33 +00:00
$form [ 'names' ][ $id ] = array ( '#markup' => $filter -> title );
2007-09-14 12:17:58 +00:00
$form [ 'weights' ][ $id ] = array ( '#type' => 'weight' , '#default_value' => $filter -> weight );
}
$form [ 'format' ] = array ( '#type' => 'hidden' , '#value' => $format -> format );
$form [ 'submit' ] = array ( '#type' => 'submit' , '#value' => t ( 'Save configuration' ));
return $form ;
}
/**
* Theme filter order configuration form .
2007-12-06 09:58:34 +00:00
*
* @ ingroup themeable
2007-09-14 12:17:58 +00:00
*/
function theme_filter_admin_order ( $form ) {
$header = array ( t ( 'Name' ), t ( 'Weight' ));
$rows = array ();
foreach ( element_children ( $form [ 'names' ]) as $id ) {
// Don't take form control structures.
if ( is_array ( $form [ 'names' ][ $id ])) {
2009-08-22 14:34:23 +00:00
$form [ 'weights' ][ $id ][ '#attributes' ][ 'class' ] = array ( 'filter-order-weight' );
2007-11-20 20:13:04 +00:00
$rows [] = array (
'data' => array ( drupal_render ( $form [ 'names' ][ $id ]), drupal_render ( $form [ 'weights' ][ $id ])),
2009-08-22 14:34:23 +00:00
'class' => array ( 'draggable' ),
2007-11-20 20:13:04 +00:00
);
2007-09-14 12:17:58 +00:00
}
}
2007-11-20 20:13:04 +00:00
$output = theme ( 'table' , $header , $rows , array ( 'id' => 'filter-order' ));
2009-02-03 18:55:32 +00:00
$output .= drupal_render_children ( $form );
2007-09-14 12:17:58 +00:00
2007-11-20 20:13:04 +00:00
drupal_add_tabledrag ( 'filter-order' , 'order' , 'sibling' , 'filter-order-weight' , NULL , NULL , FALSE );
2007-11-23 13:34:55 +00:00
2007-09-14 12:17:58 +00:00
return $output ;
}
/**
* Process filter order configuration form submission .
*/
function filter_admin_order_submit ( $form , & $form_state ) {
2009-08-25 10:35:33 +00:00
foreach ( $form_state [ 'values' ][ 'weights' ] as $name => $weight ) {
2009-04-25 18:01:10 +00:00
db_update ( 'filter' )
-> fields ( array ( 'weight' => $weight ))
-> condition ( 'format' , $form_state [ 'values' ][ 'format' ])
2009-08-21 17:28:27 +00:00
-> condition ( 'name' , $name )
2009-04-25 18:01:10 +00:00
-> execute ();
2007-09-14 12:17:58 +00:00
}
drupal_set_message ( t ( 'The filter ordering has been saved.' ));
2008-04-14 17:48:46 +00:00
cache_clear_all ( $form_state [ 'values' ][ 'format' ] . ':' , 'cache_filter' , TRUE );
2007-09-14 12:17:58 +00:00
}