View source
<?php
namespace Drupal\fontawesome_iconpicker_widget\Plugin\Field\FieldWidget;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\fontawesome\Plugin\Field\FieldWidget\FontAwesomeIconWidget;
use Drupal\fontawesome_iconpicker_widget\IconManagerServiceInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\fontawesome\FontAwesomeManagerInterface;
class FontAwesomeIconpickerWidget extends FontAwesomeIconWidget {
protected $messenger;
protected $iconManager;
protected $fontAwesomeManager;
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings, ConfigFactory $config_factory, MessengerInterface $messenger, IconManagerServiceInterface $icon_manager, FontAwesomeManagerInterface $font_awesome_manager) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $third_party_settings, $config_factory, $font_awesome_manager);
$this->messenger = $messenger;
$this->iconManager = $icon_manager;
$this->fontAwesomeManager = $font_awesome_manager;
}
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['third_party_settings'], $container
->get('config.factory'), $container
->get('messenger'), $container
->get('fontawesome_iconpicker_widget.icon_manager'), $container
->get('fontawesome.font_awesome_manager'));
}
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
if (!fontawesome_iconpicker_widget_check_installed()) {
$this->messenger
->addWarning($this
->t('The fontIconPicker library could not be found. To use the Font Awesome Iconpicker, please verify that the fontIconPicker library is installed correctly. Please see the Font Awesome Iconpicker submodule README file for more details.'));
}
$cardinality = $this->fieldDefinition
->getFieldStorageDefinition()
->getCardinality();
$icon_list = $this->iconManager
->getFormattedIconList();
$term_list = $this->iconManager
->getFormattedTermList();
$icon_style_default_value = $items[$delta]
->get('style')
->getValue();
$icon_name_default_value = $items[$delta]
->get('icon_name')
->getValue();
$icon_default = NULL;
if ($icon_name_default_value && $icon_style_default_value) {
$icon_default = $icon_style_default_value . ' fa-' . $icon_name_default_value;
}
$element['icon_name'] = [
'#type' => 'textfield',
'#title' => $cardinality == 1 ? $this->fieldDefinition
->getLabel() : $this
->t('Icon Name'),
'#required' => $element['#required'],
'#default_value' => $icon_default,
'#attributes' => [
'class' => [
'fontawesome-iconpicker-icon',
],
],
'#attached' => [
'library' => [
'fontawesome_iconpicker_widget/fontawesome-iconpicker',
],
'drupalSettings' => [
'fontawesomeIcons' => [
'icons' => $icon_list,
'terms' => $term_list,
],
],
],
'#element_validate' => [
[
static::class,
'validateIconName',
],
],
];
$element['settings']['style'] = [
'#type' => 'hidden',
'#default_value' => $icon_style_default_value,
];
$iconSettings = unserialize($items[$delta]
->get('settings')
->getValue());
$mask_icon = '';
$mask_style = NULL;
if (isset($iconSettings['masking']['mask']) && isset($iconSettings['masking']['style'])) {
$mask_style = $iconSettings['masking']['style'];
$mask_icon = $mask_style . ' fa-' . $iconSettings['masking']['mask'];
}
$element['settings']['masking']['mask'] = [
'#type' => 'textfield',
'#title' => $this
->t('Icon Name'),
'#default_value' => $mask_icon,
'#attributes' => [
'class' => [
'fontawesome-iconpicker-mask',
],
],
'#element_validate' => [
[
static::class,
'validateIconName',
],
],
];
$element['settings']['masking']['style'] = [
'#type' => 'hidden',
'#default_value' => $mask_style,
];
return $element;
}
public static function validateIconName($element, FormStateInterface $form_state) {
$iconManager = \Drupal::service('fontawesome_iconpicker_widget.icon_manager');
$fontAwesomeManager = \Drupal::service('fontawesome.font_awesome_manager');
$value = $element['#value'];
if (strlen($value) == 0) {
$form_state
->setValueForElement($element, '');
return;
}
$icon_base = $iconManager
->getIconBaseNameFromClass($value);
$iconData = $fontAwesomeManager
->getIconMetadata($icon_base);
if (!isset($iconData['name'])) {
$form_state
->setError($element, t("Invalid icon"));
}
}
public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
foreach ($values as &$item) {
$class = $item['icon_name'];
$item['icon_name'] = $this->iconManager
->getIconBaseNameFromClass($class);
$item['style'] = $this->iconManager
->getIconPrefixFromClass($class);
unset($item['settings']['style']);
if (!empty($item['settings']['masking']['mask'])) {
$mask_class = $item['settings']['masking']['mask'];
$item['settings']['masking']['mask'] = $this->iconManager
->getIconBaseNameFromClass($mask_class);
$item['settings']['masking']['style'] = $this->iconManager
->getIconPrefixFromClass($mask_class);
}
if (is_numeric($item['settings']['power_transforms']['rotate']['value'])) {
$item['settings']['power_transforms']['rotate']['type'] = 'rotate';
}
else {
unset($item['settings']['power_transforms']['rotate']);
}
if (!empty($item['settings']['power_transforms']['flip-h']['value'])) {
$item['settings']['power_transforms']['flip-h']['type'] = 'flip';
}
else {
unset($item['settings']['power_transforms']['flip-h']);
}
if (!empty($item['settings']['power_transforms']['flip-v']['value'])) {
$item['settings']['power_transforms']['flip-v']['type'] = 'flip';
}
else {
unset($item['settings']['power_transforms']['flip-v']);
}
$item['settings'] = serialize(array_filter($item['settings']));
}
return $values;
}
}