sector_content_audit-8.x-1.x-dev/sector_content_audit.module

sector_content_audit.module
<?php

/**
 * @file
 * Contains sector_content_audit.module.
 */

use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\field\Entity\FieldConfig;
use Drupal\filter\Entity\FilterFormat;

/**
 * Implements hook_help().
 */
function sector_content_audit_help($route_name, RouteMatchInterface $route_match) {
  switch ($route_name) {
    // Main module help for the sector_content_audit module.
    case 'help.page.sector_content_audit':
      $output = '';
      $output .= '<h3>' . t('About') . '</h3>';
      $output .= '<p>' . t('Sector audit add on') . '</p>';
      return $output;

    default:
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function sector_content_audit_form_node_type_edit_form_alter(&$form, FormStateInterface $form_state) {
  $contentType = $form['name']['#default_value'];
  $sectorAuditDefault = \Drupal::configFactory()->getEditable('sector_content_audit.settings')->get('sectorAudit_' . $form['type']['#default_value']);
  if (isset($form['type']) && !empty($contentType)) {
    $form['sector_content_audit'] = [
      '#type' => 'details',
      '#title' => t('Sector Audit settings'),
      '#disabled' => !empty($sectorAuditDefault),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
      '#group' => 'additional_settings',
    ];
    $form['sector_content_audit']['audit_settings'] = [
      '#type' => 'checkbox',
      '#title' => t('Add audit fields to the @type content type.', ['@type' => $contentType]),
      '#default_value' => !empty($sectorAuditDefault),
    ];
    $form['actions']['submit']['#submit'][] = '_sector_content_audit_node_type_form_submit';
  }
}

/**
 * Form submit handler to save content type settings to configuration.
 */
function _sector_content_audit_node_type_form_submit($form, FormStateInterface $form_state) {
  $machineName = $form['type']['#default_value'];
  if ($form_state->getValue('audit_settings') == 1) {
    _sector_content_audit_create_audit_fields($machineName);
  }
  \Drupal::configFactory()->getEditable('sector_content_audit.settings')
    ->set('sectorAudit_' . $form['type']['#default_value'], $form_state->getValue('audit_settings'))
    ->save();
}

/**
 * Implements hook_form_alter().
 */
function sector_content_audit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  $route = \Drupal::routeMatch()->getRouteName();
  $formStorage = $form_state->getStorage();
  if (!empty($formStorage['form_display'])) {
    $bundle = $formStorage['form_display']->get('bundle');
  }
  if (!empty($bundle)) {
    $validRoutes = [
      'node.add',
      'entity.node.edit_form',
      'entity.node.content_translation_add'
    ];
    $auditFieldsAdded = \Drupal::configFactory()->getEditable('sector_content_audit.settings')
      ->get('sectorAudit_' . $bundle);
    if (in_array($route, $validRoutes) && $auditFieldsAdded == 1) {
      $audit_fields = [
        'field_content_audit',
        'field_content_development',
        'field_audit_date',
        'field_review_notes',
        'field_document_notes',
      ];
      $form['sector_content_audit_settings'] = [
        '#type' => 'details',
        '#open' => FALSE,
        '#title' => t('Audit and review'),
        '#group' => 'advanced',
        '#access' => TRUE,
        '#weight' => 50,
      ];
      foreach ($audit_fields as $audit_field) {
        if (!empty($form[$audit_field])) {
          $form[$audit_field]['#group'] = 'sector_content_audit_settings';
        }
      }
    }
  }
}

/**
 * Create fields for Sector Content Audit on a content type.
 *
 * @param $contentType
 *
 * @throws \Drupal\Core\Entity\EntityStorageException
 */
function _sector_content_audit_create_audit_fields($contentType) {
  $auditFields = [
    'field_content_audit' => 'Content audit status',
    'field_content_development' => 'Content development status',
    'field_audit_date' => 'Audit date',
    'field_review_notes' => 'Review notes',
    'field_document_notes' => 'Document notes',
  ];
  $taxonomyFields = [
    'field_content_audit' => 'content_audit',
    'field_content_development' => 'content_development',
  ];

  foreach ($auditFields as $auditField => $label) {
    $fieldStorage = FieldStorageConfig::loadByName('node', $auditField);
    $field = FieldConfig::loadByName('node', $contentType, $auditField);
    if (empty($field)) {
      $field = FieldConfig::create([
        'field_storage' => $fieldStorage,
        'bundle' => $contentType,
        'label' => $label,
        'settings' => [
          'display_summary' => TRUE,
        ],
      ]);
      if(!empty($taxonomyFields[$auditField])) {
        $settings = [
          'handler_settings' => [
            'target_bundles' => [
              $taxonomyFields[$auditField] => $taxonomyFields[$auditField],
            ],
          ],
        ];
        $field->setSettings($settings);
      }

      $restrictedTextFormat = FilterFormat::load('restricted_basic_html');
      if($auditField == 'field_document_notes' && !empty($restrictedTextFormat)) {
        $field->setThirdPartySetting('better_formats', 'allowed_formats_toggle', 1);
        $field->setThirdPartySetting('better_formats', 'allowed_formats', ['restricted_basic_html' => 'restricted_basic_html']);
      }
      $field->save();

      $types = _sector_content_audit_get_types_by_field_name($auditField);
      // Assign widget settings for the 'default' form mode.
      \Drupal::service('entity_display.repository')->getFormDisplay('node', $contentType)
        ->setComponent($auditField, [
          'type' => $types['form'],
        ])->save();
    }
  }
}

/**
 * Get field type by field name.
 *
 * @param string $field_name
 *
 * @return array
 */
function _sector_content_audit_get_types_by_field_name($field_name) {
  $types = [];
  switch($field_name) {
    case 'field_content_audit':
      $types['form'] = 'options_buttons';
      $types['display'] = 'entity_reference_label';
      break;
    case 'field_content_development':
      $types['form'] = 'options_select';
      $types['display'] = 'entity_reference_label';
      break;
    case 'field_document_notes':
      $types['form'] = 'string_textarea';
      $types['display'] = 'text_default';
      break;
    case 'field_review_notes':
      $types['form'] = 'string_textarea';
      $types['display'] = 'basic_string';
      break;
    case 'field_audit_date':
      $types['form'] = 'datetime_default';
      $types['display'] = 'datetime_default';
      break;
  }
  return $types;
}

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

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