View source
<?php
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
define('IEF_TABLE_VIEW_MODE_NAME', 'ief_table');
function ief_table_view_mode_inline_entity_form_table_fields_alter(&$fields, $context) {
$entity_type = $context['entity_type'];
$original_fields = $fields;
$old_fields = array();
$change_apply = FALSE;
$entityManager = \Drupal::service('entity.manager');
foreach ($context['allowed_bundles'] as $bundle) {
$display = entity_load('entity_view_display', $entity_type . '.' . $bundle . '.' . IEF_TABLE_VIEW_MODE_NAME);
if (!$display || !$display instanceof EntityViewDisplayInterface || !$display
->status()) {
continue;
}
$old_fields = $fields;
if (!$change_apply) {
$fields = array();
}
$change_apply = TRUE;
$field_definitions = $entityManager
->getFieldDefinitions($entity_type, $bundle);
foreach ($field_definitions as $field_name => $field_definition) {
if (!$field_definition
->isDisplayConfigurable('view')) {
continue;
}
$display_options = $display
->getComponent($field_name);
if (empty($display_options)) {
continue;
}
$fields[$field_name] = array(
'type' => 'field',
'label' => $field_definition
->getLabel(),
'display_options' => $display_options,
'weight' => $display_options['weight'],
);
}
foreach ($old_fields as $old_field_name => $old_field) {
if (isset($fields[$old_field_name])) {
continue;
}
$display_options = $display
->getComponent($old_field_name);
if (empty($display_options)) {
continue;
}
$fields[$old_field_name] = $old_field;
$fields[$old_field_name]['weight'] = $display_options['weight'];
}
$old_fields = array();
$extra_fields = $entityManager
->getExtraFields($entity_type, $bundle);
$extra_fields = isset($extra_fields['display']) ? $extra_fields['display'] : array();
foreach ($extra_fields as $extra_field_name => $extra_field) {
$display_options = $display
->getComponent($extra_field_name);
if (empty($display_options)) {
continue;
}
$fields[$extra_field_name] = array(
'type' => 'callback',
'label' => $extra_field['label']
->render(),
'callback' => 'ief_table_view_mode_table_field_extra_field_callback',
'callback_arguments' => array(
$extra_field_name,
$entityManager,
),
'weight' => $display_options['weight'],
);
}
}
if ($change_apply) {
\Drupal::moduleHandler()
->alter('ief_table_view_mode_fields', $fields, $original_fields, $context);
}
}
function ief_table_view_mode_form_entity_view_display_edit_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
$formObject = $form_state
->getFormObject();
$entity = $formObject
->getEntity();
if ($entity
->getMode() != IEF_TABLE_VIEW_MODE_NAME) {
return;
}
foreach (\Drupal\Core\Render\Element::children($form['fields']) as $field_name) {
$field_row =& $form['fields'][$field_name];
if ($field_row['#row_type'] == 'field') {
$field_row['label'] = array(
'#prefix' => \Drupal::translation()
->translate('- Hidden -'),
'#type' => 'hidden',
'#value' => 'hidden',
);
}
}
$entityManager = \Drupal::service('entity.manager');
$found_ief_fields = FALSE;
$entity_type = $form['#entity_type'];
$bundle = $form['#bundle'];
$extra_fields = $entityManager
->getExtraFields($entity_type, $bundle);
$extra_fields = isset($extra_fields['display']) ? $extra_fields['display'] : array();
$inlineHandler = $entityManager
->getHandler($entity_type, 'inline_form');
$entityTypeBundleInfo = \Drupal::service('entity_type.bundle.info');
$bundles = $entityTypeBundleInfo
->getBundleInfo($entity_type);
$table_fields = $inlineHandler
->getTableFields(array_keys($bundles));
foreach ($table_fields as $name => $table_field) {
if (!in_array($name, $form['#fields']) || !in_array($name, $form['#extra'])) {
$found_ief_fields = TRUE;
$form['#extra'][] = $name;
$display = array(
'weight' => $table_field['weight'],
'visible' => TRUE,
);
_ief_table_view_mode_add_extra_field($form['fields'], $name, $table_field, $display, $entity, $formObject);
}
}
if ($found_ief_fields) {
$form['ief_table_view_mode_info'] = array(
'#markup' => '* ' . \Drupal::translation()
->translate('These fields come from the original definition of IEF.'),
);
}
}
function ief_table_view_mode_table_field_extra_field_callback($entity, $variables, $field_name, $entityManager) {
$render_controller = $entityManager
->getViewBuilder($entity
->getEntityTypeId());
$view = $render_controller
->view($entity, IEF_TABLE_VIEW_MODE_NAME);
$render = $render_controller
->build($view);
return isset($render[$field_name]) ? $render[$field_name] : array();
}
function ief_table_view_mode_field_widget_third_party_settings_form(\Drupal\Core\Field\WidgetInterface $plugin, \Drupal\Core\Field\FieldDefinitionInterface $field_definition, $form_mode, $form, \Drupal\Core\Form\FormStateInterface $form_state) {
$element = array();
if ($plugin
->getPluginId() != 'inline_entity_form_complex') {
return $element;
}
$entity_type = $field_definition
->getSetting('target_type');
$entityManager = \Drupal::service('entity.manager');
$entityDefinition = $entityManager
->getDefinition($entity_type);
$element['ief_table_view_mode'] = array(
'#type' => 'container',
);
$field_ui_base_route = $entityDefinition
->get('field_ui_base_route');
if (!$field_ui_base_route) {
$message = \Drupal::translation()
->translate('It is not posible to add fields to the table widget because the %entity_name entity does not have Manage display.', array(
'%entity_name' => $entityDefinition
->getLabel(),
));
$element['ief_table_view_mode']['info'] = array(
'#markup' => $message,
);
return $element;
}
$message = \Drupal::translation()
->translate('It is posible to add fields to the table widget, creatring and activating the view mode %name_view_name. Then go to Manage display of %entity_name entity.', array(
'%name_view_name' => $entity_type . '.' . IEF_TABLE_VIEW_MODE_NAME,
'%entity_name' => $entityDefinition
->getLabel(),
));
$element['ief_table_view_mode']['info'] = array(
'#markup' => $message,
);
return $element;
}
function _ief_table_view_mode_add_extra_field(&$element, $field_id, $extra_field, $display, $entity, $formObject) {
$display_options = $entity
->getComponent($field_id);
$regions = array_keys($formObject
->getRegions());
$regions_options = $formObject
->getRegionOptions();
$label = $extra_field['label'] instanceof TranslatableMarkup ? $extra_field['label']
->render() : $extra_field['label'];
$element[$field_id] = array(
'#attributes' => array(
'class' => array(
'draggable',
'tabledrag-leaf',
),
),
'#row_type' => 'extra_field',
'#region_callback' => array(
$formObject,
'getRowRegion',
),
'#js_settings' => array(
'rowHandler' => 'field',
),
'human_name' => array(
'#markup' => $label . '*',
),
'weight' => array(
'#type' => 'textfield',
'#title' => \Drupal::translation()
->translate('Weight for @title', array(
'@title' => $label,
)),
'#title_display' => 'invisible',
'#default_value' => $display_options ? $display_options['weight'] : 0,
'#size' => 3,
'#attributes' => array(
'class' => array(
'field-weight',
),
),
),
'parent_wrapper' => array(
'parent' => array(
'#type' => 'select',
'#title' => \Drupal::translation()
->translate('Parents for @title', array(
'@title' => $label,
)),
'#title_display' => 'invisible',
'#options' => array_combine($regions, $regions),
'#empty_value' => '',
'#attributes' => array(
'class' => array(
'js-field-parent',
'field-parent',
),
),
'#parents' => array(
'fields',
$field_id,
'parent',
),
),
'hidden_name' => array(
'#type' => 'hidden',
'#default_value' => $field_id,
'#attributes' => array(
'class' => array(
'field-name',
),
),
),
),
'region' => [
'#type' => 'select',
'#title' => \Drupal::translation()
->translate('Region for @title', [
'@title' => $extra_field['label'],
]),
'#title_display' => 'invisible',
'#options' => $regions_options,
'#default_value' => $display_options ? $display_options['region'] : 'hidden',
'#attributes' => [
'class' => [
'field-region',
],
],
],
'plugin' => [
'type' => [
'#type' => 'hidden',
'#value' => $display_options ? 'visible' : 'hidden',
'#parents' => [
'fields',
$field_id,
'type',
],
'#attributes' => [
'class' => [
'field-plugin-type',
],
],
],
],
'settings_summary' => [],
'settings_edit' => [],
);
}