public static Table::processTable(&$element, FormStateInterface $form_state, &$complete_form)
#process callback for #type 'table' to add tableselect support.
Parameters
array $element: An associative array containing the properties and children of the table element.
\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.
array $complete_form: The complete form structure.
Return value
array The processed element.
File
- core/lib/Drupal/Core/Render/Element/Table.php, line 134
Class
- Table
- Provides a render element for a table.
Namespace
Drupal\Core\Render\Element
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | public static function processTable(& $element , FormStateInterface $form_state , & $complete_form ) { if ( $element [ '#tableselect' ]) { if ( $element [ '#multiple' ]) { $value = is_array ( $element [ '#value' ]) ? $element [ '#value' ] : array (); } // Advanced selection behavior makes no sense for radios. else { $element [ '#js_select' ] = FALSE; } // Add a "Select all" checkbox column to the header. // @todo D8: Rename into #select_all? if ( $element [ '#js_select' ]) { $element [ '#attached' ][ 'library' ][] = 'core/drupal.tableselect' ; array_unshift ( $element [ '#header' ], array ( 'class' => array ( 'select-all' ))); } // Add an empty header column for radio buttons or when a "Select all" // checkbox is not desired. else { array_unshift ( $element [ '#header' ], '' ); } if (!isset( $element [ '#default_value' ]) || $element [ '#default_value' ] === 0) { $element [ '#default_value' ] = array (); } // Create a checkbox or radio for each row in a way that the value of the // tableselect element behaves as if it had been of #type checkboxes or // radios. foreach (Element::children( $element ) as $key ) { $row = & $element [ $key ]; // Prepare the element #parents for the tableselect form element. // Their values have to be located in child keys (#tree is ignored), // since Table::validateTable() has to be able to validate whether input // (for the parent #type 'table' element) has been submitted. $element_parents = array_merge ( $element [ '#parents' ], array ( $key )); // Since the #parents of the tableselect form element will equal the // #parents of the row element, prevent FormBuilder from auto-generating // an #id for the row element, since // \Drupal\Component\Utility\Html::getUniqueId() would automatically // append a suffix to the tableselect form element's #id otherwise. $row [ '#id' ] = HtmlUtility::getUniqueId( 'edit-' . implode( '-' , $element_parents ) . '-row' ); // Do not overwrite manually created children. if (!isset( $row [ 'select' ])) { // Determine option label; either an assumed 'title' column, or the // first available column containing a #title or #markup. // @todo Consider to add an optional $element[$key]['#title_key'] // defaulting to 'title'? unset( $label_element ); $title = NULL; if (isset( $row [ 'title' ][ '#type' ]) && $row [ 'title' ][ '#type' ] == 'label' ) { $label_element = & $row [ 'title' ]; } else { if (! empty ( $row [ 'title' ][ '#title' ])) { $title = $row [ 'title' ][ '#title' ]; } else { foreach (Element::children( $row ) as $column ) { if (isset( $row [ $column ][ '#title' ])) { $title = $row [ $column ][ '#title' ]; break ; } if (isset( $row [ $column ][ '#markup' ])) { $title = $row [ $column ][ '#markup' ]; break ; } } } if (isset( $title ) && $title !== '' ) { $title = t( 'Update @title' , array ( '@title' => $title )); } } // Prepend the select column to existing columns. $row = array ( 'select' => array ()) + $row ; $row [ 'select' ] += array ( '#type' => $element [ '#multiple' ] ? 'checkbox' : 'radio' , '#id' => HtmlUtility::getUniqueId( 'edit-' . implode( '-' , $element_parents )), // @todo If rows happen to use numeric indexes instead of string keys, // this results in a first row with $key === 0, which is always FALSE. '#return_value' => $key , '#attributes' => $element [ '#attributes' ], '#wrapper_attributes' => array ( 'class' => array ( 'table-select' ), ), ); if ( $element [ '#multiple' ]) { $row [ 'select' ][ '#default_value' ] = isset( $value [ $key ]) ? $key : NULL; $row [ 'select' ][ '#parents' ] = $element_parents ; } else { $row [ 'select' ][ '#default_value' ] = ( $element [ '#default_value' ] == $key ? $key : NULL); $row [ 'select' ][ '#parents' ] = $element [ '#parents' ]; } if (isset( $label_element )) { $label_element [ '#id' ] = $row [ 'select' ][ '#id' ] . '--label' ; $label_element [ '#for' ] = $row [ 'select' ][ '#id' ]; $row [ 'select' ][ '#attributes' ][ 'aria-labelledby' ] = $label_element [ '#id' ]; $row [ 'select' ][ '#title_display' ] = 'none' ; } else { $row [ 'select' ][ '#title' ] = $title ; $row [ 'select' ][ '#title_display' ] = 'invisible' ; } } } } return $element ; } |
Please login to continue.