forena-8.x-1.x-dev/src/Token/ReportReplacer.php

src/Token/ReportReplacer.php
<?php
/**
 * Created by PhpStorm.
 * User: metzlerd
 * Date: 3/18/15
 * Time: 10:52 AM
 */

namespace Drupal\forena\Token;


use Drupal\forena\AppService;
use Drupal\forena\FrxPlugin\FieldFormatter\FormatterInterface;

class ReportReplacer extends TokenReplacerBase {
  public $fields = [];
  public $format_callbacks = [];
  public $formats = [];

  // Build the token replacer and set the base formatter.
  public function __construct() {
    parent::__construct( '/\{[^\n^\r^}]+}/' , '{}');
    $this->setFormatter($this);
    $formatters = AppService::instance()->getFormatterPlugins();
    foreach($formatters as $class) {
      /** @var FormatterInterface $formatter */
      $formatter = new $class();
      $formats = $formatter->formats();
      foreach($formats as $method => $label) {
        $this->format_callbacks[$method] = array($formatter, $method);
        $this->formats[$method] = $label;
      }
    }
  }

  /**
   * Replaces nested array data.
   * @param $data
   *   The array containing values to replace.
   * @param $raw
   *   TRUE implies no formatting of data.
   */
  public function replaceNested(&$data, $raw = TRUE) {
    if (is_array($data)) {
      $values = $data;
      foreach ($values as $k => $value) {
        // Replace key data
        $key = $k;
        if (strpos($k, '{') !== FALSE) {
          $key = $this->replace($key);
          unset($data[$k]);
          $data[$key] = $value;
        }

        // Replace value data.
        if (is_array($value)) {
          $this->replaceNested($data[$key], $raw);
        }
        else {
          $data[$key] = $this->replace($value, $raw);
        }
      }
    }
    else {
      $data = $this->replace($data, $raw);
    }
  }

  /**
   * Get the value from the data.
   * This is used by token_replace method to extract the data based on the path provided.
   * @param $data
   * @param $key
   * @return string|array
   */
  protected function get_value($key, $raw=FALSE) {
    $context = '';
    $raw_key = $key;
    $dataSvc = $this->dataService();
    if ($key && strpos($key, '.')) {
      @list($context, $key) = explode('.', $key, 2);
      $o = $this->getDataContext($context);
    }
    else {
      $o = $this->currentDataContext();
    }
    $value = htmlentities($dataSvc->getValue($key, $context));
    if ($this->formatter) {
      $value = $this->formatter->format($value, $raw_key, $raw);
    }
    return $value;
  }

  /**
   * Define the fields associated with the formatter.
   * @param string $key
   *   Field replacement id
   * @param $field
   *   Field definition.
   */
  public function defineField($key, $field) {
    $def = [];
    //Make sure attribute names don't have -
    foreach($field as $attr => $value) {
      $def[$attr] = $value;
    }
    $this->fields[$key] = $def;
  }

  /*
   * Formatter used by the syntax engine to alter data that gets extracted.
   * This invokes the field translation
   */
  public function format($value, $key, $raw=FALSE) {
    // Determine if there is a field overide entry
    $default='';
    $link ='';
    $format='';
    $format_string = '';
    $calc= '';
    $context = '';
    $field = [];
    if (isset($this->fields[$key])) {
      $field = $this->fields[$key];
      extract($field);
      if (isset($field['format-string'])) {
        $format_string = $field['format-string'];
      }
    }

    // Evaluate any calculations first.
    if ($calc) {
      if ($context) $context .= ".";
      $calc = $this->replace($calc, TRUE);
      if ($calc) $value = $this->replace('{' . $context . '=' . $calc . '}', TRUE);
    }

    //@TODO: Figure out how to deal with formatters.
    if ($format && !$raw) {

      if (!empty($this->format_callbacks[$format])) {
        $value = call_user_func(
          $this->format_callbacks[$format],
          $value,
          $format_string,
          $this,
          $default
        );
      };
      $value = trim($value);
    }

    if (is_array($value) && !$raw) {
      $value = implode(' ', $value);
    }

    // Default if specified
    if (!$value && $default) {
      $value = $default;
    }

    if ($link && !$raw) {
      $link_fields = array_merge(array_fill_keys(['link', 'target', 'rel', 'class', 'add_query'], ''), $field);
      $this->replaceNested($link_fields, TRUE);
      $value = AppService::instance()->reportLink($value, $link_fields);
    }
    return $value;
  }

}

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

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