View source
<?php
namespace Drupal\glossify_taxonomy\Plugin\Filter;
use Drupal\glossify\GlossifyBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\filter\FilterProcessResult;
use Drupal\taxonomy\Entity\Vocabulary;
class TaxonomyTooltip extends GlossifyBase {
public function settingsForm(array $form, FormStateInterface $form_state) {
$vocab_options = [];
$vocabularies = Vocabulary::loadMultiple();
foreach ($vocabularies as $vocab) {
$vocab_options[$vocab
->id()] = $vocab
->get('name');
}
$form['glossify_taxonomy_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_taxonomy_case_sensitivity'],
];
$form['glossify_taxonomy_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_taxonomy_first_only'],
];
$form['glossify_taxonomy_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_taxonomy_type'],
];
$form['glossify_taxonomy_vocabs'] = [
'#type' => 'checkboxes',
'#multiple' => TRUE,
'#element_validate' => [
[
get_class($this),
'validateTaxonomyVocabs',
],
],
'#title' => $this
->t('Taxonomy vocabularies'),
'#description' => $this
->t('Select the taxonomy vocabularies you want to use term names from to link their term page.'),
'#options' => $vocab_options,
'#default_value' => explode(';', $this->settings['glossify_taxonomy_vocabs']),
];
$form['glossify_taxonomy_urlpattern'] = [
'#type' => 'textfield',
'#title' => $this
->t('URL pattern'),
'#description' => $this
->t('Url pattern, used for linking matched words. Accepts "[id]" as token. Example: "/taxonomy/term/[id]"'),
'#default_value' => $this->settings['glossify_taxonomy_urlpattern'],
];
return $form;
}
public static function validateTaxonomyVocabs(&$element, FormStateInterface $form_state, &$complete_form) {
$values = $form_state
->getValues();
if (!empty($values['filters']['glossify_taxonomy']['status'])) {
$field_values = array_filter($values['filters']['glossify_taxonomy']['settings']['glossify_taxonomy_vocabs']);
if (empty($field_values)) {
$element['#required'] = TRUE;
$form_state
->setError($element, t('%field is required.', [
'%field' => $element['#title'],
]));
}
}
}
public function process($text, $langcode) {
$vocabs = explode(';', $this->settings['glossify_taxonomy_vocabs']);
\Drupal::moduleHandler()
->alter('glossify_taxonomy_vocabs', $vocabs);
if (count($vocabs)) {
$terms = [];
$query = \Drupal::database()
->select('taxonomy_term_field_data', 'tfd');
$query
->addfield('tfd', 'tid', 'id');
$query
->addfield('tfd', 'name');
$query
->addfield('tfd', 'name', 'name_norm');
$query
->addField('tfd', 'description__value', 'tip');
$query
->condition('tfd.vid', $vocabs, 'IN');
$query
->condition('tfd.langcode', $langcode);
$query
->orderBy('name_norm', 'DESC');
$results = $query
->execute()
->fetchAllAssoc('name_norm');
foreach ($results as $result) {
if (!$this->settings['glossify_taxonomy_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_taxonomy_case_sensitivity'], $this->settings['glossify_taxonomy_first_only'], $this->settings['glossify_taxonomy_type'], $this->settings['glossify_taxonomy_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_taxonomy_vocabs'])) {
$glossify_taxonomy_vocabs = array_filter($configuration['settings']['glossify_taxonomy_vocabs']);
$configuration['settings']['glossify_taxonomy_vocabs'] = implode(';', $glossify_taxonomy_vocabs);
}
$this->settings = (array) $configuration['settings'];
}
return $this;
}
}