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);
}
}
}
}
}
