search_api_glossary.module in Search API AZ Glossary 8
Same filename and directory in other branches
Search api glossary module file.
File
search_api_glossary.moduleView source
<?php
/**
* @file
* Search api glossary module file.
*/
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\search_api\IndexInterface;
/**
* Add search_api_glossary settings to Search API Index configuration.
*
* Implements hook_form_FORM_ID_alter()
*/
function search_api_glossary_form_search_api_index_fields_alter(&$form, FormStateInterface $form_state) {
// TODO Cleanup this as per Drupal standards.
$config = \Drupal::config('search_api_glossary.settings');
$entity = $form_state
->getFormObject()
->getEntity();
// TODO Check if there are any limitations.
// If not, maybe expand this in future.
$allowed_field_types = array(
'integer',
'text',
'string',
);
foreach ($entity
->getDatasources() as $datasource_id => $datasource) {
$fields = $entity
->getFieldsByDatasource($datasource_id);
foreach ($fields as $field) {
$field_settings_array = $field
->getSettings();
$datasource_id = $field_settings_array['datasource_id'];
$datasource_id_clean = str_replace('entity:', '', $datasource_id);
$field_name = $field_settings_array['property_path'];
$field_label = $field_settings_array['label'];
$field_type = $field_settings_array['type'];
$locked = $field
->isTypeLocked();
// Identify glossary fields and skip them.
// Glossary field should be excluded always.
// Make it default and prevent changing.
if (substr($field_name, 0, strlen('field_glossaryaz')) !== 'field_glossaryaz') {
if (!$locked && in_array($field_type, $allowed_field_types)) {
$form[$datasource_id]['fields'][$field_name]['glossary_az'] = array(
'#type' => 'checkbox',
'#title' => t('Enable'),
'#default_value' => $config
->get($field_name)['enabled'],
);
if (array_key_exists('glossary_az_grouping', $config
->get($field_name))) {
$glossary_az_grouping_defaults = $config
->get($field_name)['glossary_az_grouping'];
}
else {
$glossary_az_grouping_defaults = array(
//'glossary_az_grouping_09' => 'glossary_az_grouping_09',
'glossary_az_grouping_other' => 'glossary_az_grouping_other',
);
}
$form[$datasource_id]['fields'][$field_name]['glossary_az_grouping'] = array(
'#type' => 'checkboxes',
#'#title' => t('Glossary grouping'),
#'#description' => t('When grouping is enabled, individual values such as 1, 2, 3 will get grouped like "0-9"'),
'#options' => array(
'glossary_az_grouping_az' => 'Group Alphabetic (A-Z)',
'glossary_az_grouping_09' => 'Group Numeric (0-9)',
'glossary_az_grouping_other' => 'Group Non Alpha Numeric (#)',
),
'#default_value' => $glossary_az_grouping_defaults,
'#required' => FALSE,
'#size' => 1,
);
// TODO Glossary field TYPE should always be STRING.
// Array to identify which header(s) to alter.
$datasource_ids[$datasource_id] = $datasource_id;
}
}
}
}
// Add glossary header to each fieldset.
if (!empty($datasource_ids)) {
foreach ($datasource_ids as $datasource_id_unique) {
$form[$datasource_id_unique]['#header'][] = t('Glossary');
$form[$datasource_id_unique]['#header'][] = t('Glossary Grouping');
}
}
// Add a custom validate handler.
$form['actions']['submit']['#validate'][] = 'search_api_glossary_search_api_index_fields_validate';
// Add a custom submit handler to save the
// array of types back to the config file.
$form['actions']['submit']['#submit'][] = 'search_api_glossary_search_api_index_fields_submit';
}
/**
* Validate search_api_glossary settings for Search API Index configuration.
*/
function search_api_glossary_search_api_index_fields_validate($form, FormStateInterface $form_state) {
$values = $form_state
->getValues();
$fields = $values['fields'];
$entity = $form_state
->getFormObject()
->getEntity();
$field_settings_array = $entity
->get('field_settings');
// If a glossary field exists but
// parent field has been removed or
// Glossary option is disabled and
// Glossary field is still enabled
// throw an error.
foreach ($fields as $field_name => $field_values) {
// Identify glossary fields and check parents.
// This case would occur if Glossary field is added
// but parent is removed or disabled.
if (substr($field_name, 0, strlen('field_glossaryaz')) === 'field_glossaryaz') {
// Check if the parent field for
// this glossary field exists and is enabled.
$glossary_parent_field = str_replace('field_glossaryaz_', '', $field_name);
// We dont seem to have a parent field for Glossary.
if (!array_key_exists($glossary_parent_field, $fields)) {
// Throw an exception to remove the Glossary field.
$form_state
->setErrorByName($field_name, t('@parent field is missing or removed. Please remove @glossary field or add @parent field.', array(
'@parent' => $glossary_parent_field,
'@glossary' => $field_settings_array[$field_name]['label'],
)));
}
elseif ($fields[$glossary_parent_field]['glossary_az'] == 0) {
// Throw an exception to remove the Glossary field.
// Or enable glossary option.
$form_state
->setErrorByName($field_name, t('@parent field does not have Glossary enabled. Please remove @glossary field or enable Glossary on @parent field.', array(
'@parent' => $field_settings_array[$glossary_parent_field]['label'],
'@glossary' => $field_settings_array[$field_name]['label'],
)));
}
}
}
}
/**
* Save search_api_glossary settings for Search API Index configuration.
*/
function search_api_glossary_search_api_index_fields_submit($form, FormStateInterface $form_state) {
$values = $form_state
->getValues();
$fields = $values['fields'];
$entity = $form_state
->getFormObject()
->getEntity();
$field_settings_array = $entity
->get('field_settings');
// TODO Cleanup this as per Drupal standards.
\Drupal::configFactory()
->reset('search_api_glossary.settings');
$config = \Drupal::configFactory()
->getEditable('search_api_glossary.settings');
foreach ($fields as $field_name => $field_values) {
$glossary_field_id = 'field_glossaryaz_' . $field_name;
$config_values = array(
'enabled' => 0,
'field_type' => $field_values['type'],
'field_name' => $field_name,
'label' => $field_settings_array[$field_name]['label'],
'glossary_field_id' => $glossary_field_id,
'glossary_field_name' => 'AZ Glossary - ' . $field_settings_array[$field_name]['label'],
'glossary_field_desc' => 'Glossary field for ' . $field_settings_array[$field_name]['label'] . '.',
);
if (isset($field_values['glossary_az']) && $field_values['glossary_az'] == 1) {
$config_values['enabled'] = 1;
$config_values['glossary_az_grouping'] = $field_values['glossary_az_grouping'];
}
// Set the variables.
$config
->set($field_name, $config_values)
->save();
}
drupal_set_message(t("Glossary fields have been created for the chosen fields. These newly created Glossary fields can now be added by clicking on ADD FIELDS button."));
}
Functions
Name | Description |
---|---|
search_api_glossary_form_search_api_index_fields_alter | Add search_api_glossary settings to Search API Index configuration. |
search_api_glossary_search_api_index_fields_submit | Save search_api_glossary settings for Search API Index configuration. |
search_api_glossary_search_api_index_fields_validate | Validate search_api_glossary settings for Search API Index configuration. |