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