public static FieldUiTable::tablePreRender($elements)
Performs pre-render tasks on field_ui_table elements.
Parameters
array $elements: A structured array containing two sub-levels of elements. Properties used:
- #tabledrag: The value is a list of $options arrays that are passed to drupal_attach_tabledrag(). The HTML ID of the table is added to each $options array.
Return value
array The $element with prepared variables ready for field-ui-table.html.twig.
See also
\Drupal\Core\Render\Element\Table::preRenderTable()
File
- core/modules/field_ui/src/Element/FieldUiTable.php, line 44
Class
- FieldUiTable
- Provides a field_ui table element.
Namespace
Drupal\field_ui\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 | public static function tablePreRender( $elements ) { $js_settings = array (); // 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' ]; $tree = [ '' => [ 'name' => '' , 'children' => []]]; $trees = array_fill_keys( array_keys ( $regions ), $tree ); $parents = []; $children = Element::children( $elements ); $list = array_combine ( $children , $children ); // 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 ])) { // Grab parent, and remove the row from the next iteration. $parents [ $name ] = $parent ? array_merge ( $parents [ $parent ], [ $parent ]) : []; unset( $list [ $name ]); // Determine the region for the row. $region_name = call_user_func( $row [ '#region_callback' ], $row ); // Add the element in the tree. $target = & $trees [ $region_name ][ '' ]; foreach ( $parents [ $name ] as $key ) { $target = & $target [ 'children' ][ $key ]; } $target [ 'children' ][ $name ] = [ 'name' => $name , 'weight' => $row [ 'weight' ][ '#value' ]]; // Add tabledrag indentation to the first row cell. if ( $depth = count ( $parents [ $name ])) { $children = Element::children( $row ); $cell = current( $children ); $indentation = [ '#theme' => 'indentation' , '#size' => $depth , '#suffix' => isset( $row [ $cell ][ '#prefix' ]) ? $row [ $cell ][ '#prefix' ] : '' , ]; $row [ $cell ][ '#prefix' ] = \Drupal::service( 'renderer' )->render( $indentation ); } // Add row id and associate JS settings. $id = Html::getClass( $name ); $row [ '#attributes' ][ 'id' ] = $id ; if (isset( $row [ '#js_settings' ])) { $row [ '#js_settings' ] += [ 'rowHandler' => $row [ '#row_type' ], 'name' => $name , 'region' => $region_name , ]; $js_settings [ $id ] = $row [ '#js_settings' ]; } } } } // Determine rendering order from the tree structure. foreach ( $regions as $region_name => $region ) { $elements [ '#regions' ][ $region_name ][ 'rows_order' ] = array_reduce ( $trees [ $region_name ], [ static :: class , 'reduceOrder' ]); } $elements [ '#attached' ][ 'drupalSettings' ][ 'fieldUIRowsData' ] = $js_settings ; // If the custom #tabledrag is set and there is a HTML ID, add the table's // HTML ID to the options and attach the behavior. // @see \Drupal\Core\Render\Element\Table::preRenderTable() if (! empty ( $elements [ '#tabledrag' ]) && isset( $elements [ '#attributes' ][ 'id' ])) { foreach ( $elements [ '#tabledrag' ] as $options ) { $options [ 'table_id' ] = $elements [ '#attributes' ][ 'id' ]; drupal_attach_tabledrag( $elements , $options ); } } return $elements ; } |
Please login to continue.