bricks-2.x-dev/modules/bricks_paragraphs/bricks_paragraphs.module

modules/bricks_paragraphs/bricks_paragraphs.module
<?php

/**
 * @file
 * {@inheritdoc}
 */

/**
 * Prepares variables for `field-multiple-value-form.html.twig`.
 */
function bricks_paragraphs_preprocess_field_multiple_value_form(&$variables) {
  _bricks_preprocess_tabledrag_form($variables, 'element', 'paragraphs', $variables['element']['#field_name'] . '-delta-order');

  if (isset($variables['element']['#widget']) && $variables['element']['#widget'] === 'bricks_tree_paragraphs') {
    _bricks_preprocess_bricks_tree_paragraphs_widget($variables);
  }
}

/**
 * Helper preprocess function for the bricks_tree_paragraphs tabledrag form.
 */
function _bricks_preprocess_bricks_tree_paragraphs_widget(&$variables) {
  // Paragraphs module is going to remove its order column in this case, so we
  // shouldn't bother altering it.
  // @see paragraphs_preprocess_field_multiple_value_form()
  if ((isset($variables['element']['#allow_reference_changes']) && !$variables['element']['#allow_reference_changes']) || (isset($variables['element']['#cardinality']) && $variables['element']['#cardinality'] == 1) || (isset($variables['table']['#rows']) && count($variables['table']['#rows']) == 0)) {
    // Do nothing; paragraphs module will get rid of tabledrag anyway.
  }
  else {
    $table = &$variables['table'];
    // Add header columns for tabledrag data.
    $table['#header'][] = t('Depth');
    $table['#header'][] = [
      'data' => t('Parent'),
      'class' => 'hidden',
    ];

    // We need to turn the regular tabledrag set up by
    // template_preprocess_field_multiple_value_form() into a tabledrag that
    // handles not just order but also depth.
    // This makes tabledrag keep track of indentation; we'll give it a
    // FAPI element to store the data in later.
    $table['#tabledrag'][] = [
      'action' => 'depth',
      'relationship' => 'group',
      'group' => 'bricks-depth',
    ];
    // Tabledrag always expects to see a parent column if it's being asked
    // to keep track of depth. (It assumes anyone who cares about depth has
    // hierarchical data.) We will give it a fake FAPI element to put its
    // data into, but we don't want that data and won't store it anywhere.
    $table['#tabledrag'][] = [
      'action' => 'match',
      'relationship' => 'parent',
      'group' => 'tablesort-fake-parent',
    ];
    // We're now in kind of a funny situation: because we told tabledrag
    // we want to keep track of parent data, it now thinks we want the weight
    // data divided up by parent (the way it works for, say, taxonomy terms).
    // We have to tell it no, we want to number the rows from the top to the
    // bottom regardless of hierarchy. This requires some bricks-specific JS.
    $table['#tabledrag'][0]['relationship'] = 'all';
    $table['#attached']['library'][] = 'bricks/tabledrag.relationship-all';

    // We've now told tabledrag to expect depth and parent columns, so we'll
    // add cells for those columns to every row.
    foreach ($table['#rows'] as &$row) {
      // Move the depth element into its own column.
      if (!isset($row['data'][1]['data']['depth'])) {
        continue;
      }
      $depth_element = $row['data'][1]['data']['depth'];
      $row['data'][] = [
        'data' => $depth_element,
      ];
      unset($row['data'][1]['data']['depth']);

      // Create a parent column with a fake element.
      $row['data'][] = [
        'data' => [
          '#type' => 'hidden',
          '#size' => 5,
          '#default_value' => 0,
          '#attributes' => ['class' => ['tablesort-fake-parent']],
        ],
      ];

      // Also, fix the column with the drag handle so that it can handle
      // the depth/indentation data.
      $depth = $depth_element['#value'];
      $indentation = [];
      if ($depth > 0) {
        $indentation = [
          '#theme' => 'indentation',
          '#size' => $depth,
        ];
      }
      $drag_cell = &$row['data'][0];
      $drag_cell['style'] = 'width: auto; min-width: 8em';
      $drag_cell['data'] = !empty($indentation) ? \Drupal::service('renderer')->render($indentation) : '' . $drag_cell['data'];
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc