2009-08-19 13:31:14 +00:00
< ? php
/**
* @ file
* Administrative interface for custom field type creation .
*/
2012-09-26 19:39:39 +00:00
use Drupal\field\FieldInstance ;
2012-10-15 13:57:42 +00:00
use Drupal\field_ui\FieldOverview ;
use Drupal\field_ui\DisplayOverview ;
2012-09-26 19:39:39 +00:00
2009-08-19 13:31:14 +00:00
/**
2011-11-28 07:47:32 +00:00
* Page callback : Lists all defined fields for quick reference .
*
* @ see field_ui_menu ()
2009-08-19 13:31:14 +00:00
*/
function field_ui_fields_list () {
$instances = field_info_instances ();
$field_types = field_info_field_types ();
2013-01-23 17:46:47 +00:00
$bundles = entity_get_bundles ();
2011-08-30 06:12:26 +00:00
$modules = system_rebuild_module_data ();
2012-09-26 18:26:15 +00:00
$header = array (
t ( 'Field name' ),
array ( 'data' => t ( 'Field type' ), 'class' => array ( RESPONSIVE_PRIORITY_MEDIUM )),
t ( 'Used in' ),
);
2009-08-19 13:31:14 +00:00
$rows = array ();
2010-02-11 17:44:47 +00:00
foreach ( $instances as $entity_type => $type_bundles ) {
2009-10-24 05:26:13 +00:00
foreach ( $type_bundles as $bundle => $bundle_instances ) {
foreach ( $bundle_instances as $field_name => $instance ) {
2009-10-15 12:44:36 +00:00
$field = field_info_field ( $field_name );
2011-08-30 06:12:26 +00:00
// Initialize the row if we encounter the field for the first time.
if ( ! isset ( $rows [ $field_name ])) {
$rows [ $field_name ][ 'class' ] = $field [ 'locked' ] ? array ( 'menu-disabled' ) : array ( '' );
$rows [ $field_name ][ 'data' ][ 0 ] = $field [ 'locked' ] ? t ( '@field_name (Locked)' , array ( '@field_name' => $field_name )) : $field_name ;
$module_name = $field_types [ $field [ 'type' ]][ 'module' ];
$rows [ $field_name ][ 'data' ][ 1 ] = $field_types [ $field [ 'type' ]][ 'label' ] . ' ' . t ( '(module: !module)' , array ( '!module' => $modules [ $module_name ] -> info [ 'name' ]));
}
// Add the current instance.
2012-11-21 20:03:31 +00:00
$admin_path = field_ui_bundle_admin_path ( $entity_type , $bundle );
2010-11-21 07:28:39 +00:00
$rows [ $field_name ][ 'data' ][ 2 ][] = $admin_path ? l ( $bundles [ $entity_type ][ $bundle ][ 'label' ], $admin_path . '/fields' ) : $bundles [ $entity_type ][ $bundle ][ 'label' ];
2009-10-15 12:44:36 +00:00
}
2009-08-19 13:31:14 +00:00
}
}
foreach ( $rows as $field_name => $cell ) {
$rows [ $field_name ][ 'data' ][ 2 ] = implode ( ', ' , $cell [ 'data' ][ 2 ]);
}
if ( empty ( $rows )) {
2010-06-25 19:31:07 +00:00
$output = t ( 'No fields have been defined yet.' );
2009-08-19 13:31:14 +00:00
}
else {
// Sort rows by field name.
ksort ( $rows );
2009-10-09 01:00:08 +00:00
$output = theme ( 'table' , array ( 'header' => $header , 'rows' => $rows ));
2009-08-19 13:31:14 +00:00
}
return $output ;
}
/**
2011-11-28 07:47:32 +00:00
* Displays a message listing the inactive fields of a given bundle .
2009-08-19 13:31:14 +00:00
*/
2010-02-11 17:44:47 +00:00
function field_ui_inactive_message ( $entity_type , $bundle ) {
$inactive_instances = field_ui_inactive_instances ( $entity_type , $bundle );
2009-08-19 13:31:14 +00:00
if ( ! empty ( $inactive_instances )) {
$field_types = field_info_field_types ();
$widget_types = field_info_widget_types ();
foreach ( $inactive_instances as $field_name => $instance ) {
$list [] = t ( '%field (@field_name) field requires the %widget_type widget provided by %widget_module module' , array (
'%field' => $instance [ 'label' ],
'@field_name' => $instance [ 'field_name' ],
2010-10-28 02:27:09 +00:00
'%widget_type' => isset ( $widget_types [ $instance [ 'widget' ][ 'type' ]]) ? $widget_types [ $instance [ 'widget' ][ 'type' ]][ 'label' ] : $instance [ 'widget' ][ 'type' ],
2009-08-19 13:31:14 +00:00
'%widget_module' => $instance [ 'widget' ][ 'module' ],
));
}
2009-10-09 01:00:08 +00:00
drupal_set_message ( t ( 'Inactive fields are not shown unless their providing modules are enabled. The following fields are not enabled: !list' , array ( '!list' => theme ( 'item_list' , array ( 'items' => $list )))), 'error' );
2009-08-19 13:31:14 +00:00
}
}
2010-06-26 02:06:53 +00:00
/**
2011-11-28 07:47:32 +00:00
* Determines the rendering order of an array representing a tree .
2010-06-26 02:06:53 +00:00
*
2011-11-28 07:47:32 +00:00
* Callback for array_reduce () within field_ui_table_pre_render () .
2010-06-26 02:06:53 +00:00
*/
function _field_ui_reduce_order ( $array , $a ) {
2010-09-26 23:31:36 +00:00
$array = ! isset ( $array ) ? array () : $array ;
2010-06-26 02:06:53 +00:00
if ( $a [ 'name' ]) {
$array [] = $a [ 'name' ];
}
if ( ! empty ( $a [ 'children' ])) {
uasort ( $a [ 'children' ], 'drupal_sort_weight' );
$array = array_merge ( $array , array_reduce ( $a [ 'children' ], '_field_ui_reduce_order' ));
}
return $array ;
}
/**
2010-09-11 00:03:42 +00:00
* Returns the region to which a row in the 'Manage fields' screen belongs .
2010-06-26 02:06:53 +00:00
*
2011-11-28 07:47:32 +00:00
* This function is used as a #region_callback in
2012-10-15 13:57:42 +00:00
* Drupal\field_ui\DisplayOverview :: form () . It is called during
2011-11-28 07:47:32 +00:00
* field_ui_table_pre_render () .
2010-06-26 02:06:53 +00:00
*/
2010-09-11 00:03:42 +00:00
function field_ui_field_overview_row_region ( $row ) {
switch ( $row [ '#row_type' ]) {
case 'field' :
case 'extra_field' :
2012-10-15 13:57:42 +00:00
return 'content' ;
2010-09-11 00:03:42 +00:00
case 'add_new_field' :
// If no input in 'label', assume the row has not been dragged out of the
// 'add new' section.
2012-10-15 13:57:42 +00:00
return ( ! empty ( $row [ 'label' ][ '#value' ]) ? 'content' : 'hidden' );
2010-09-11 00:03:42 +00:00
}
}
/**
* Returns the region to which a row in the 'Manage display' screen belongs .
*
2011-11-28 07:47:32 +00:00
* This function is used as a #region_callback in
2012-10-15 13:57:42 +00:00
* Drupal\field_ui\FieldOverview :: form (), and is called during
2011-11-28 07:47:32 +00:00
* field_ui_table_pre_render () .
2010-09-11 00:03:42 +00:00
*/
function field_ui_display_overview_row_region ( $row ) {
switch ( $row [ '#row_type' ]) {
case 'field' :
case 'extra_field' :
2012-10-15 13:57:42 +00:00
return ( $row [ 'format' ][ 'type' ][ '#value' ] == 'hidden' ? 'hidden' : 'content' );
2010-09-11 00:03:42 +00:00
}
}
/**
2011-11-28 07:47:32 +00:00
* Render API callback : Performs pre - render tasks on field_ui_table elements .
*
* This function is assigned as a #pre_render callback in
* field_ui_element_info () .
*
* @ see drupal_render () .
2010-09-11 00:03:42 +00:00
*/
function field_ui_table_pre_render ( $elements ) {
$js_settings = array ();
2010-06-26 02:06:53 +00:00
2010-09-11 00:03:42 +00:00
// For each region, build the tree structure from the weight and parenting
// data contained in the flat form structure, to determine row order and
// indentation.
$regions = $elements [ '#regions' ];
2010-06-26 02:06:53 +00:00
$tree = array ( '' => array ( 'name' => '' , 'children' => array ()));
2010-09-11 00:03:42 +00:00
$trees = array_fill_keys ( array_keys ( $regions ), $tree );
2010-06-26 02:06:53 +00:00
$parents = array ();
$list = drupal_map_assoc ( element_children ( $elements ));
2010-09-11 00:03:42 +00:00
2010-06-26 02:06:53 +00:00
// Iterate on rows until we can build a known tree path for all of them.
while ( $list ) {
foreach ( $list as $name ) {
$row = & $elements [ $name ];
$parent = $row [ 'parent_wrapper' ][ 'parent' ][ '#value' ];
// Proceed if parent is known.
if ( empty ( $parent ) || isset ( $parents [ $parent ])) {
2010-09-11 00:03:42 +00:00
// Grab parent, and remove the row from the next iteration.
2010-06-26 02:06:53 +00:00
$parents [ $name ] = $parent ? array_merge ( $parents [ $parent ], array ( $parent )) : array ();
unset ( $list [ $name ]);
2010-09-11 00:03:42 +00:00
// Determine the region for the row.
$function = $row [ '#region_callback' ];
$region_name = $function ( $row );
2010-06-26 02:06:53 +00:00
// Add the element in the tree.
2010-09-11 00:03:42 +00:00
$target = & $trees [ $region_name ][ '' ];
2010-06-26 02:06:53 +00:00
foreach ( $parents [ $name ] as $key ) {
$target = & $target [ 'children' ][ $key ];
}
$target [ 'children' ][ $name ] = array ( 'name' => $name , 'weight' => $row [ 'weight' ][ '#value' ]);
// Add tabledrag indentation to the first row cell.
if ( $depth = count ( $parents [ $name ])) {
2012-05-22 04:07:52 +00:00
$children = element_children ( $row );
$cell = current ( $children );
2010-06-26 02:06:53 +00:00
$row [ $cell ][ '#prefix' ] = theme ( 'indentation' , array ( 'size' => $depth )) . ( isset ( $row [ $cell ][ '#prefix' ]) ? $row [ $cell ][ '#prefix' ] : '' );
}
2010-09-11 00:03:42 +00:00
// Add row id and associate JS settings.
$id = drupal_html_class ( $name );
$row [ '#attributes' ][ 'id' ] = $id ;
2010-11-20 09:06:32 +00:00
if ( isset ( $row [ '#js_settings' ])) {
$row [ '#js_settings' ] += array (
'rowHandler' => $row [ '#row_type' ],
'name' => $name ,
'region' => $region_name ,
);
$js_settings [ $id ] = $row [ '#js_settings' ];
}
2010-06-26 02:06:53 +00:00
}
}
}
2010-09-11 00:03:42 +00:00
// Determine rendering order from the tree structure.
foreach ( $regions as $region_name => $region ) {
$elements [ '#regions' ][ $region_name ][ 'rows_order' ] = array_reduce ( $trees [ $region_name ], '_field_ui_reduce_order' );
}
2010-06-26 02:06:53 +00:00
2010-10-20 00:13:33 +00:00
$elements [ '#attached' ][ 'js' ][] = array (
'type' => 'setting' ,
'data' => array ( 'fieldUIRowsData' => $js_settings ),
);
2010-09-11 00:03:42 +00:00
return $elements ;
2010-06-26 02:06:53 +00:00
}
/**
* Returns HTML for Field UI overview tables .
*
* @ param $variables
* An associative array containing :
* - elements : An associative array containing a Form API structure to be
* rendered as a table .
*
* @ ingroup themeable
*/
function theme_field_ui_table ( $variables ) {
$elements = $variables [ 'elements' ];
$table = array ();
2010-09-11 00:03:42 +00:00
$js_settings = array ();
2010-06-26 02:06:53 +00:00
2010-09-11 00:03:42 +00:00
// Add table headers and attributes.
2010-06-26 02:06:53 +00:00
foreach ( array ( 'header' , 'attributes' ) as $key ) {
if ( isset ( $elements [ " # $key " ])) {
$table [ $key ] = $elements [ " # $key " ];
}
}
2010-09-11 00:03:42 +00:00
// Determine the colspan to use for region rows, by checking the number of
// columns in the headers.
2011-12-10 14:52:02 +00:00
$columns_count = 0 ;
2010-09-11 00:03:42 +00:00
foreach ( $table [ 'header' ] as $header ) {
2011-12-10 14:52:02 +00:00
$columns_count += ( is_array ( $header ) && isset ( $header [ 'colspan' ]) ? $header [ 'colspan' ] : 1 );
2010-09-11 00:03:42 +00:00
}
// Render rows, region by region.
foreach ( $elements [ '#regions' ] as $region_name => $region ) {
$region_name_class = drupal_html_class ( $region_name );
// Add region rows.
2012-10-15 13:57:42 +00:00
if ( isset ( $region [ 'title' ]) && empty ( $region [ 'invisible' ])) {
2010-09-11 00:03:42 +00:00
$table [ 'rows' ][] = array (
'class' => array ( 'region-title' , 'region-' . $region_name_class . '-title' ),
'no_striping' => TRUE ,
'data' => array (
2011-12-10 14:52:02 +00:00
array ( 'data' => $region [ 'title' ], 'colspan' => $columns_count ),
2010-09-11 00:03:42 +00:00
),
);
}
if ( isset ( $region [ 'message' ])) {
$class = ( empty ( $region [ 'rows_order' ]) ? 'region-empty' : 'region-populated' );
$table [ 'rows' ][] = array (
'class' => array ( 'region-message' , 'region-' . $region_name_class . '-message' , $class ),
'no_striping' => TRUE ,
'data' => array (
2011-12-10 14:52:02 +00:00
array ( 'data' => $region [ 'message' ], 'colspan' => $columns_count ),
2010-09-11 00:03:42 +00:00
),
);
}
// Add form rows, in the order determined at pre-render time.
foreach ( $region [ 'rows_order' ] as $name ) {
$element = $elements [ $name ];
$row = array ( 'data' => array ());
if ( isset ( $element [ '#attributes' ])) {
$row += $element [ '#attributes' ];
}
2010-06-26 02:06:53 +00:00
2011-10-06 00:53:47 +00:00
// Render children as table cells.
2010-09-11 00:03:42 +00:00
foreach ( element_children ( $element ) as $cell_key ) {
2011-10-06 00:53:47 +00:00
$child = & $element [ $cell_key ];
// Do not render a cell for children of #type 'value'.
if ( ! ( isset ( $child [ '#type' ]) && $child [ '#type' ] == 'value' )) {
$cell = array ( 'data' => drupal_render ( $child ));
if ( isset ( $child [ '#cell_attributes' ])) {
$cell += $child [ '#cell_attributes' ];
}
$row [ 'data' ][] = $cell ;
2010-09-11 00:03:42 +00:00
}
2010-06-26 02:06:53 +00:00
}
2010-09-11 00:03:42 +00:00
$table [ 'rows' ][] = $row ;
2010-06-26 02:06:53 +00:00
}
}
return theme ( 'table' , $table );
}
2009-08-19 13:31:14 +00:00
/**
2012-10-15 13:57:42 +00:00
* Returns the built and processed 'Manage fields' form of a bundle .
2009-08-19 13:31:14 +00:00
*
2011-11-28 07:47:32 +00:00
* The resulting form allows fields and pseudo - fields to be re - ordered .
*
2012-10-15 13:57:42 +00:00
* @ param string $entity_type
* The entity type for the fieldable entity .
* @ param string $bundle
* The bundle for the fieldable entity .
*
* @ return
* The processed form for the given entity type and bundle .
*
2011-11-28 07:47:32 +00:00
* @ see field_ui_menu ()
2012-11-22 17:57:08 +00:00
* @ see Drupal\field_ui\FieldOverview :: validate ()
* @ see Drupal\field_ui\FieldOverview :: submit ()
2011-11-28 07:47:32 +00:00
* @ ingroup forms
2009-08-19 13:31:14 +00:00
*/
2012-10-15 13:57:42 +00:00
function field_ui_field_overview ( $entity_type , $bundle ) {
2010-02-11 17:44:47 +00:00
$bundle = field_extract_bundle ( $entity_type , $bundle );
field_ui_inactive_message ( $entity_type , $bundle );
2009-08-19 13:31:14 +00:00
2012-10-15 13:57:42 +00:00
$field_overview = new FieldOverview ( $entity_type , $bundle );
2010-06-26 02:06:53 +00:00
2012-10-15 13:57:42 +00:00
$form_state = array ();
$form_state [ 'build_info' ][ 'callback' ] = array ( $field_overview , 'form' );
$form_state [ 'build_info' ][ 'args' ] = array ( $entity_type , $bundle );
2009-08-19 13:31:14 +00:00
2012-10-15 13:57:42 +00:00
return drupal_build_form ( 'field_ui_field_overview_form' , $form_state );
2009-08-19 13:31:14 +00:00
}
2012-03-12 03:00:51 +00:00
/**
* Render API callback : Checks if a field machine name is taken .
*
* @ param $value
* The machine name , not prefixed with 'field_' .
*
* @ return
* Whether or not the field machine name is taken .
*/
function _field_ui_field_name_exists ( $value ) {
// Prefix with 'field_'.
$field_name = 'field_' . $value ;
// We need to check inactive fields as well, so we can't use
// field_info_fields().
return ( bool ) field_read_fields ( array ( 'field_name' => $field_name ), array ( 'include_inactive' => TRUE ));
}
2009-08-19 13:31:14 +00:00
/**
2012-10-15 13:57:42 +00:00
* Returns the built and processed 'Manage display' form of a bundle .
2009-08-19 13:31:14 +00:00
*
2012-10-15 13:57:42 +00:00
* The resulting form allows fields and pseudo - fields to be re - ordered .
2011-11-28 07:47:32 +00:00
*
2012-10-15 13:57:42 +00:00
* @ param string $entity_type
* The entity type for the fieldable entity .
* @ param string $bundle
* The bundle for the fieldable entity .
* @ param string $view_mode
* The view mode for the fieldable entity .
*
* @ return
* The processed form for the given entity type and bundle .
2011-11-28 07:47:32 +00:00
*
* @ see field_ui_menu ()
* @ see field_ui_display_overview_multistep_submit ()
2012-10-15 13:57:42 +00:00
* @ see Drupal\field_ui\DisplayOverview :: submit ()
2011-11-28 07:47:32 +00:00
* @ ingroup forms
2009-08-19 13:31:14 +00:00
*/
2012-10-15 13:57:42 +00:00
function field_ui_display_overview ( $entity_type , $bundle , $view_mode ) {
2010-02-11 17:44:47 +00:00
$bundle = field_extract_bundle ( $entity_type , $bundle );
field_ui_inactive_message ( $entity_type , $bundle );
2010-05-23 19:10:23 +00:00
2012-10-15 13:57:42 +00:00
$display_overview = new DisplayOverview ( $entity_type , $bundle , $view_mode );
2010-05-23 19:10:23 +00:00
2012-10-15 13:57:42 +00:00
$form_state = array ();
$form_state [ 'build_info' ][ 'callback' ] = array ( $display_overview , 'form' );
$form_state [ 'build_info' ][ 'args' ] = array ( $entity_type , $bundle , $view_mode );
2010-05-23 19:10:23 +00:00
2012-10-15 13:57:42 +00:00
return drupal_build_form ( 'field_ui_display_overview_form' , $form_state );
2009-08-19 13:31:14 +00:00
}
/**
2011-11-28 07:47:32 +00:00
* Returns an array of field_type options .
2009-08-19 13:31:14 +00:00
*/
function field_ui_field_type_options () {
$options = & drupal_static ( __FUNCTION__ );
if ( ! isset ( $options )) {
$options = array ();
$field_types = field_info_field_types ();
$field_type_options = array ();
foreach ( $field_types as $name => $field_type ) {
2010-05-18 18:30:49 +00:00
// Skip field types which have no widget types, or should not be add via
// uesr interface.
if ( field_ui_widget_type_options ( $name ) && empty ( $field_type [ 'no_ui' ])) {
2009-08-19 13:31:14 +00:00
$options [ $name ] = $field_type [ 'label' ];
}
}
asort ( $options );
}
return $options ;
}
/**
2011-11-28 07:47:32 +00:00
* Returns an array of widget type options for a field type .
2009-08-19 13:31:14 +00:00
*
* If no field type is provided , returns a nested array of all widget types ,
* keyed by field type human name .
*/
function field_ui_widget_type_options ( $field_type = NULL , $by_label = FALSE ) {
$options = & drupal_static ( __FUNCTION__ );
if ( ! isset ( $options )) {
$options = array ();
$field_types = field_info_field_types ();
2012-09-26 19:39:39 +00:00
$widget_types = field_info_widget_types ();
uasort ( $widget_types , 'drupal_sort_weight' );
foreach ( $widget_types as $name => $widget_type ) {
foreach ( $widget_type [ 'field_types' ] as $widget_field_type ) {
2009-08-19 13:31:14 +00:00
// Check that the field type exists.
if ( isset ( $field_types [ $widget_field_type ])) {
$options [ $widget_field_type ][ $name ] = $widget_type [ 'label' ];
}
}
}
}
if ( isset ( $field_type )) {
return ! empty ( $options [ $field_type ]) ? $options [ $field_type ] : array ();
}
if ( $by_label ) {
$field_types = field_info_field_types ();
$options_by_label = array ();
foreach ( $options as $field_type => $widgets ) {
$options_by_label [ $field_types [ $field_type ][ 'label' ]] = $widgets ;
}
return $options_by_label ;
}
return $options ;
}
/**
2011-11-28 07:47:32 +00:00
* Returns an array of formatter options for a field type .
2009-08-19 13:31:14 +00:00
*
* If no field type is provided , returns a nested array of all formatters , keyed
* by field type .
*/
function field_ui_formatter_options ( $field_type = NULL ) {
$options = & drupal_static ( __FUNCTION__ );
if ( ! isset ( $options )) {
$field_types = field_info_field_types ();
$options = array ();
foreach ( field_info_formatter_types () as $name => $formatter ) {
2012-10-14 06:04:15 +00:00
foreach ( $formatter [ 'field_types' ] as $formatter_field_type ) {
2009-08-19 13:31:14 +00:00
// Check that the field type exists.
if ( isset ( $field_types [ $formatter_field_type ])) {
$options [ $formatter_field_type ][ $name ] = $formatter [ 'label' ];
}
}
}
}
if ( $field_type ) {
return ! empty ( $options [ $field_type ]) ? $options [ $field_type ] : array ();
}
return $options ;
}
/**
2011-11-28 07:47:32 +00:00
* Returns an array of existing fields to be added to a bundle .
2009-08-19 13:31:14 +00:00
*/
2010-02-11 17:44:47 +00:00
function field_ui_existing_field_options ( $entity_type , $bundle ) {
2012-01-03 05:54:50 +00:00
$info = array ();
2009-08-19 13:31:14 +00:00
$field_types = field_info_field_types ();
2009-11-11 06:58:24 +00:00
2010-02-20 14:28:41 +00:00
foreach ( field_info_instances () as $existing_entity_type => $bundles ) {
2009-11-11 06:58:24 +00:00
foreach ( $bundles as $existing_bundle => $instances ) {
// No need to look in the current bundle.
2010-02-20 14:28:41 +00:00
if ( ! ( $existing_bundle == $bundle && $existing_entity_type == $entity_type )) {
2009-11-11 06:58:24 +00:00
foreach ( $instances as $instance ) {
$field = field_info_field ( $instance [ 'field_name' ]);
2010-01-30 02:22:01 +00:00
// Don't show
// - locked fields,
// - fields already in the current bundle,
2010-05-18 18:30:49 +00:00
// - fields that cannot be added to the entity type,
2012-11-27 15:32:25 +00:00
// - fields that should not be added via user interface.
2010-05-18 18:30:49 +00:00
2010-01-30 02:22:01 +00:00
if ( empty ( $field [ 'locked' ])
2010-02-11 17:44:47 +00:00
&& ! field_info_instance ( $entity_type , $field [ 'field_name' ], $bundle )
2010-05-18 18:30:49 +00:00
&& ( empty ( $field [ 'entity_types' ]) || in_array ( $entity_type , $field [ 'entity_types' ]))
&& empty ( $field_types [ $field [ 'type' ]][ 'no_ui' ])) {
2012-01-03 05:54:50 +00:00
$info [ $instance [ 'field_name' ]] = array (
'type' => $field [ 'type' ],
'type_label' => $field_types [ $field [ 'type' ]][ 'label' ],
'field' => $field [ 'field_name' ],
2012-11-09 20:39:59 +00:00
'label' => $instance [ 'label' ],
2012-01-03 05:54:50 +00:00
'widget_type' => $instance [ 'widget' ][ 'type' ],
);
2009-11-11 06:58:24 +00:00
}
2009-08-19 13:31:14 +00:00
}
}
}
}
2012-01-03 05:54:50 +00:00
return $info ;
2009-08-19 13:31:14 +00:00
}
/**
2011-11-28 07:47:32 +00:00
* Form constructor for the field settings edit page .
*
* @ see field_ui_menu ()
* @ see field_ui_settings_form_submit ()
* @ ingroups forms
2009-08-19 13:31:14 +00:00
*/
2010-03-28 11:08:30 +00:00
function field_ui_field_settings_form ( $form , & $form_state , $instance ) {
$bundle = $instance [ 'bundle' ];
$entity_type = $instance [ 'entity_type' ];
$field = field_info_field ( $instance [ 'field_name' ]);
2012-12-10 12:39:37 +00:00
$form [ '#field' ] = $field ;
$form [ '#entity_type' ] = $entity_type ;
$form [ '#bundle' ] = $bundle ;
2009-08-19 13:31:14 +00:00
2009-11-08 09:24:55 +00:00
drupal_set_title ( $instance [ 'label' ]);
2009-08-19 13:31:14 +00:00
$description = '<p>' . t ( 'These settings apply to the %field field everywhere it is used. These settings impact the way that data is stored in the database and cannot be changed once data has been created.' , array ( '%field' => $instance [ 'label' ])) . '</p>' ;
// Create a form structure for the field values.
$form [ 'field' ] = array (
2012-12-10 12:39:37 +00:00
'#prefix' => $description ,
2009-08-19 13:31:14 +00:00
'#tree' => TRUE ,
);
// See if data already exists for this field.
// If so, prevent changes to the field settings.
2009-10-01 13:14:04 +00:00
$has_data = field_has_data ( $field );
2009-08-19 13:31:14 +00:00
if ( $has_data ) {
2012-12-10 12:39:37 +00:00
$form [ 'field' ][ '#prefix' ] = '<div class="messages error">' . t ( 'There is data for this field in the database. The field settings can no longer be changed.' ) . '</div>' . $form [ 'field' ][ '#prefix' ];
}
// Build the configurable field values.
$cardinality = $field [ 'cardinality' ];
$form [ 'field' ][ 'container' ] = array (
// We can't use the container element because it doesn't support the title
// or description properties.
'#type' => 'item' ,
'#field_prefix' => '<div class="container-inline">' ,
'#field_suffix' => '</div>' ,
'#title' => t ( 'Maximum number of values users can enter' ),
);
$form [ 'field' ][ 'container' ][ 'cardinality' ] = array (
'#type' => 'select' ,
'#options' => drupal_map_assoc ( range ( 1 , 5 )) + array ( FIELD_CARDINALITY_UNLIMITED => t ( 'Unlimited' )) + array ( 'other' => t ( 'More' )),
'#default_value' => ( $cardinality < 6 ) ? $cardinality : 'other' ,
);
// @todo Convert when http://drupal.org/node/1207060 gets in.
$form [ 'field' ][ 'container' ][ 'cardinality_other' ] = array (
'#type' => 'number' ,
'#default_value' => $cardinality > 5 ? $cardinality : 6 ,
'#min' => 1 ,
'#title' => t ( 'Custom value' ),
'#title_display' => 'invisible' ,
'#states' => array (
'visible' => array (
':input[name="field[container][cardinality]"]' => array ( 'value' => 'other' ),
),
),
);
if ( field_behaviors_widget ( 'multiple values' , $instance ) == FIELD_BEHAVIOR_DEFAULT ) {
$form [ 'field' ][ 'container' ][ '#description' ] = t ( '%unlimited will provide an %add-more button so users can add as many values as they like.' , array (
'%unlimited' => t ( 'Unlimited' ),
'%add-more' => t ( 'Add another item' ),
));
2009-08-19 13:31:14 +00:00
}
// Build the non-configurable field values.
$form [ 'field' ][ 'field_name' ] = array ( '#type' => 'value' , '#value' => $field [ 'field_name' ]);
$form [ 'field' ][ 'type' ] = array ( '#type' => 'value' , '#value' => $field [ 'type' ]);
$form [ 'field' ][ 'module' ] = array ( '#type' => 'value' , '#value' => $field [ 'module' ]);
$form [ 'field' ][ 'active' ] = array ( '#type' => 'value' , '#value' => $field [ 'active' ]);
2009-09-26 15:57:39 +00:00
// Add settings provided by the field module. The field module is
// responsible for not returning settings that cannot be changed if
// the field already has data.
2012-12-10 12:39:37 +00:00
$form [ 'field' ][ 'settings' ] = array (
'#weight' => 10 ,
);
2009-11-08 09:24:55 +00:00
$additions = module_invoke ( $field [ 'module' ], 'field_settings_form' , $field , $instance , $has_data );
2009-08-19 13:31:14 +00:00
if ( is_array ( $additions )) {
2012-12-10 12:39:37 +00:00
$form [ 'field' ][ 'settings' ] += $additions ;
2009-08-19 13:31:14 +00:00
}
2010-04-24 14:49:14 +00:00
$form [ 'actions' ] = array ( '#type' => 'actions' );
2010-01-03 21:01:04 +00:00
$form [ 'actions' ][ 'submit' ] = array ( '#type' => 'submit' , '#value' => t ( 'Save field settings' ));
2009-08-19 13:31:14 +00:00
return $form ;
}
2012-12-10 12:39:37 +00:00
/**
* Form validation handler for field_ui_field_edit_form () .
*
* @ see field_ui_field_settings_form_submit () .
*/
function field_ui_field_settings_form_validate ( $form , & $form_state ) {
// Validate field cardinality.
$cardinality = $form_state [ 'values' ][ 'field' ][ 'container' ][ 'cardinality' ];
$cardinality_other = $form_state [ 'values' ][ 'field' ][ 'container' ][ 'cardinality_other' ];
if ( $cardinality == 'other' && empty ( $cardinality_other )) {
form_error ( $form [ 'field' ][ 'container' ][ 'cardinality_other' ], t ( 'Number of values is required.' ));
}
}
2009-08-19 13:31:14 +00:00
/**
2011-11-28 07:47:32 +00:00
* Form submission handler for field_ui_field_settings_form () .
2009-08-19 13:31:14 +00:00
*/
function field_ui_field_settings_form_submit ( $form , & $form_state ) {
$form_values = $form_state [ 'values' ];
$field_values = $form_values [ 'field' ];
2012-12-10 12:39:37 +00:00
// Save field cardinality.
$cardinality = $field_values [ 'container' ][ 'cardinality' ];
$cardinality_other = $field_values [ 'container' ][ 'cardinality_other' ];
$cardinality_other = $form_state [ 'values' ][ 'field' ][ 'container' ][ 'cardinality_other' ];
if ( $cardinality == 'other' ) {
$cardinality = $cardinality_other ;
}
$field_values [ 'cardinality' ] = $cardinality ;
unset ( $field_values [ 'container' ]);
2009-08-19 13:31:14 +00:00
// Merge incoming form values into the existing field.
$field = field_info_field ( $field_values [ 'field_name' ]);
2010-03-27 05:52:50 +00:00
$entity_type = $form [ '#entity_type' ];
2009-08-19 13:31:14 +00:00
$bundle = $form [ '#bundle' ];
2010-02-11 17:44:47 +00:00
$instance = field_info_instance ( $entity_type , $field [ 'field_name' ], $bundle );
2009-08-19 13:31:14 +00:00
// Update the field.
$field = array_merge ( $field , $field_values );
2009-09-26 15:57:39 +00:00
try {
field_update_field ( $field );
drupal_set_message ( t ( 'Updated field %label field settings.' , array ( '%label' => $instance [ 'label' ])));
2010-02-11 17:44:47 +00:00
$form_state [ 'redirect' ] = field_ui_next_destination ( $entity_type , $bundle );
2009-09-26 15:57:39 +00:00
}
2011-10-09 14:55:32 +00:00
catch ( Exception $e ) {
2009-09-26 15:57:39 +00:00
drupal_set_message ( t ( 'Attempt to update field %label failed: %message.' , array ( '%label' => $instance [ 'label' ], '%message' => $e -> getMessage ())), 'error' );
}
2009-08-19 13:31:14 +00:00
}
/**
2011-11-28 07:47:32 +00:00
* Form constructor for the widget selection form .
*
* @ see field_ui_menu ()
* @ see field_ui_widget_type_form_submit ()
* @ ingroup forms
2009-08-19 13:31:14 +00:00
*/
2012-09-26 19:39:39 +00:00
function field_ui_widget_type_form ( $form , & $form_state , FieldInstance $instance ) {
2010-10-23 15:55:04 +00:00
drupal_set_title ( $instance [ 'label' ]);
2010-03-28 11:08:30 +00:00
$bundle = $instance [ 'bundle' ];
$entity_type = $instance [ 'entity_type' ];
2010-10-23 15:55:04 +00:00
$field_name = $instance [ 'field_name' ];
2009-08-19 13:31:14 +00:00
2010-10-23 15:55:04 +00:00
$field = field_info_field ( $field_name );
2013-01-23 17:46:47 +00:00
$bundles = entity_get_bundles ();
2010-02-11 17:44:47 +00:00
$bundle_label = $bundles [ $entity_type ][ $bundle ][ 'label' ];
2009-08-19 13:31:14 +00:00
2010-10-23 15:55:04 +00:00
$form = array (
'#bundle' => $bundle ,
'#entity_type' => $entity_type ,
'#field_name' => $field_name ,
);
2012-12-29 08:35:44 +00:00
$form [ 'widget_type' ] = array (
2009-08-19 13:31:14 +00:00
'#type' => 'select' ,
'#title' => t ( 'Widget type' ),
'#required' => TRUE ,
'#options' => field_ui_widget_type_options ( $field [ 'type' ]),
2012-09-26 19:39:39 +00:00
'#default_value' => $instance -> getWidget () -> getPluginId (),
2009-08-19 13:31:14 +00:00
'#description' => t ( 'The type of form element you would like to present to the user when creating this field in the %type type.' , array ( '%type' => $bundle_label )),
);
2010-04-24 14:49:14 +00:00
$form [ 'actions' ] = array ( '#type' => 'actions' );
$form [ 'actions' ][ 'submit' ] = array ( '#type' => 'submit' , '#value' => t ( 'Continue' ));
2009-08-19 13:31:14 +00:00
$form [ '#validate' ] = array ();
$form [ '#submit' ] = array ( 'field_ui_widget_type_form_submit' );
return $form ;
}
/**
2011-11-28 07:47:32 +00:00
* Form submission handler for field_ui_widget_type_form () .
2009-08-19 13:31:14 +00:00
*/
function field_ui_widget_type_form_submit ( $form , & $form_state ) {
$form_values = $form_state [ 'values' ];
2010-10-23 15:55:04 +00:00
$bundle = $form [ '#bundle' ];
$entity_type = $form [ '#entity_type' ];
$field_name = $form [ '#field_name' ];
// Retrieve the stored instance settings to merge with the incoming values.
$instance = field_read_instance ( $entity_type , $field_name , $bundle );
2009-08-19 13:31:14 +00:00
// Set the right module information.
$widget_type = field_info_widget_types ( $form_values [ 'widget_type' ]);
$widget_module = $widget_type [ 'module' ];
$instance [ 'widget' ][ 'type' ] = $form_values [ 'widget_type' ];
$instance [ 'widget' ][ 'module' ] = $widget_module ;
2010-10-23 15:55:04 +00:00
2009-08-19 13:31:14 +00:00
try {
field_update_instance ( $instance );
drupal_set_message ( t ( 'Changed the widget for field %label.' , array ( '%label' => $instance [ 'label' ])));
}
2011-10-09 14:55:32 +00:00
catch ( Exception $e ) {
2011-11-23 02:03:34 +00:00
drupal_set_message ( t ( 'There was a problem changing the widget for field %label.' , array ( '%label' => $instance [ 'label' ])), 'error' );
2009-08-19 13:31:14 +00:00
}
2010-02-11 17:44:47 +00:00
$form_state [ 'redirect' ] = field_ui_next_destination ( $entity_type , $bundle );
2009-08-19 13:31:14 +00:00
}
/**
2011-11-28 07:47:32 +00:00
* Form constructor for removing a field instance from a bundle .
*
* @ see field_ui_menu ()
2012-02-27 16:01:11 +00:00
* @ see field_ui_field_delete_form_submit ()
2011-11-28 07:47:32 +00:00
* @ ingroup forms
2009-08-19 13:31:14 +00:00
*/
2010-03-28 11:08:30 +00:00
function field_ui_field_delete_form ( $form , & $form_state , $instance ) {
$bundle = $instance [ 'bundle' ];
$entity_type = $instance [ 'entity_type' ];
$field = field_info_field ( $instance [ 'field_name' ]);
2012-11-21 20:03:31 +00:00
$admin_path = field_ui_bundle_admin_path ( $entity_type , $bundle );
2009-08-19 13:31:14 +00:00
2010-03-27 05:52:50 +00:00
$form [ 'entity_type' ] = array ( '#type' => 'value' , '#value' => $entity_type );
2009-08-19 13:31:14 +00:00
$form [ 'bundle' ] = array ( '#type' => 'value' , '#value' => $bundle );
$form [ 'field_name' ] = array ( '#type' => 'value' , '#value' => $field [ 'field_name' ]);
$output = confirm_form ( $form ,
t ( 'Are you sure you want to delete the field %field?' , array ( '%field' => $instance [ 'label' ])),
$admin_path . '/fields' ,
t ( 'If you have any content left in this field, it will be lost. This action cannot be undone.' ),
t ( 'Delete' ), t ( 'Cancel' ),
'confirm'
);
if ( $field [ 'locked' ]) {
unset ( $output [ 'actions' ][ 'submit' ]);
$output [ 'description' ][ '#markup' ] = t ( 'This field is <strong>locked</strong> and cannot be deleted.' );
}
return $output ;
}
/**
2011-11-28 07:47:32 +00:00
* Form submission handler for field_ui_field_delete_form () .
2010-06-25 19:31:07 +00:00
*
2011-11-28 07:47:32 +00:00
* Removes a field instance from a bundle . If the field has no more instances ,
* it will be marked as deleted too .
2009-08-19 13:31:14 +00:00
*/
function field_ui_field_delete_form_submit ( $form , & $form_state ) {
$form_values = $form_state [ 'values' ];
2009-10-15 12:44:36 +00:00
$field_name = $form_values [ 'field_name' ];
$bundle = $form_values [ 'bundle' ];
2010-03-27 05:52:50 +00:00
$entity_type = $form_values [ 'entity_type' ];
2010-02-15 22:18:35 +00:00
$field = field_info_field ( $field_name );
2010-02-11 17:44:47 +00:00
$instance = field_info_instance ( $entity_type , $field_name , $bundle );
2013-01-23 17:46:47 +00:00
$bundles = entity_get_bundles ();
2010-02-11 17:44:47 +00:00
$bundle_label = $bundles [ $entity_type ][ $bundle ][ 'label' ];
2009-08-19 13:31:14 +00:00
if ( ! empty ( $bundle ) && $field && ! $field [ 'locked' ] && $form_values [ 'confirm' ]) {
2009-10-02 14:39:43 +00:00
field_delete_instance ( $instance );
2009-08-19 13:31:14 +00:00
drupal_set_message ( t ( 'The field %field has been deleted from the %type content type.' , array ( '%field' => $instance [ 'label' ], '%type' => $bundle_label )));
}
else {
2011-11-23 02:03:34 +00:00
drupal_set_message ( t ( 'There was a problem removing the %field from the %type content type.' , array ( '%field' => $instance [ 'label' ], '%type' => $bundle_label )), 'error' );
2009-08-19 13:31:14 +00:00
}
2012-11-21 20:03:31 +00:00
$admin_path = field_ui_bundle_admin_path ( $entity_type , $bundle );
2009-08-21 02:54:46 +00:00
$form_state [ 'redirect' ] = field_ui_get_destinations ( array ( $admin_path . '/fields' ));
2011-08-30 06:12:26 +00:00
// Fields are purged on cron. However field module prevents disabling modules
// when field types they provided are used in a field until it is fully
// purged. In the case that a field has minimal or no content, a single call
// to field_purge_batch() will remove it from the system. Call this with a
// low batch limit to avoid administrators having to wait for cron runs when
// removing instances that meet this criteria.
field_purge_batch ( 10 );
2009-08-19 13:31:14 +00:00
}
/**
2011-11-28 07:47:32 +00:00
* Form constructor for the field instance settings form .
*
* @ see field_ui_menu ()
* @ see field_ui_field_edit_form_validate ()
* @ see field_ui_field_edit_form_submit ()
* @ see field_ui_field_edit_form_delete_submit ()
* @ ingroup forms
2009-08-19 13:31:14 +00:00
*/
2010-03-28 11:08:30 +00:00
function field_ui_field_edit_form ( $form , & $form_state , $instance ) {
$bundle = $instance [ 'bundle' ];
$entity_type = $instance [ 'entity_type' ];
$field = field_info_field ( $instance [ 'field_name' ]);
2013-01-23 17:46:47 +00:00
$bundles = entity_get_bundles ();
2010-03-28 11:08:30 +00:00
2012-12-10 12:39:37 +00:00
drupal_set_title ( t ( '%instance settings for %bundle' , array (
'%instance' => $instance [ 'label' ],
'%bundle' => $bundles [ $entity_type ][ $bundle ][ 'label' ],
)), PASS_THROUGH );
2009-08-19 13:31:14 +00:00
$form [ '#field' ] = $field ;
2010-11-30 23:55:11 +00:00
$form [ '#instance' ] = $instance ;
2012-09-26 19:39:39 +00:00
// Create an arbitrary entity object (used by the 'default value' widget).
$ids = ( object ) array ( 'entity_type' => $instance [ 'entity_type' ], 'bundle' => $instance [ 'bundle' ], 'entity_id' => NULL );
$form [ '#entity' ] = _field_create_entity_from_ids ( $ids );
$form [ '#entity' ] -> field_ui_default_value = TRUE ;
2009-08-19 13:31:14 +00:00
if ( ! empty ( $field [ 'locked' ])) {
$form [ 'locked' ] = array (
'#markup' => t ( 'The field %field is locked and cannot be edited.' , array ( '%field' => $instance [ 'label' ])),
);
return $form ;
}
$widget_type = field_info_widget_types ( $instance [ 'widget' ][ 'type' ]);
// Create a form structure for the instance values.
2010-11-12 02:59:30 +00:00
$form [ 'instance' ] = array (
2009-08-19 13:31:14 +00:00
'#tree' => TRUE ,
2010-11-12 02:59:30 +00:00
);
2009-08-19 13:31:14 +00:00
// Build the non-configurable instance values.
$form [ 'instance' ][ 'field_name' ] = array (
'#type' => 'value' ,
'#value' => $instance [ 'field_name' ],
);
2010-03-27 05:52:50 +00:00
$form [ 'instance' ][ 'entity_type' ] = array (
2009-10-15 12:44:36 +00:00
'#type' => 'value' ,
2010-02-11 17:44:47 +00:00
'#value' => $entity_type ,
2009-10-15 12:44:36 +00:00
);
2009-08-19 13:31:14 +00:00
$form [ 'instance' ][ 'bundle' ] = array (
'#type' => 'value' ,
'#value' => $bundle ,
);
$form [ 'instance' ][ 'widget' ][ 'weight' ] = array (
'#type' => 'value' ,
'#value' => ! empty ( $instance [ 'widget' ][ 'weight' ]) ? $instance [ 'widget' ][ 'weight' ] : 0 ,
);
// Build the configurable instance values.
$form [ 'instance' ][ 'label' ] = array (
'#type' => 'textfield' ,
'#title' => t ( 'Label' ),
'#default_value' => ! empty ( $instance [ 'label' ]) ? $instance [ 'label' ] : $field [ 'field_name' ],
'#required' => TRUE ,
'#weight' => - 20 ,
);
$form [ 'instance' ][ 'description' ] = array (
'#type' => 'textarea' ,
'#title' => t ( 'Help text' ),
'#default_value' => ! empty ( $instance [ 'description' ]) ? $instance [ 'description' ] : '' ,
'#rows' => 5 ,
2012-10-19 07:33:17 +00:00
'#description' => t ( 'Instructions to present to the user below this field on the editing form.<br />Allowed HTML tags: @tags' , array ( '@tags' => _field_filter_xss_display_allowed_tags ())) . '<br />' . t ( 'This field supports tokens.' ),
2011-08-08 17:22:08 +00:00
'#weight' => - 10 ,
);
$form [ 'instance' ][ 'required' ] = array (
'#type' => 'checkbox' ,
'#title' => t ( 'Required field' ),
'#default_value' => ! empty ( $instance [ 'required' ]),
2011-01-28 07:28:22 +00:00
'#weight' => - 5 ,
2009-08-19 13:31:14 +00:00
);
// Build the widget component of the instance.
$form [ 'instance' ][ 'widget' ][ 'type' ] = array (
'#type' => 'value' ,
'#value' => $instance [ 'widget' ][ 'type' ],
);
$form [ 'instance' ][ 'widget' ][ 'module' ] = array (
'#type' => 'value' ,
'#value' => $widget_type [ 'module' ],
);
$form [ 'instance' ][ 'widget' ][ 'active' ] = array (
'#type' => 'value' ,
'#value' => ! empty ( $field [ 'instance' ][ 'widget' ][ 'active' ]) ? 1 : 0 ,
);
// Add additional field instance settings from the field module.
2013-02-01 16:08:58 +00:00
$additions = module_invoke ( $field [ 'module' ], 'field_instance_settings_form' , $field , $instance , $form_state );
2009-08-19 13:31:14 +00:00
if ( is_array ( $additions )) {
$form [ 'instance' ][ 'settings' ] = $additions ;
2012-12-10 12:39:37 +00:00
$form [ 'instance' ][ 'settings' ][ '#weight' ] = 10 ;
2009-08-19 13:31:14 +00:00
}
2012-09-26 19:39:39 +00:00
// Add widget settings for the widget type.
$additions = $instance -> getWidget () -> settingsForm ( $form , $form_state );
$form [ 'instance' ][ 'widget' ][ 'settings' ] = $additions ? $additions : array ( '#type' => 'value' , '#value' => array ());
2012-12-10 12:39:37 +00:00
$form [ 'instance' ][ 'widget' ][ '#weight' ] = 20 ;
2009-08-19 13:31:14 +00:00
// Add handling for default value if not provided by any other module.
2012-10-06 04:45:15 +00:00
if ( field_behaviors_widget ( 'default_value' , $instance ) == FIELD_BEHAVIOR_DEFAULT && empty ( $instance [ 'default_value_function' ])) {
2009-11-24 21:38:33 +00:00
$form [ 'instance' ][ 'default_value_widget' ] = field_ui_default_value_widget ( $field , $instance , $form , $form_state );
2009-08-19 13:31:14 +00:00
}
2010-04-24 14:49:14 +00:00
$form [ 'actions' ] = array ( '#type' => 'actions' );
2011-08-08 17:22:08 +00:00
$form [ 'actions' ][ 'submit' ] = array (
'#type' => 'submit' ,
'#value' => t ( 'Save settings' )
);
$form [ 'actions' ][ 'delete' ] = array (
'#type' => 'submit' ,
'#value' => t ( 'Delete field' ),
'#submit' => array ( 'field_ui_field_edit_form_delete_submit' ),
);
2009-08-19 13:31:14 +00:00
return $form ;
}
2011-08-08 17:22:08 +00:00
/**
2011-11-28 07:47:32 +00:00
* Form submission handler for 'Delete' button in field_ui_field_edit_form () .
2011-08-08 17:22:08 +00:00
*/
function field_ui_field_edit_form_delete_submit ( $form , & $form_state ) {
$destination = array ();
if ( isset ( $_GET [ 'destination' ])) {
$destination = drupal_get_destination ();
unset ( $_GET [ 'destination' ]);
}
$instance = $form [ '#instance' ];
$form_state [ 'redirect' ] = array ( 'admin/structure/types/manage/' . $instance [ 'bundle' ] . '/fields/' . $instance [ 'field_name' ] . '/delete' , array ( 'query' => $destination ));
}
2009-08-19 13:31:14 +00:00
/**
2012-11-27 07:06:47 +00:00
* Builds the default value widget for a given field instance .
2009-08-19 13:31:14 +00:00
*/
function field_ui_default_value_widget ( $field , $instance , & $form , & $form_state ) {
2009-11-24 21:38:33 +00:00
$field_name = $field [ 'field_name' ];
2012-09-26 19:39:39 +00:00
$entity = $form [ '#entity' ];
2009-11-24 21:38:33 +00:00
$element = array (
2012-11-27 07:06:47 +00:00
'#type' => 'details' ,
2009-08-19 13:31:14 +00:00
'#title' => t ( 'Default value' ),
'#tree' => TRUE ,
'#description' => t ( 'The default value for this field, used when creating new content.' ),
2010-11-20 19:57:01 +00:00
// Stick to an empty 'parents' on this form in order not to breaks widgets
// that do not use field_widget_[field|instance]() and still access
// $form_state['field'] directly.
2010-03-03 08:01:42 +00:00
'#parents' => array (),
2009-08-19 13:31:14 +00:00
);
2012-09-26 19:39:39 +00:00
// Adjust the instance definition used for the form element. We want a
// non-required input and no description.
2009-08-19 13:31:14 +00:00
$instance [ 'required' ] = FALSE ;
$instance [ 'description' ] = '' ;
2010-11-20 19:57:01 +00:00
2012-09-26 19:39:39 +00:00
// Insert the widget. Since we do not use the "official" instance definition,
// the whole flow cannot use field_invoke_method().
$items = ( array ) $instance [ 'default_value' ];
$element += $instance -> getWidget () -> form ( $entity , LANGUAGE_NOT_SPECIFIED , $items , $element , $form_state );
2009-11-24 21:38:33 +00:00
return $element ;
2009-08-19 13:31:14 +00:00
}
/**
2011-11-28 07:47:32 +00:00
* Form validation handler for field_ui_field_edit_form () .
*
* @ see field_ui_field_edit_form_submit () .
2009-08-19 13:31:14 +00:00
*/
function field_ui_field_edit_form_validate ( $form , & $form_state ) {
2010-11-20 19:57:01 +00:00
// Take the incoming values as the $instance definition, so that the 'default
// value' gets validated using the instance settings being submitted.
2012-09-26 19:39:39 +00:00
$instance = $form [ '#instance' ];
2010-02-11 15:42:14 +00:00
$field_name = $instance [ 'field_name' ];
2012-09-26 19:39:39 +00:00
$entity = $form [ '#entity' ];
2009-08-19 13:31:14 +00:00
2010-11-20 19:57:01 +00:00
if ( isset ( $form [ 'instance' ][ 'default_value_widget' ])) {
$element = $form [ 'instance' ][ 'default_value_widget' ];
// Extract the 'default value'.
$items = array ();
2012-09-26 19:39:39 +00:00
$instance -> getWidget () -> submit ( $entity , LANGUAGE_NOT_SPECIFIED , $items , $element , $form_state );
2010-11-20 19:57:01 +00:00
2012-09-26 19:39:39 +00:00
// Grab the field definition from $form_state.
$field_state = field_form_get_state ( $element [ '#parents' ], $field_name , LANGUAGE_NOT_SPECIFIED , $form_state );
$field = $field_state [ 'field' ];
// Validate the value.
2010-11-20 19:57:01 +00:00
$errors = array ();
$function = $field [ 'module' ] . '_field_validate' ;
if ( function_exists ( $function )) {
2013-01-07 11:22:28 +00:00
$function ( NULL , $field , $instance , LANGUAGE_NOT_SPECIFIED , $items , $errors );
2010-11-20 19:57:01 +00:00
}
2012-09-26 19:39:39 +00:00
// Report errors.
2012-03-08 15:10:59 +00:00
if ( isset ( $errors [ $field_name ][ LANGUAGE_NOT_SPECIFIED ])) {
2010-11-20 19:57:01 +00:00
// Store reported errors in $form_state.
2012-03-08 15:10:59 +00:00
$field_state [ 'errors' ] = $errors [ $field_name ][ LANGUAGE_NOT_SPECIFIED ];
field_form_set_state ( $element [ '#parents' ], $field_name , LANGUAGE_NOT_SPECIFIED , $form_state , $field_state );
2012-09-26 19:39:39 +00:00
2010-11-20 19:57:01 +00:00
// Assign reported errors to the correct form element.
2012-09-26 19:39:39 +00:00
$instance -> getWidget () -> flagErrors ( $entity , LANGUAGE_NOT_SPECIFIED , $items , $element , $form_state );
2010-11-20 19:57:01 +00:00
}
2009-08-19 13:31:14 +00:00
}
}
/**
2011-11-28 07:47:32 +00:00
* Form submission handler for field_ui_field_edit_form () .
*
* @ see field_ui_field_edit_form_validate () .
2009-08-19 13:31:14 +00:00
*/
function field_ui_field_edit_form_submit ( $form , & $form_state ) {
2012-09-26 19:39:39 +00:00
$instance = $form [ '#instance' ];
$field = $form [ '#field' ];
$entity = $form [ '#entity' ];
2009-08-19 13:31:14 +00:00
2009-11-24 21:38:33 +00:00
// Handle the default value.
2010-11-20 19:57:01 +00:00
if ( isset ( $form [ 'instance' ][ 'default_value_widget' ])) {
$element = $form [ 'instance' ][ 'default_value_widget' ];
// Extract field values.
$items = array ();
2012-09-26 19:39:39 +00:00
$instance -> getWidget () -> submit ( $entity , LANGUAGE_NOT_SPECIFIED , $items , $element , $form_state );
2010-11-20 19:57:01 +00:00
$instance [ 'default_value' ] = $items ? $items : NULL ;
}
2009-08-19 13:31:14 +00:00
2012-09-26 19:39:39 +00:00
// Merge incoming values into the instance.
foreach ( $form_state [ 'values' ][ 'instance' ] as $key => $value ) {
$instance [ $key ] = $value ;
}
2009-08-19 13:31:14 +00:00
field_update_instance ( $instance );
drupal_set_message ( t ( 'Saved %label configuration.' , array ( '%label' => $instance [ 'label' ])));
2010-03-27 05:52:50 +00:00
$form_state [ 'redirect' ] = field_ui_next_destination ( $instance [ 'entity_type' ], $instance [ 'bundle' ]);
2009-08-19 13:31:14 +00:00
}
/**
2011-11-28 07:47:32 +00:00
* Extracts next redirect path from an array of multiple destinations .
*
* @ see field_ui_next_destination ()
2009-08-19 13:31:14 +00:00
*/
function field_ui_get_destinations ( $destinations ) {
$path = array_shift ( $destinations );
2010-06-21 03:11:49 +00:00
$options = drupal_parse_url ( $path );
2009-08-19 13:31:14 +00:00
if ( $destinations ) {
2010-06-21 03:11:49 +00:00
$options [ 'query' ][ 'destinations' ] = $destinations ;
2009-08-19 13:31:14 +00:00
}
2010-06-21 03:11:49 +00:00
return array ( $options [ 'path' ], $options );
2009-08-19 13:31:14 +00:00
}
/**
2011-11-28 07:47:32 +00:00
* Returns the next redirect path in a multipage sequence .
2009-08-19 13:31:14 +00:00
*/
2010-02-11 17:44:47 +00:00
function field_ui_next_destination ( $entity_type , $bundle ) {
2009-08-19 13:31:14 +00:00
$destinations = ! empty ( $_REQUEST [ 'destinations' ]) ? $_REQUEST [ 'destinations' ] : array ();
if ( ! empty ( $destinations )) {
unset ( $_REQUEST [ 'destinations' ]);
return field_ui_get_destinations ( $destinations );
}
2012-11-21 20:03:31 +00:00
$admin_path = field_ui_bundle_admin_path ( $entity_type , $bundle );
2009-08-19 13:31:14 +00:00
return $admin_path . '/fields' ;
}