niobi-8.x-2.0-alpha4/modules/niobi_form/modules/niobi_app/src/Plugin/ContextualReport/OrphanSubmissions.php

modules/niobi_form/modules/niobi_app/src/Plugin/ContextualReport/OrphanSubmissions.php
<?php

namespace Drupal\niobi_app\Plugin\ContextualReport;

use Drupal\Component\Render\FormattableMarkup;
use Drupal\contextual_reports\Plugin\ContextualReportBase;
use Drupal\niobi_app\Entity\NiobiApplication;
use Drupal\webform\Entity\WebformSubmission;

/**
 * Orphan Submissions Report
 * @ContextualReport (
 *   id = "niobi_app_orphan_submissions",
 *   label = "Orphan Submissions",
 *   category = "niobi_app_troubleshooting"
 * )
 */
class OrphanSubmissions extends ContextualReportBase  {

  /**
   * @param $application_id
   * @param $submission
   * @return bool
   */
  public static function isOrphan($application_id, WebformSubmission $submission) {
    // Look for an application with a given UUID.
    $query = \Drupal::entityQuery('niobi_application');
    $query->condition('uuid', $application_id);
    // Also check that the application has the submission.
    $query->orConditionGroup()
      ->condition('field_nomination_submissions', $submission->id(), 'IN')
      ->condition('field_application_submissions', $submission->id(), 'IN')
      ->condition('field_review_submissions', $submission->id(), 'IN');
    $result = $query->execute();

    // If we couldn't find an application, then the submission is an orphan.
    return empty($result);
  }

  public static function getPotentialMatches($application_id, WebformSubmission $submission) {
    // Check for matching authors.
    $query = \Drupal::entityQuery('niobi_application')
      ->condition('user_id', $submission->getOwnerId());
    $result = $query->execute();
    if ($result) {
      return NiobiApplication::loadMultiple($result);
    }

    // If we couldn't find an application, then we will need to manual search.
    return [];
  }

  /**
   * @param mixed $data
   * @param array $params
   * @return array
   */
  public static function generateReport($data, array $params = []) {

    $entities = $data;

    $data = [];
    foreach ($entities as $sub_id => $submission) {
      /* @var $submission \Drupal\webform\Entity\WebformSubmission */
      $is_orphan = self::isOrphan($submission->getElementData('application_id'), $submission);
      if ($is_orphan) {
        $data[$sub_id] = [
          'application_id' => $submission->getElementData('application_id'),
          'webform' => $submission->getWebform(),
          'submission' => $submission,
          'user' => $submission->getOwner(),
          'uuid' => $submission->uuid(),
          'date' => $submission->getCreatedTime(),
        ];
        // Look for potential matches
        $data[$sub_id]['potential_matches'] = self::getPotentialMatches($submission->getElementData('application_id'), $submission);
      }
    }

    $page = [];
    $page['header'] = [
      '#type' => 'html_tag',
      '#tag' => 'h3',
      '#value' => 'Orphan Webform submissions',
    ];
    $page['description'] = [
      '#type' => 'html_tag',
      '#tag' => 'p',
      '#value' => 'These are webform submissions which are not attached to an application. If the author has submitted an application, it will be listed as a potential match.',
    ];
    $page['table'] = [
      '#type' => 'table',
      '#header' => [
        t('Submission'),
        t('Form'),
        t('User'),
        t('Potential Matches'),
      ],
    ];
    $page['table']['#rows'] = [];

    foreach ($data as $d) {
      $potential_matches = [];
      foreach ($d['potential_matches'] as $pm) {
        $potential_matches[] = $pm->toLink($pm->label(), 'canonical')->toString()->getGeneratedLink();
      }
      $page['table']['#rows'][] = [
        'submission' => $d['submission']->toLink($d['submission']->label(), 'canonical')->toString(),
        'webform' => $d['webform']->toLink($d['webform']->label(), 'canonical')->toString(),
        'user' => $d['user']->toLink($d['user']->label(), 'canonical')->toString(),
        'suggested' => !empty($potential_matches) ? ['data' => new FormattableMarkup(implode(',', $potential_matches), [])] : 'Search Required'
      ];
    }

    return $page;
  }

}

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

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