media_library_extend_crowdriff-1.x-dev/media_library_extend_crowdriff.module

media_library_extend_crowdriff.module
<?php

/**
 * @file
 * Contains media_library_extend_crowdriff.module.
 */

use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Url;

/**
 * Implements hook_help().
 */
function media_library_extend_crowdriff_help($route_name, RouteMatchInterface $route_match) {
  if ($route_name == 'help.page.media_library_extend_crowdriff') {
    $text = file_get_contents(__DIR__ . '/README.md');
    if (!Drupal::moduleHandler()->moduleExists('markdown')) {
      return '<pre>' . $text . '</pre>';
    }
    else {
      /** @var \Drupal\markdown\PluginManager\ParserManagerInterface $parser_manager */
      $parser_manager = \Drupal::service('plugin.manager.markdown.parser');
      $parser = $parser_manager->getDefaultParser([
        'render_strategy' => ['type' => 'none'],
      ]);
      return $parser->parse($text);
    }
  }
  return NULL;
}

/**
 * Implements hook_form_alter().
 */
function media_library_extend_crowdriff_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  $valid_forms = [
    'media_crowdriff_image_edit_form',
    'media_crowdriff_video_edit_form',
  ];
  if (in_array($form_id, $valid_forms)) {
    /** @var \Drupal\media\MediaInterface $entity */
    if ($entity = $form_state->getFormObject()->getEntity()) {
      // Disabled fields.
      $form['field_crowdriff_asset_uuid']['#disabled'] = TRUE;

      // Refresh asset button.
      $button = !empty($form['actions']['submit']) ? $form['actions']['submit'] : [];
      $button['#value'] = t('Save & Refresh Crowdriff Asset');
      $button['#button_type'] = 'secondary';
      $button['#submit'] = ['_media_library_extend_crowdriff_refresh_asset'];
      $button['#weight']++;

      // Add button.
      $form['actions']['refresh_crowdriff_asset'] = $button;
    }
  }
}

/**
 * Refresh Crowdriff asset data.
 *
 * @param array $form
 *   The form.
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 *   The form state.
 *
 * @throws \Drupal\Core\Entity\EntityMalformedException
 */
function _media_library_extend_crowdriff_refresh_asset(array &$form, FormStateInterface $form_state) {
  /** @var \Drupal\media\MediaInterface $entity */
  if ($form_state->getFormObject() && $entity = $form_state->getFormObject()->getEntity()) {
    if (!$entity->get('field_crowdriff_asset_uuid')->isEmpty()) {
      if ($asset_uuid = $entity->get('field_crowdriff_asset_uuid')->value) {
        /** @var \Drupal\media_library_extend_crowdriff\CrowdriffAssetService $crowdriffAssetService */
        $crowdriffAssetService = \Drupal::service('media_library_extend_crowdriff.crowdriff_asset_service');
        $status = $crowdriffAssetService->queueAsset($entity->id(), $asset_uuid);
        $messenger = Drupal::messenger();
        if ($status) {
          $messenger->addMessage(t('Asset @id was added to refresh queue successfully.', ['@id' => $asset_uuid]));
        }
        else {
          $messenger->addError(t('Failed to add asset @id to the queue for refresh.', ['@id' => $asset_uuid]));
        }
      }
    }
  }
}

/**
 * Implements hook_cron().
 */
function media_library_extend_crowdriff_cron() {
  /** @var \Drupal\crowdriff_api\CrowdriffService $crowdriffService */
  $crowdriffService = \Drupal::service('crowdriff_api.crowdriff_service.crowdriff_service');

  // Make sure sync is enabled.
  $config = $crowdriffService->getConfig();
  if ($config->get('sync')) {
    // Get state.
    $state = Drupal::state();

    /** @var \Drupal\Core\Logger\LoggerChannelInterface $logger */
    $logger = \Drupal::service('logger.factory')->get('media_library_extend_crowdriff');

    // Get sync interval.
    $interval = $config->get('sync_interval');
    // 3600 seconds = 1 hour.
    $interval = !empty($interval) ? $interval : 3600;

    // Rate limit, so we're not syncing every minute even if cron
    // is configured to.
    $next_execution = $state->get('media_library_extend_crowdriff.next_sync');
    $next_execution = !empty($next_execution) ? $next_execution : 0;
    $request_time = Drupal::time()->getRequestTime();

    // -1 interval means run on every cron.
    $process_queues = ($interval == -1 || $request_time >= $next_execution);
    if (!$process_queues) {
      return;
    }

    /** @var \Drupal\media_library_extend_crowdriff\CrowdriffAssetService $crowdriffAssetService */
    $crowdriffAssetService = \Drupal::service('media_library_extend_crowdriff.crowdriff_asset_service');
    $crowdriffAssetService->refreshAssetQueue();

    // Get total queued items.
    $total_queue_items = $crowdriffAssetService->getTotalAssetQueuedItems();
    $logger->info('Total items in the queue: @items.', ['@items' => $total_queue_items]);

    // Set next sync.
    $state->set('media_library_extend_crowdriff.next_sync', $request_time + $interval);
  }
}

/**
 * Implements hook_entity_operation().
 */
function media_library_extend_crowdriff_entity_operation(EntityInterface $entity) {
  $operations = [];

  // Add asset refresh operation.
  if ($entity->getEntityTypeId() == 'media' && ($entity->bundle() == 'crowdriff_image' || $entity->bundle() == 'crowdriff_video')) {

    // Make sure asset has uuid and field.
    if ($entity->hasField('field_crowdriff_asset_uuid') && !$entity->get('field_crowdriff_asset_uuid')->isEmpty()) {

      // Make sure account has permission.
      $account = \Drupal::currentUser();
      if ($account->hasPermission('sync crowdriff asset')) {

        // Asset refresh operation.
        $operations['asset-refresh'] = [
          'title' => t('Refresh Crowdriff Asset'),
          'weight' => 15,
          'url' => Url::fromRoute("media_library_extend_crowdriff.refresh_asset", [
            'media_id' => $entity->id(),
            'asset_id' => $entity->get('field_crowdriff_asset_uuid')->value,
          ]),
        ];
      }
    }
  }

  return $operations;
}

/**
 * Implements hook_entity_bundle_field_info_alter().
 */
function media_library_extend_crowdriff_entity_bundle_field_info_alter(&$fields, EntityTypeInterface $entity_type, $bundle) {
  // Make sure it's a media entity.
  // Bundle must be crowdriff_image or crowdriff_video.
  if ($entity_type->id() == 'media' && ($bundle == 'crowdriff_image' || $bundle == 'crowdriff_video')) {
    // Add constraint against asset uuid field.
    if (isset($fields['field_crowdriff_asset_uuid'])) {
      $fields['field_crowdriff_asset_uuid']->addConstraint('UniqueAssetId', []);
    }
  }
}

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

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