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