field_completeness-1.0.3/field_completeness.module

field_completeness.module
<?php

/**
 * @file
 * Hook implementations for field_completeness module.
 */
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\field\Entity\FieldStorageConfig;

/**
 * Implements hook_form_FORM_ID_alter() for 'field_config_edit_form'.
 */
function field_completeness_form_field_config_edit_form_alter(array &$form, FormStateinterface $form_state) {
  $account = \Drupal::currentUser();
  /** @var \Drupal\field\FieldConfigInterface $field */
  $field = $form_state->getFormObject()->getEntity();
  if (!$account->hasPermission('administer field permissions')) {
    return $form;
  }
  $is_allowed_type = FALSE;
  /** @var \Drupal\field_completeness\FieldCompletenessManager $field_completeness_manager */
  $field_completeness_manager = \Drupal::service('field_completeness.manager');
  if ($field->getTargetEntityTypeId() == 'node') {
    $is_allowed_type = $field_completeness_manager->isAllowedContentType($field->getTargetBundle());
  }
  elseif ($field->getTargetEntityTypeId() == 'paragraph') {
    $is_allowed_type = $field_completeness_manager->isAllowedParagraphType($field->getTargetBundle());
  }

  if ($is_allowed_type) {
    $config = \Drupal::config('field_completeness.' . $field->getTargetEntityTypeId() . "." . $field->getTargetBundle() . '.settings');
    $fc_config = $field->getTargetEntityTypeId() . "." . $field->getName();
    $isIncluded = $config->get($fc_config);

    $form['field_completeness'] = [
      '#type' => 'fieldset',
      '#description' => t('Select whether this field instance should be included in completeness for its parent entity, plus any additional settings for this field type.'),
      '#title' => t('Field complete'),
    ];

    $form['field_completeness']['fc_include'] = [
      '#type' => 'checkbox',
      '#title' => t('Include in field completeness'),
      '#default_value' => $isIncluded ?? 0,
      '#description' => t('If checked, this field instance will be included in the completeness calculation for its parent entity.'),
    ];

    $submit_name = isset($form['actions']['save_continue']) ? 'save_continue' : 'submit';
    // Only add the submit handler on the submit button if the #submit property
    // is already available, otherwise this breaks the form submit function.
    if (isset($form['actions'][$submit_name]['#submit'])) {
      $form['actions'][$submit_name]['#submit'][] = 'field_completeness_form_field_config_edit_form_submit';
    }
    else {
      $form['#submit'][] = 'field_completeness_form_field_config_edit_form_submit';
    }
  }
}

/**
 * Form submission handler for element added with field_completeness_form_field_config_edit_form_alter().
 *
 * Stores the field configuration settings.
 *
 */
function field_completeness_form_field_config_edit_form_submit(array $form, FormStateInterface $form_state) {
  if ($form_state->hasValue('fc_include')) {
    $field = $form_state->getFormObject()->getEntity();
    $config = \Drupal::service('config.factory')->getEditable('field_completeness.' . $field->getTargetEntityTypeId() . '.' . $field->getTargetBundle() . '.settings');
    $fc_config = $field->getTargetEntityTypeId() . "." . $field->getName();
    $config_original = $config->get($fc_config);
    $config->set($fc_config, $form_state->getValue('fc_include'))->save();
    if ($config_original <> $config->get($fc_config)) {
      /** @var \Drupal\field_completeness\FieldCompletenessManager $field_completeness_manager */
      $field_completeness_manager = \Drupal::service('field_completeness.manager');
      $field_completeness_manager->setLatestPercentageToBundle($field->getName(), $field->getTargetBundle());
    }

    //Entity type revisions
    if ($field->getType() == 'entity_reference_revisions') {
      //Get field storage
      $paragraph_values = [];
      $field_storage = FieldStorageConfig::loadByName($field->getTargetEntityTypeId(), $field->getName());
      if (!is_null($field_storage) && $field_storage->getSetting('target_type') == 'paragraph') {
        $paragraph_types = $field->getSetting('handler_settings')['target_bundles'];
        $paragraph_config = \Drupal::service('config.factory')->getEditable('field_completeness.paragraphs.settings');
        $paragraph_values = $paragraph_config->get('allowed_types');
        foreach ($paragraph_types as $paragraph_type) {
          if ($form_state->getValue('fc_include') == 0) {
            if (($key = array_search($paragraph_type, $paragraph_values)) !== false) {
              unset($paragraph_values[$key]);
              //To reset the index after unset values
              $paragraph_values = array_values($paragraph_values);
            }
          }
          elseif ($form_state->getValue('fc_include') != 0) {
            $paragraph_values[] = $paragraph_type;
          }
        }
        $paragraph_config->set("allowed_types", $paragraph_values)->save();
      }
    }
  }
}

/**
 * Implements hook_ENTITY_TYPE_view() for node entities.
 */
function field_completeness_node_view(array &$build, EntityInterface $node, EntityViewDisplayInterface $display, $view_mode) {
  /** @var \Drupal\field_completeness\FieldCompletenessManager $field_completeness_manager */
  $field_completeness_manager = \Drupal::service('field_completeness.manager');
  $field_completeness_manager->updateOutline($node);
}

/**
 * Implements hook_ENTITY_TYPE_update() for node entities.
 */
function field_completeness_node_update(EntityInterface $node) {
  /** @var \Drupal\field_completeness\FieldCompletenessManager $field_completeness_manager */
  $field_completeness_manager = \Drupal::service('field_completeness.manager');
  $field_completeness_manager->updateOutline($node);
}

/**
 * Implements hook_ENTITY_TYPE_insert() for node entities.
 */
function field_completeness_node_insert(EntityInterface $node) {
  /** @var \Drupal\field_completeness\FieldCompletenessManager $field_completeness_manager */
  $field_completeness_manager = \Drupal::service('field_completeness.manager');
  $field_completeness_manager->updateOutline($node);
}

/**
 * Implements hook_theme().
 */
function field_completeness_theme() {
  return [
    'field_completeness_block' => [
      'variables' => [
        'attributes' => [],
      ],
    ],
  ];
}

/**
 * Implements hook_form_alter().
 */
function field_completeness_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  /** @var \Drupal\field_completeness\FieldCompletenessManager $field_completeness_manager */
  $field_completeness_manager = \Drupal::service('field_completeness.manager');
  $route_node = $field_completeness_manager->getNode();
  if ($route_node) {
    if ($field_completeness_manager->isAllowedContentType($route_node->getType())) {
      $type_form_id = 'node_' . $route_node->getType() . '_edit_form';
      if ($form_id == $type_form_id) {
        $node = $form_state->getFormObject()->getEntity();
        if (!$node->isNew() && $field_completeness_manager->isModified($node)) {
          $field_completeness_manager->updateOutline($node);
        }
      }
    }
  }
}

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

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