| 
<?php
 /**
 * @file
 * Drupal integration of icon to blocks.
 */
 
 use Drupal\Core\Form\FormStateInterface;
 
 /**
 * Get the configuration.
 */
 function icon_block_get_config_factory($settings) {
 $config = \Drupal::config('icon_block.settings');
 return $config;
 }
 
 /**
 * Implements hook_preprocess_HOOK().
 */
 function icon_block_preprocess_block(&$variables) {
 
 $tags = 'icon_block.' . $variables['plugin_id'] . '.';
 $config = \Drupal::config('icon_block.settings');
 
 if ($config->get($tags . 'icon')) {
 $icon = $config->get($tags . 'icon');
 $tag = $config->get($tags . 'wrapper');
 $wrapper_classes = explode(',', $config->get($tags . 'wrapper_class'));
 $classes = '';
 foreach ($wrapper_classes as $c) {
 $classes .= trim($c) . ' ';
 }
 
 if ($tag != 'i' && $tag != 'span') {
 $tag = 'i';
 }
 
 switch (trim($config->get($tags . 'position'))) {
 case 'title_before':
 $markup = '';
 if (isset($variables['title_prefix']['#markup'])) {
 $markup = $variables['title_prefix']['#markup'];
 }
 $variables['title_prefix']['#markup'] = t(_icon_block_get_icon_tag($tag, $icon, $classes)) . $markup;
 break;
 
 case 'title_after':
 $markup = '';
 if (isset($variables['title_suffix']['#markup'])) {
 $markup = $variables['title_suffix']['#markup'];
 }
 $variables['title_suffix']['#markup'] = $markup . t(_icon_block_get_icon_tag($tag, $icon, $classes));
 break;
 
 case 'title_inside_before':
 if (is_array($variables['label']) && isset($variables['label']['#markup'])) {
 $variables['label']['#allowed_tags'][] = $tag;
 $variables['label']['#markup'] = t(_icon_block_get_icon_tag($tag, $icon, $classes)) . $variables['label']['#markup'];
 }
 elseif (is_string($variables['label'])) {
 $variables['label'] = t(_icon_block_get_icon_tag($tag, $icon, $classes) . $variables['label']);
 if ($variables['configuration']['label_display'] == 'visible') {
 $variables['configuration']['label'] = t(_icon_block_get_icon_tag($tag, $icon, $classes) . $variables['configuration']['label']);
 }
 }
 break;
 
 case 'title_inside_after':
 if (is_array($variables['label']) && isset($variables['label']['#markup'])) {
 $variables['label']['#allowed_tags'][] = $tag;
 $variables['label']['#markup'] = $variables['label']['#markup'] . t(_icon_block_get_icon_tag($tag, $icon, $classes));
 }
 elseif (is_string($variables['label'])) {
 $variables['label'] = t($variables['label'] . _icon_block_get_icon_tag($tag, $icon, $classes));
 if ($variables['configuration']['label_display'] == 'visible') {
 $variables['configuration']['label'] = t($variables['configuration']['label'] . _icon_block_get_icon_tag($tag, $icon, $classes));
 }
 }
 break;
 
 case 'content_before':
 if (array_key_exists('#items', $variables['content'])) {
 $arr = _icon_block_get_icon_list_tag($tag, $icon, $classes);
 $variables['content']['#items'] = $arr + $variables['content']['#items'];
 }
 else {
 $markup = array_key_exists('#markup', $variables['content']) ? $variables['content']['#markup'] : '';
 
 $variables['content']['#markup'] = t('<div class="icon-div-block">' . _icon_block_get_icon_tag($tag, $icon, $classes) . '</div>') . $markup;
 }
 break;
 
 case 'content_after':
 if (array_key_exists('#items', $variables['content'])) {
 $arr = _icon_block_get_icon_list_tag($tag, $icon, $classes);
 $variables['content']['#items'] += $arr;
 }
 else {
 $markup = array_key_exists('#markup', $variables['content']) ? $variables['content']['#markup'] : '';
 
 $variables['content']['#markup'] = $markup . t('<div class="icon-div-block">' . _icon_block_get_icon_tag($tag, $icon, $classes) . '</div>');
 }
 break;
 
 default:
 // Do Nothing.
 }
 }
 }
 
 /**
 * Get the icon tag.
 */
 function _icon_block_get_icon_tag($tag, $icon, $classes) {
 $markup = '<' . $tag . ' class="fa fa-' . $icon . ' ' . $classes . '"></' . $tag . '>';
 return $markup;
 }
 
 /**
 * Get the icon list tag.
 */
 function _icon_block_get_icon_list_tag($tag, $icon, $classes) {
 if ($tag != 'i' || $tag != 'span') {
 $tag = 'i';
 }
 
 $arr['icon.list'] = [
 'is_expanded' => FALSE,
 'is_collapsed' => FALSE,
 'in_active_trail' => FALSE,
 'title' => t('<div class="icon-div-block"><:tag class="fa fa-:icon :class"></:tag></div>', [
 ':tag' => $tag,
 ':icon' => $icon,
 ':class' => $classes,
 ]),
 'url' => \Drupal\Core\Url::fromUri('http://drupal.org/'),
 'attributes' => new \Drupal\Core\Template\Attribute([
 'class' => ['icon_block_icon-link', 'menu-item'],
 ]),
 ];
 
 return $arr;
 }
 
 /**
 * Implements hook_form_FORM_ID_alter()
 */
 
 function icon_block_form_block_form_alter(array &$form, FormStateInterface &$form_state, $form_id) {
 $settings = $form_state->getFormObject()->getEntity()->getPluginId();
 
 $config = icon_block_get_config_factory($settings);
 $tag = 'icon_block.' . $settings . '.';
 $access = \Drupal::currentUser()->hasPermission('administer block icons');
 
 // Get the icon bundle list
 $icon_manager = \Drupal::service('plugin.manager.icon_bundle');
 $icon_definitions = $icon_manager->getDefinitions();
 $icon_bundle = array();
 foreach($icon_definitions as $icon_definition) {
 $icon_bundle[$icon_definition['autocomplete_route']] = $icon_definition['label'];
 }
 
 $form['settings']['icon_selector'] = array(
 '#type' => 'details',
 '#tree' => TRUE,
 '#title' => t('Icon'),
 '#open' => TRUE,
 '#collapsible' => TRUE,
 '#collapsed' => FALSE,
 '#access' => $access,
 );
 
 $form['settings']['icon_selector']['icon_bundle'] = array(
 '#type' => 'select',
 '#title' => t('Icon Bundle'),
 '#description' => t('Choose the icon bundle to display the icons using the autocomplete.'),
 '#default_value' => key($icon_bundle),
 '#options' => $icon_bundle,
 '#ajax' => [
 'callback' => '_icon_block_update_icon_bundle',
 'event' => 'change',
 'wrapper' => 'icon_block-field-wrapper'
 ],
 );
 
 $form['settings']['icon_selector']['icon'] = array(
 '#type' => 'textfield',
 '#title' => t('Search Icon'),
 //'#field_prefix' => 'fa-',
 '#prefix' => '<div id="icon_block-field-wrapper">',
 '#suffix' => '</div>',
 '#default_value' => $config->get($tag . 'icon') ? $config->get($tag . 'icon') : '',
 '#autocomplete_route_name' => isset($form_state->getValue('settings')['icon_selector']['icon_bundle']) ? $form_state->getValue('settings')['icon_selector']['icon_bundle'] : key($icon_bundle),
 );
 
 $form['settings']['icon_selector']['wrapper'] = array(
 '#type' => 'select',
 '#title' => t('Icon Wrapper'),
 '#description' => t('Choose an HTML element to wrap the icon with.'),
 '#default_value' => $config->get($tag . 'wrapper') ? $config->get($tag . 'wrapper') : 'i',
 '#options' => array(
 'i' => t('i'),
 'span' => t('span'),
 ),
 '#states' => array(
 'invisible' => array(
 ':input[name="settings[icon_selector][icon]"]' => array(
 'value' => ''
 ),
 )
 ),
 );
 
 $form['settings']['icon_selector']['wrapper_class'] = array(
 '#type' => 'textfield',
 '#title' => t('Icon Wrapper Classes'),
 '#description' => t('A space separated list of CSS classes.'),
 '#default_value' => $config->get($tag . 'wrapper_class') ? $config->get($tag . 'wrapper_class') : '',
 '#states' => array(
 'invisible' => array(
 array(':input[name="settings[icon_selector][wrapper]"]' => array(
 'value' => 'None'
 )),
 'and',
 array(':input[name="settings[icon_selector][icon]"]' => array(
 'value' => ''
 )),
 )
 ),
 );
 
 $form['settings']['icon_selector']['position'] = array(
 '#type' => 'select',
 '#title' => t('Position'),
 '#default_value' => $config->get($tag . 'position') ? $config->get($tag . 'position') : 'title_before',
 '#options' => array(
 'title_before' => t('Before title'),
 'title_after' => t('After title'),
 'title_inside_before' => t('Before title (inside markup)'),
 'title_inside_after' => t('After title (inside markup)'),
 'content_before' => t('Before content'),
 'content_after' => t('After content'),
 ),
 '#states' => array(
 'invisible' => array(
 ':input[name="settings[icon_selector][icon]"]' => array(
 'value' => ''
 ),
 )
 ),
 );
 
 if($access) {
 $form['actions']['submit']['#submit'][] = '_icon_block_submit_value';
 }
 }
 
 /**
 * Update the autocomplete value
 */
 function _icon_block_update_icon_bundle(array &$form, FormStateInterface $form_state) {
 return $form['settings']['icon_selector']['icon'];
 }
 
 /**
 * Storing the icon information
 */
 function _icon_block_submit_value(array $form, FormStateInterface $form_state) {
 
 $config = \Drupal::configFactory()->getEditable('icon_block.settings');
 $settings = $form_state->getFormObject()->getEntity()->getPluginId();
 
 $values = $form_state->getValue('settings')['icon_selector'];
 $tag = 'icon_block.' . $settings . '.';
 
 $config->set($tag . 'icon_bundle', $values['icon_bundle'])
 ->set($tag . 'icon', $values['icon'])
 ->set($tag . 'wrapper', $values['wrapper'])
 ->set($tag . 'wrapper_class', $values['wrapper_class'])
 ->set($tag . 'position', $values['position'])
 ->save();
 }
 
 /**
 * Implements hook_page_attachments()
 */
 function icon_block_page_attachments(array &$page) {
 // Adding CSS
 $page['#attached']['library'][] = 'icon_block/icon_block_custom_css';
 
 // Adding JS
 $page['#attached']['library'][] = 'icon_block/icon_block_custom_js';
 }
 
 |