View source
<?php
namespace Drupal\glossify_node\Plugin\Filter;
use Drupal\glossify\GlossifyBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\filter\FilterProcessResult;
use Drupal\node\Entity\NodeType;
class NodeTooltip extends GlossifyBase {
public function settingsForm(array $form, FormStateInterface $form_state) {
$ntype_options = [];
$node_types = NodeType::loadMultiple();
foreach ($node_types as $id => $node_type) {
$ntype_options[$id] = $node_type
->get('name');
}
$form['glossify_node_case_sensitivity'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Case sensitive'),
'#description' => $this
->t('Whether or not the match is case sensitive.'),
'#default_value' => $this->settings['glossify_node_case_sensitivity'],
];
$form['glossify_node_first_only'] = [
'#type' => 'checkbox',
'#title' => $this
->t('First match only'),
'#description' => $this
->t('Match and link only the first occurance per field.'),
'#default_value' => $this->settings['glossify_node_first_only'],
];
$form['glossify_node_type'] = [
'#type' => 'radios',
'#title' => $this
->t('Type'),
'#required' => TRUE,
'#options' => [
'tooltips' => $this
->t('Tooltips'),
'links' => $this
->t('Links'),
'tooltips_links' => $this
->t('Tooltips and links'),
],
'#description' => $this
->t('How to show matches in content. Description as HTML5 tooltip (abbr element), link to description or both.'),
'#default_value' => $this->settings['glossify_node_type'],
];
$form['glossify_node_bundles'] = [
'#type' => 'checkboxes',
'#multiple' => TRUE,
'#element_validate' => [
[
get_class($this),
'validateNodeBundles',
],
],
'#title' => $this
->t('Node types'),
'#description' => $this
->t('Select the node types you want to use titles from to link to their node page.'),
'#options' => $ntype_options,
'#default_value' => explode(';', $this->settings['glossify_node_bundles']),
];
$form['glossify_node_urlpattern'] = [
'#type' => 'textfield',
'#title' => $this
->t('URL pattern'),
'#description' => $this
->t('Url pattern, used for linking matched words. Accepts "[id]" as token. Example: "/node/[id]"'),
'#default_value' => $this->settings['glossify_node_urlpattern'],
];
return $form;
}
public static function validateNodeBundles(array &$element, FormStateInterface $form_state, array &$complete_form) {
$values = $form_state
->getValues();
if (!empty($values['filters']['glossify_node']['status'])) {
$field_values = array_filter($values['filters']['glossify_node']['settings']['glossify_node_bundles']);
if (empty($field_values)) {
$element['#required'] = TRUE;
$form_state
->setError($element, t('%field is required.', [
'%field' => $element['#title'],
]));
}
}
}
public function process($text, $langcode) {
$node_types = explode(';', $this->settings['glossify_node_bundles']);
if (count($node_types)) {
$terms = [];
$query = \Drupal::database()
->select('node_field_data', 'nfd');
$query
->addfield('nfd', 'nid', 'id');
$query
->addfield('nfd', 'title', 'name');
$query
->addfield('nfd', 'title', 'name_norm');
$query
->addField('nb', 'body_value', 'tip');
$query
->join('node__body', 'nb', 'nb.entity_id = nfd.nid');
$query
->condition('nfd.type', $node_types, 'IN');
$query
->condition('nfd.status', 1);
$query
->condition('nfd.langcode', $langcode);
$query
->orderBy('name_norm', 'DESC');
$results = $query
->execute()
->fetchAllAssoc('name_norm');
foreach ($results as $result) {
if (!$this->settings['glossify_node_case_sensitivity']) {
$result->name_norm = strtolower($result->name_norm);
}
$terms[$result->name_norm] = $result;
}
if (count($terms) > 0) {
$text = $this
->parseTooltipMatch($text, $terms, $this->settings['glossify_node_case_sensitivity'], $this->settings['glossify_node_first_only'], $this->settings['glossify_node_type'], $this->settings['glossify_node_urlpattern']);
}
}
return new FilterProcessResult($text);
}
public function setConfiguration(array $configuration) {
if (isset($configuration['status'])) {
$this->status = (bool) $configuration['status'];
}
if (isset($configuration['weight'])) {
$this->weight = (int) $configuration['weight'];
}
if (isset($configuration['settings'])) {
if (is_array($configuration['settings']['glossify_node_bundles'])) {
$glossify_node_bundles = array_filter($configuration['settings']['glossify_node_bundles']);
$configuration['settings']['glossify_node_bundles'] = implode(';', $glossify_node_bundles);
}
$this->settings = (array) $configuration['settings'];
}
return $this;
}
}