You are here

public function FontAwesomeIconFormatter::viewElements in Font Awesome Icons 8.2

Builds a renderable array for a field value.

Parameters

\Drupal\Core\Field\FieldItemListInterface $items: The field values to be rendered.

string $langcode: The language that should be used to render the field.

Return value

array A renderable array for $items, as an array of child elements keyed by consecutive numeric indexes starting from 0.

Overrides FormatterInterface::viewElements

File

src/Plugin/Field/FieldFormatter/FontAwesomeIconFormatter.php, line 112

Class

FontAwesomeIconFormatter
Implementation of Font Awesome icon formatter.

Namespace

Drupal\fontawesome\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {

  // Early opt-out if the field is empty.
  if (count($items) <= 0) {
    return [];
  }

  // Load the configuration settings.
  $configurationSettings = $this->configFactory
    ->get('fontawesome.settings');

  // Loop over each icon and build data.
  $icons = [];
  foreach ($items as $item) {

    // Get the icon settings.
    $iconSettings = unserialize($item
      ->get('settings')
      ->getValue());
    $cssStyles = [];

    // Format mask.
    $iconMask = '';
    if (!empty($iconSettings['masking']['mask'])) {
      $iconMask = $iconSettings['masking']['style'] . ' fa-' . $iconSettings['masking']['mask'];
    }
    unset($iconSettings['masking']);

    // Format power transforms.
    $iconTransforms = [];
    $powerTransforms = $iconSettings['power_transforms'];
    foreach ($powerTransforms as $transform) {
      if (!empty($transform['type'])) {
        $iconTransforms[] = $transform['type'] . '-' . $transform['value'];
      }
    }
    unset($iconSettings['power_transforms']);

    // Move duotone settings into the render.
    if (isset($iconSettings['duotone'])) {

      // Handle swap opacity flag.
      if (!empty($iconSettings['duotone']['swap-opacity'])) {
        $iconSettings['swap-opacity'] = $iconSettings['duotone']['swap-opacity'];
      }

      // Handle custom CSS styles.
      if (!empty($iconSettings['duotone']['opacity']['primary'])) {
        $cssStyles[] = '--fa-primary-opacity: ' . $iconSettings['duotone']['opacity']['primary'] . ';';
      }
      if (!empty($iconSettings['duotone']['opacity']['secondary'])) {
        $cssStyles[] = '--fa-secondary-opacity: ' . $iconSettings['duotone']['opacity']['secondary'] . ';';
      }
      if (!empty($iconSettings['duotone']['color']['primary'])) {
        $cssStyles[] = '--fa-primary-color: ' . $iconSettings['duotone']['color']['primary'] . ';';
      }
      if (!empty($iconSettings['duotone']['color']['secondary'])) {
        $cssStyles[] = '--fa-secondary-color: ' . $iconSettings['duotone']['color']['secondary'] . ';';
      }
      unset($iconSettings['duotone']);
    }

    // Add additional CSS styles if needed.
    if (isset($iconSettings['additional_classes'])) {
      $cssStyles[] = $iconSettings['additional_classes'];
    }
    $icons[] = [
      '#theme' => 'fontawesomeicon',
      '#tag' => $configurationSettings
        ->get('tag'),
      '#name' => 'fa-' . $item
        ->get('icon_name')
        ->getValue(),
      '#style' => $item
        ->get('style')
        ->getValue(),
      '#settings' => implode(' ', array_filter($iconSettings)),
      '#transforms' => implode(' ', $iconTransforms),
      '#mask' => $iconMask,
      '#css' => implode(' ', $cssStyles),
    ];
  }

  // Get the icon settings.
  $settings = $this
    ->getSettings();
  return [
    [
      '#theme' => 'fontawesomeicons',
      '#icons' => $icons,
      '#layers' => $settings['layers'],
    ],
  ];
}