tmgmt_smartling-8.x-4.11/modules/tmgmt_smartling_acquia_cohesion/src/AcquiaCohesionDataSuggester.php

modules/tmgmt_smartling_acquia_cohesion/src/AcquiaCohesionDataSuggester.php
<?php

namespace Drupal\tmgmt_smartling_acquia_cohesion;

use Drupal\cohesion_elements\Entity\ComponentContent;
use Drupal\tmgmt\JobItemInterface;
use Psr\Log\LoggerInterface;

class AcquiaCohesionDataSuggester implements LayoutCanvasAwareInterface {
  use LayoutCanvasAwareTrait;

  /**
   * @var LoggerInterface
   */
  protected $logger;

  /**
   * AcquiaCohesionDataSuggester constructor.
   * @param LoggerInterface $logger
   */
  public function __construct(LoggerInterface $logger) {
    $this->logger = $logger;
  }

  /**
   * @param array $jobItems
   * @return array
   */
  public function suggestCohesionContentComponents(array $jobItems) {
    $suggestions = [];

    foreach ($jobItems as $jobItem) {
      $jobItemData = $jobItem->getData();
      $suggestions = array_merge(
        $suggestions,
        $this->walkRecursiveAndGetSuggestions($jobItemData, $jobItem)
      );
    }

    return $suggestions;
  }

  /**
   * Only implemented manually because phpunit fails to run tests with closures.
   *
   * This recursion could be easily rewritten with array_walk_recursive
   * with closure but phpunit serializes data for process isolation purposes
   * which causes exception because closure can not be serialized.
   *
   * @param mixed $data
   * @param JobItemInterface $jobItem
   * @return array
   */
  protected function walkRecursiveAndGetSuggestions($data, JobItemInterface $jobItem) {
    $suggestions = [];

    if (is_string($data) && $layoutCanvas = $this->isLayoutCanvas($data)) {
      foreach ($layoutCanvas->iterateCanvas() as $element) {
        if ($element->isComponentContent()) {
          // This is the way Acquia Cohesion module uses for fetching number
          // from componentId property so used here ias well.
          $id = str_replace("cc_", "", $element->getProperty("componentContentId"));
          $componentContent = $this->loadComponentContent($id);

          if (empty($componentContent)) {
            $this->logger("Tried to suggest component content id=@id but failed to load it", [
              "@id" => $id
            ]);

            continue;
          }

          $suggestions[] = [
            'job_item' => tmgmt_job_item_create('content', $componentContent->getEntityTypeId(), $componentContent->id()),
            'reason' => t('Referenced content component'),
            'from_item' => $jobItem->id(),
          ];
        }
      };
    }

    if (is_array($data)) {
      foreach ($data as $key => $value) {
        $suggestions += $this->walkRecursiveAndGetSuggestions($value, $jobItem);
      }
    }

    return $suggestions;
  }

  /**
   * Needed for testing.
   *
   * @param int $id
   * @return ComponentContent|null
   */
  protected function loadComponentContent($id) {
    return ComponentContent::load($id);
  }
}

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

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