learnosity-1.0.x-dev/src/Element/LearnosityReportsItem.php

src/Element/LearnosityReportsItem.php
<?php

namespace Drupal\learnosity\Element;

use Drupal\Core\Render\Element\RenderElement;
use Drupal\Core\Render\Markup;

/**
 * Provides a Learnosity Reports render element.
 *
 * Usage example:
 * @code
 * $build['report'] = [
 *   '#type' => 'learnosity_reports_item',
 *   '#id' => '',
 *   '#reports' => [],
 * ];
 * @endcode
 *
 * @RenderElement("learnosity_reports_item")
 */
class LearnosityReportsItem extends RenderElement {

  /**
   * {@inheritdoc}
   */
  public function getInfo() {
    $class = get_class($this);
    return [
      '#pre_render' => [
        [$class, 'preRenderLearnosityReportsItem'],
      ],
      '#reports' => [],
      '#context' => [],
      '#theme' => 'learnosity_reports_item',
    ];
  }

  /**
   * Pre render callback.
   *
   * The is originally based on the prerender callback defined on the link
   * element.
   *
   * @param array $element
   *   The element.
   *
   * @return array
   *   Element render array.
   */
  public static function preRenderLearnosityReportsItem(array $element) {

    $learnositySdk = \Drupal::service('learnosity.sdk');

    // Attaching the service library to this render element. This will ensure
    // that the proper learnosity api library gets loaded.
    $element['#attached']['library'][] = 'learnosity/api.reports';
    $element['#context'] = isset($element['#context']) ? $element['#context'] : [];

    $signed_request = $learnositySdk->init('reports', [
      'reports' => $element['#reports'],
    ], $element['#context']);

    // Prepare the context items to be attached.
    // It will only attach scalar values because arrays and objects should not
    // be passed through javascript.
    $context = [];
    foreach ($element['#context'] as $key => $value) {
      if (is_scalar($value)) {
        $context[$key] = $value;
      }
    }

    // It's necessary to add a suffix and prefix to accommodate
    // for loading via ajax.
    $element['#prefix'] = '<div class="learnosity-reports">';
    $element['#suffix'] = '</div>';
    $element['#attributes']['data-learnosity'] = 'true';
    // Load core learnosity drupal js file and pass signed request.
    $element['#attached']['library'][] = 'learnosity/learnosity';
    $element['#attached']['drupalSettings']['learnosity'] = [
      'service' => 'reports',
      'signedRequest' => Markup::create($signed_request),
      'context' => $context,
    ];

    // Create divs for each report item.
    $reports = [];
    foreach ($element['#reports'] as $report) {
      if (isset($report['id'])) {
        $reports[] = [
          '#markup' => '<div id="' . $report['id'] . '"></div>',
        ];
      }
    }
    $element['reports'] = $reports;
    return $element;
  }

}

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

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