You are here

public function FilterAmazon::process in Amazon Product Advertisement API 8.2

Performs the filter processing.

Parameters

string $text: The text string to be filtered.

string $langcode: The language code of the text to be filtered.

Return value

\Drupal\filter\FilterProcessResult The filtered text, wrapped in a FilterProcessResult object, and possibly with associated assets, cacheability metadata and placeholders.

Overrides FilterInterface::process

See also

\Drupal\filter\FilterProcessResult

File

modules/amazon_filter/src/Plugin/Filter/FilterAmazon.php, line 53
Contains \Drupal\amazon_filter\Plugin\Filter\FilterAmazon.

Class

FilterAmazon
Provides a filter to easily be links to Amazon using an Associate ID.

Namespace

Drupal\amazon_filter\Plugin\Filter

Code

public function process($text, $langcode) {
  $matches = [];
  $replacements = [];
  if (preg_match_all('`\\[amazon(.*?)\\]`', $text, $matches)) {

    /** @var  \Drupal\Core\Render $renderer */
    $renderer = \Drupal::service('renderer');
    foreach ($matches[1] as $index => $match) {
      $completeToken = $matches[0][$index];
      if (isset($replacements[$completeToken])) {

        // We've already built this replacement, do not do it again.
        continue;
      }

      // Preferred format.
      $params = explode(':', trim($match));
      if (count($params) == 1) {

        // Backwards-compatible format.
        $params = explode(' ', trim($match));
      }
      if (count($params) == 1) {
        continue;
      }
      $asin = $params[0];
      $type = $params[1];
      $maxAge = $this->defaultMaxAge;
      if (!empty($params[2])) {
        $maxAge = $params[2];
      }

      // @TODO: quick fix to get this working. Needs to be injected!
      $associatesId = \Drupal::config('amazon.settings')
        ->get('associates_id');
      $amazon = new Amazon($associatesId);
      $results = $amazon
        ->lookup($asin);
      if (empty($results[0])) {
        continue;
      }

      // Build a render array for this element. This allows us to easily
      // override the layout by simply overriding the Twig template. It also
      // lets us set custom caching for each filter link.
      $build = [
        '#results' => $results,
        '#max_age' => $maxAge,
      ];

      // Use the correct Twig template based on the "type" specified.
      switch (strtolower($type)) {
        case 'inline':
          $build['#theme'] = 'amazon_inline';
          break;
        case 'small':
        case 'thumbnail':
          $build['#theme'] = 'amazon_image';
          $build['#size'] = 'small';
          break;
        case 'medium':
          $build['#theme'] = 'amazon_image';
          $build['#size'] = 'medium';
          break;
        case 'large':
        case 'full':
          $build['#theme'] = 'amazon_image';
          $build['#size'] = 'large';
          break;
        default:
          continue;
      }
      $replacements[$completeToken] = $renderer
        ->render($build);
    }
  }
  $text = strtr($text, $replacements);
  return new FilterProcessResult($text);
}