scheduled_publish-8.x-3.9/scheduled_publish.module
scheduled_publish.module
<?php
/**
* @file
* Contains scheduled_publish.module.
*/
use Drupal\Core\Database\Database;
use Drupal\Core\Field\FieldTypeCategoryManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Markup;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\TypedData\TranslatableInterface;
use Drupal\workflows\Entity\Workflow;
/**
* Implements hook_help().
*/
function scheduled_publish_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
// Main module help for the scheduled_publish module.
case 'help.page.scheduled_publish':
$output = '';
$output .= '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('This module allows the user to create a scheduler for content moderation') . '</p>';
return $output;
default:
}
}
/**
* Implements hook_cron().
*/
function scheduled_publish_cron() {
/**
* @var \Drupal\scheduled_publish\Service\ScheduledPublishCron $scheduledPublishUpdate
*/
$scheduledPublishUpdate = \Drupal::service('scheduled_publish.update');
$scheduledPublishUpdate->doUpdate();
}
/**
* Get all scheduled publish fields of nodes.
*/
function scheduled_publish_get_node_fields() {
$fields = \Drupal::service('entity_field.manager')
->getFieldStorageDefinitions('node');
$scheduledFields = [];
foreach ($fields as $fieldName => $field) {
if (strpos($fieldName, 'field_') !== FALSE) {
if ($field->getType() === 'scheduled_publish') {
$scheduledFields[] = $fieldName;
}
}
}
return $scheduledFields;
}
/**
* Get all node workflow states.
*/
function scheduled_publish_get_node_workflow_states() {
$states = [];
$workflow_objects = Workflow::loadMultipleByType('content_moderation');
foreach ($workflow_objects as $workflow) {
$type_settings = $workflow->get('type_settings');
if (isset($type_settings['entity_types']['node']) && $type_settings['entity_types']['node']) {
foreach ($type_settings['states'] as $key => $val) {
$states[$key] = $val['label'];
}
}
}
return $states;
}
/**
* Implements hook_views_data_alter().
*/
function scheduled_publish_views_data_alter(array &$data) {
// Create a dynamic data entry for Views based on the
// first available scheduled publishing field.
$fields = scheduled_publish_get_node_fields();
if ($fields && isset($data['node__' . $fields[0]])) {
$field = array_shift($fields);
$field_table = 'node__' . $field;
$state_field = $field . '_moderation_state';
$value_field = $field . '_value';
// Results from the base table.
$db_connection = Database::getConnection();
$query = $db_connection->select($field_table, 'ft');
$query->fields('ft');
// Add results from other field tables via union.
foreach ($fields as $key => $f_name) {
$union = $db_connection->select('node__' . $f_name, 'ft' . $key);
$union->fields('ft' . $key);
$query->union($union);
}
// Change values to make this have a static configuration
// and titles different from the base entry.
$data['scheduled_publish_dynamic']['table'] = $data[$field_table]['table'];
unset($data['scheduled_publish_dynamic']['table']['join']['node_field_data']['table']);
$data['scheduled_publish_dynamic']['table']['join']['node_field_data']['table formula'] = $query;
$data['scheduled_publish_dynamic']['sp_dynamic'] = $data[$field_table][$field];
$data['scheduled_publish_dynamic']['sp_dynamic']['title'] = t('Scheduled publish dynamic');
$data['scheduled_publish_dynamic']['sp_dynamic']['title short'] = t('SP dynamic');
$data['scheduled_publish_dynamic']['sp_dynamic_moderation_state'] = $data[$field_table][$state_field];
$data['scheduled_publish_dynamic']['sp_dynamic_moderation_state']['title'] = t('Scheduled publish dynamic (moderation state)');
$data['scheduled_publish_dynamic']['sp_dynamic_moderation_state']['title short'] = t('SP dynamic (moderation state)');
if (isset($data[$field_table]['delta'])) {
$data['scheduled_publish_dynamic']['delta'] = $data[$field_table]['delta'];
}
else {
// When field don't have delta, use 0 as default delta.
$data['scheduled_publish_dynamic']['delta']['field'] = [
'id' => 'standard',
'default' => 0,
];
$data['scheduled_publish_dynamic']['delta']['group'] = $data[$field_table][$field]['group'] ?? t('Content');
}
$data['scheduled_publish_dynamic']['delta']['title'] = t('Scheduled publish dynamic (delta)');
$data['scheduled_publish_dynamic']['delta']['title short'] = t('SP dynamic (delta)');
$data['scheduled_publish_dynamic']['sp_dynamic_value'] = $data[$field_table][$value_field];
$data['scheduled_publish_dynamic']['sp_dynamic_value']['title'] = t('Scheduled publish dynamic (value)');
$data['scheduled_publish_dynamic']['sp_dynamic_value']['title short'] = t('SP dynamic (value)');
}
}
/**
* Implements hook_entity_display_build_alter().
*/
function scheduled_publish_entity_display_build_alter(&$build, $context) {
// This is necessary to display field values included in
// scheduled_publish_views_data_alter via union.
if ($context['view_mode'] === '_custom') {
$fields = scheduled_publish_get_node_fields();
$first_field = array_shift($fields);
$components = $context['display']->getComponents();
if (isset($components[$first_field]) && !isset($build[$first_field])) {
foreach ($fields as $field) {
if ($context['entity']->hasField($field)) {
// Based on Drupal\Core\Entity\Entity buildMultiple() method.
$context['display']->setComponent($field, $components[$first_field]);
$formatter = $context['display']->getRenderer($field);
$items = $context['entity']->get($field);
$items->filterEmptyItems();
$grouped_items[$context['entity']->id()] = $items;
$formatter->prepareView($grouped_items);
$field_access = $items->access('view', NULL, TRUE);
if ($context['entity'] instanceof TranslatableInterface && $context['entity']->isTranslatable()) {
$view_langcode = $context['entity']->language()->getId();
}
else {
$view_langcode = NULL;
}
$build[$first_field] = $field_access->isAllowed() ? $formatter->view($items, $view_langcode) : [];
}
}
}
}
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function scheduled_publish_form_views_exposed_form_alter(&$form, FormStateInterface $form_state, $form_id) {
// Turn scheduled publish view moderation state filter
// into a select with available options from node workflows.
$view = $form_state->getStorage('view');
if ($view['view']->id() == 'scheduled_publish') {
if (isset($form['moderation_state'])) {
$options = ['' => t('- Any -')];
$options = array_merge($options, scheduled_publish_get_node_workflow_states());
$form['moderation_state']['#type'] = 'select';
$form['moderation_state']['#options'] = $options;
unset($form['moderation_state']['#size']);
}
}
}
/**
* Implements hook_preprocess_HOOK().
*/
function scheduled_publish_preprocess_views_view_table(&$variables) {
// Adjust moderation state display to be more user-friendly.
if ($variables['view']->id() == 'scheduled_publish') {
$states = scheduled_publish_get_node_workflow_states();
foreach ($variables['rows'] as $key => $row) {
if (isset($row['columns']['sp_dynamic_1']['content'][0]['field_output']['#markup'])) {
$val = $row['columns']['sp_dynamic_1']['content'][0]['field_output']['#markup']->__toString();
if (isset($states[$val])) {
$new_val = $states[$val] . ' (' . $val . ')';
$variables['rows'][$key]['columns']['sp_dynamic_1']['content'][0]['field_output']['#markup'] =
Markup::create($new_val);
}
}
}
}
}
/**
* Implements hook_field_type_category_info_alter().
*/
function scheduled_publish_field_type_category_info_alter(array &$categories) {
$categories[FieldTypeCategoryManagerInterface::FALLBACK_CATEGORY]['libraries'][] = 'scheduled_publish/scheduled-publish-icon';
}
