View source
<?php
namespace Drupal\fontawesome\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\Core\Link;
class FontAwesomeIconFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
protected $configFactory;
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, ConfigFactory $config_factory) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
$this->configFactory = $config_factory;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['label'], $configuration['view_mode'], $configuration['third_party_settings'], $container
->get('config.factory'));
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$configuration_settings = $this->configFactory
->get('fontawesome.settings');
$elements['layers'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Display multi-value fields as layers?'),
'#default_value' => $this
->getSetting('layers'),
'#description' => $this
->t('Layers are the new way to place icons and text visually on top of each other, replacing the Font Awesome classic icons stacks. With this new approach you can use more than 2 icons. Layers are awesome when you don’t want your page’s background to show through, or when you do want to use multiple colors, layer several icons, layer text, or layer counters onto an icon. Note that layers only work with the SVG version of Font Awesome. For more information, see @layersLink.', [
'@layersLink' => Link::fromTextAndUrl($this
->t('the Font Awesome guide to layers'), Url::fromUri('https://fontawesome.com/how-to-use/on-the-web/styling/layering'))
->toString(),
]),
'#disabled' => $configuration_settings
->get('method') == 'webfonts',
];
return $elements;
}
public function settingsSummary() {
$settings = $this
->getSettings();
$summary = [];
$configuration_settings = $this->configFactory
->get('fontawesome.settings');
$summary[] = $this
->t('Display multi-value fields as layers: <strong>@layersSetting</strong>', [
'@layersSetting' => $settings['layers'] && $configuration_settings
->get('method') != 'webfonts' ? 'Yes' : 'No',
]);
return $summary;
}
public static function defaultSettings() {
return [
'layers' => FALSE,
] + parent::defaultSettings();
}
public function viewElements(FieldItemListInterface $items, $langcode) {
if (count($items) <= 0) {
return [];
}
$configurationSettings = $this->configFactory
->get('fontawesome.settings');
$icons = [];
foreach ($items as $item) {
$iconSettings = unserialize($item
->get('settings')
->getValue());
$cssStyles = [];
$iconMask = '';
if (!empty($iconSettings['masking']['mask'])) {
$iconMask = $iconSettings['masking']['style'] . ' fa-' . $iconSettings['masking']['mask'];
}
unset($iconSettings['masking']);
$iconTransforms = [];
$powerTransforms = $iconSettings['power_transforms'];
foreach ($powerTransforms as $transform) {
if (!empty($transform['type'])) {
$iconTransforms[] = $transform['type'] . '-' . $transform['value'];
}
}
unset($iconSettings['power_transforms']);
if (isset($iconSettings['duotone'])) {
if (!empty($iconSettings['duotone']['swap-opacity'])) {
$iconSettings['swap-opacity'] = $iconSettings['duotone']['swap-opacity'];
}
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']);
}
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),
];
}
$settings = $this
->getSettings();
return [
[
'#theme' => 'fontawesomeicons',
'#icons' => $icons,
'#layers' => $settings['layers'],
],
];
}
}