digital_signage_framework-2.3.x-dev/digital_signage_framework.module

digital_signage_framework.module
<?php

/**
 * @file
 * The module file for the digital_signage_framework.
 */

use Drupal\Core\Block\BlockPluginInterface;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\ContentEntityTypeInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Extension\Extension;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Url;
use Drupal\digital_signage_framework\Entity\ContentSetting;
use Drupal\digital_signage_framework\Entity\Schedule;

/**
 * Implements hook_theme().
 */
function digital_signage_framework_theme(): array {
  return [
    'digital_signage_framework' => [
      'variables' => [
        'content' => NULL,
        'full_html' => TRUE,
      ],
    ],
    'digital_signage_device' => [
      'render element' => 'elements',
    ],
    'digital_signage_schedule' => [
      'render element' => 'elements',
    ],
  ];
}

/**
 * Prepares variables for device templates.
 *
 * Default template: digital-signage-device.html.twig.
 *
 * @param array $variables
 *   An associative array containing:
 *   - elements: An associative array containing the device information and any
 *     fields attached to the entity.
 *   - attributes: HTML attributes for the containing element.
 */
function template_preprocess_digital_signage_device(array &$variables): void {
  foreach (Element::children($variables['elements']) as $key) {
    $variables['content'][$key] = $variables['elements'][$key];
  }
}

/**
 * Prepares variables for schedule templates.
 *
 * Default template: digital-signage-schedule.html.twig.
 *
 * @param array $variables
 *   An associative array containing:
 *   - elements: An associative array containing the schedule information and
 *     any fields attached to the entity.
 *   - attributes: HTML attributes for the containing element.
 */
function template_preprocess_digital_signage_schedule(array &$variables): void {
  foreach (Element::children($variables['elements']) as $key) {
    $variables['content'][$key] = $variables['elements'][$key];
  }
}

/**
 * Implements hook_entity_base_field_info().
 *
 * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
 * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
 * @throws \Drupal\Core\Entity\EntityStorageException
 */
function digital_signage_framework_entity_base_field_info(EntityTypeInterface $entity_type): array {
  if (!in_array($entity_type->id(), Drupal::service('digital_signage_content_setting.entity_types')->allDisabledIds(), TRUE)) {
    /** @var \Drupal\digital_signage_framework\EntityUpdate $service */
    $service = Drupal::service('digital_signage_content_setting.entity_update');
    if ($entity_type instanceof ContentEntityTypeInterface) {
      $service->ensureDisplayModes($entity_type);
    }
    return [
      'digital_signage' => $service->fieldDefinition(),
    ];
  }
  return [];
}

/**
 * Implements hook_entity_base_field_info_alter().
 */
function digital_signage_framework_entity_base_field_info_alter(array &$fields, EntityTypeInterface $entity_type): void {
  if ($entity_type->id() === 'digital_signage_content_setting' && $tids = Drupal::state()->get('digital_signage_content_setting.default.segments')) {
    $fields['segments']->setDefaultValue($tids);
  }
}

/**
 * Implements hook_entity_extra_field_info().
 */
function digital_signage_framework_entity_extra_field_info(): array {
  /** @var \Drupal\digital_signage_framework\EntityUpdate $service */
  $service = Drupal::service('digital_signage_content_setting.entity_update');
  return $service->addExtraFields();
}

/**
 * Implements hook_entity_view().
 *
 * @throws \Drupal\Core\Entity\EntityMalformedException
 */
function digital_signage_framework_entity_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, string $view_mode): void {
  if (!($entity instanceof ContentEntityInterface)) {
    return;
  }
  if ($display->getComponent('digital_signage_label_fit')) {
    $labelField = 'digital_signage_label_fit';
    $labelClass = 'title fittext';
  }
  elseif ($display->getComponent('digital_signage_label')) {
    $labelField = 'digital_signage_label';
    $labelClass = 'title';
  }
  else {
    $labelField = FALSE;
    $labelClass = '';
  }
  if ($labelField) {
    /** @var \Drupal\digital_signage_framework\ContentSettingInterface $settings */
    $settings = ContentSetting::load($entity->get('digital_signage')->getValue()[0]['target_id']);
    $build[$labelField] = [
      '#markup' => $settings->getLabel(),
      '#prefix' => '<div class="' . $labelClass . '">',
      '#suffix' => '</div>',
    ];
  }
  if ($display->getComponent('digital_signage_qr_self') && $entity->hasLinkTemplate('canonical')) {
    $option = [
      'absolute' => TRUE,
      'query' => ['path' => $entity->toUrl('canonical', ['absolute' => TRUE])->toString()],
    ];
    $uri = Url::fromRoute('endroid_qr_code.qr.url', [], $option)->toString();
    $build['digital_signage_qr_self'] = [
      '#theme' => 'image',
      '#uri' => $uri,
      '#attributes' => ['class' => 'digital-signage-qr-code'],
    ];
  }
}

