<?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';
}
|