/**
 * Implements hook_entity_presave().
 */
function digital_signage_framework_entity_presave(EntityInterface $entity): void {
  Drupal::service('digital_signage_content_setting.events')->presave($entity);
}

/**
 * Implements hook_entity_insert().
 */
function digital_signage_framework_entity_insert(EntityInterface $entity): void {
  Drupal::service('digital_signage_content_setting.events')->update($entity);
}

/**
 * Implements hook_entity_update().
 */
function digital_signage_framework_entity_update(EntityInterface $entity): void {
  Drupal::service('digital_signage_content_setting.events')->update($entity);
}

/**
 * Implements hook_entity_delete().
 */
function digital_signage_framework_entity_delete(EntityInterface $entity): void {
  Drupal::service('digital_signage_content_setting.events')->update($entity);
}

/**
 * Implements hook_form_alter().
 */
function digital_signage_framework_form_alter(array &$form, FormStateInterface $form_state): void {
  if (isset($form['digital_signage'], $form['advanced'])) {
    $form['digital_signage']['widget'][0]['#group'] = 'advanced';
    $form['digital_signage']['widget'][0]['#open'] = FALSE;
    $form['digital_signage']['widget'][0]['#weight'] = -1;
  }
}

/**
 * Implements hook_inline_entity_form_entity_form_alter().
 */
function digital_signage_framework_inline_entity_form_entity_form_alter(array &$entity_form, FormStateInterface $form_state): void {
  if ($entity_form['#entity_type'] === 'digital_signage_content_setting') {
    $entity_form['label']['#states']['disabled']['input[name="digital_signage[0][inline_entity_form][auto_label][value]"]'] = ['checked' => TRUE];
    $entity_form['emergencymode']['#states']['visible']['input[name="digital_signage[0][inline_entity_form][status][value]"]'] = ['checked' => TRUE];
    foreach ([
      'predecessor',
      'auto_label',
      'label',
      'dynamic',
      'critical',
      'priority',
      'type',
      'count',
      'devices',
      'segments',
    ] as $item) {
      /* @noinspection UnsupportedStringOffsetOperationsInspection */
      $entity_form[$item]['#states']['visible'] = [
        'input[name="digital_signage[0][inline_entity_form][status][value]"]' => ['checked' => TRUE],
        'input[name="digital_signage[0][inline_entity_form][emergencymode][value]"]' => ['checked' => FALSE],
      ];
    }
    foreach ([
      'critical',
      'priority',
      'type',
      'count',
      'devices',
      'segments',
    ] as $item) {
      /* @noinspection UnsupportedStringOffsetOperationsInspection */
      $entity_form[$item]['#states']['visible']['select[name="digital_signage[0][inline_entity_form][predecessor]"]'] = ['value' => '_none'];
    }
  }
}

/**
 * Implements hook_cron().
 */
function digital_signage_framework_cron(): void {
  if (Drupal::config('digital_signage_framework.settings')->get('cron_sync_devices')) {
    Drupal::service('plugin.manager.digital_signage_platform')->syncDevices();
  }
  if (Drupal::config('digital_signage_framework.settings')->get('cron_create_schedules')) {
    Drupal::service('schedule.manager.digital_signage_platform')->pushSchedules();
  }
}

/**
 * Implements hook_modules_installed().
 *
 * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
 */
function digital_signage_framework_modules_installed(array $modules): void {
  foreach ($modules as $module) {
    $name = 'drupal\\' . $module . '\\plugin\\digitalsignageplatform\\' . $module;
    if (class_exists($name)) {
      // At least one module provides a plugin, so lets refresh fields.
      $service = Drupal::service('digital_signage_platform.entity_update');
      $def = Drupal::entityTypeManager()->getDefinition('digital_signage_schedule', FALSE);
      if ($def) {
        $service->updateFields($def->id(), Schedule::baseFieldDefinitions($def));
      }
    }
  }
}

/**
 * Implements hook_system_info_alter().
 */
function digital_signage_framework_system_info_alter(array &$info, Extension $file, string $type): void {
  // Inject a "Overlays" and "Underlays" regions for all themes.
  if ($type === 'theme') {
    $info['regions']['digital_signage_underlays'] = 'Digital Signage Underlays';
    $info['regions']['digital_signage_overlays'] = 'Digital Signage Overlays';
  }
}

/**
 * Implements hook_block_view_alter().
 */
function digital_signage_framework_block_view_alter(array &$build, BlockPluginInterface $block): void {
  if (!empty($block->getPluginDefinition()['digitalsignage_refresh'])) {
    $build['#attributes']['data-drupal-digitalsignage-dynamic'] = 'true';
    $build['#attributes']['data-drupal-digitalsignage-blockid'] = $build['#block']->id();
  }
}

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

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