-
Notifications
You must be signed in to change notification settings - Fork 0
/
oe_search.module
148 lines (133 loc) · 4.99 KB
/
oe_search.module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php
/**
* @file
* OpenEuropa Search module.
*/
declare(strict_types=1);
use Drupal\Core\Form\FormStateInterface;
use Drupal\oe_search\Plugin\search_api\backend\SearchApiEuropaSearchBackend;
use Drupal\search_api\Entity\Server;
use Drupal\search_api\Plugin\search_api\datasource\ContentEntity;
use Drupal\search_api\Utility\Utility;
/**
* Implements hook_locale_translation_projects_alter().
*/
function oe_search_locale_translation_projects_alter(&$projects) {
$projects['oe_search']['info']['interface translation server pattern'] = \Drupal::service('extension.list.module')->getPath('oe_search') . '/translations/%project-%language.po';
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function oe_search_form_search_api_index_edit_form_alter(&$form, FormStateInterface $form_state, $form_id): void {
$form['#validate'][] = 'oe_search_form_search_api_index_edit_form_validate';
}
/**
* Ensure that only entities with canonical URLs can be ingested.
*
* @param array $form
* The form definition.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state object.
*/
function oe_search_form_search_api_index_edit_form_validate(array $form, FormStateInterface $form_state): void {
$server = Server::load($form_state->getValue('server'));
if (!$server || !$server->getBackend() instanceof SearchApiEuropaSearchBackend) {
return;
}
/** @var \Drupal\search_api\Form\IndexForm $form_object */
$form_object = $form_state->getFormObject();
/** @var \Drupal\Component\Plugin\PluginManagerInterface $plugin_manager */
$plugin_manager = \Drupal::service('plugin.manager.search_api.datasource');
/** @var \Drupal\search_api\Plugin\search_api\datasource\ContentEntity $datasource */
foreach ($form_state->getValue('datasources') as $datasource_id) {
$datasource = $plugin_manager->createInstance($datasource_id, [
'#index' => $form_object->getEntity(),
]);
if (!$datasource instanceof ContentEntity) {
$form_state->setErrorByName('datasources', t('Datasource "@datasource" must be a Content Entity.', [
'@datasource' => Utility::escapeHtml($datasource->label()),
]));
}
}
}
/**
* Implements hook_form_BASE_FORM_ID_alter().
*/
function oe_search_form_search_api_index_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
// We need to restrict by form ID here because this function is also called
// via hook_form_BASE_FORM_ID_alter (which is wrong, e.g. in the case of the
// form ID search_api_field_config).
if (!in_array($form_id, [
'search_api_index_form',
'search_api_index_edit_form',
])) {
return;
}
/** @var \Drupal\search_api\IndexInterface $index */
$index = $form_state->getFormObject()->getEntity();
$options = [
'local' => t('Local - Entities will be loaded from database, only entities from this website will be fetch and loaded.'),
'remote' => t('Remote - Entities will be loaded from Europa Search documents. Entities from other sources than this website can be returned.'),
];
$form['third_party_settings']['oe_search'] = [
'#tree' => TRUE,
'#type' => 'details',
'#title' => t('Europa search index options'),
'#open' => TRUE,
'#states' => [
'visible' => [
':input[name="server"]' => [
_oe_search_get_europa_servers(),
],
],
],
];
$form['third_party_settings']['oe_search']['europa_search_entity_mode'] = [
'#type' => 'radios',
'#title' => t('Entity load type'),
'#options' => $options,
'#required' => TRUE,
'#description' => t('Choose how entities should be fetch and loaded from Europa Search.'),
'#default_value' => $index->getThirdPartySetting('oe_search', 'europa_search_entity_mode', 'local'),
];
}
/**
* Gets a lists of servers from europa search backend.
*
* @return array
* The list of servers.
*/
function _oe_search_get_europa_servers() {
$valid_options = [];
$storage = \Drupal::entityTypeManager()->getStorage('search_api_server');
/** @var \Drupal\search_api\ServerInterface[] $servers */
$servers = $storage->loadByProperties(['status' => TRUE]);
$europa_servers = [];
foreach ($servers as $server) {
if (
$server->hasValidBackend() &&
$server->getBackend() instanceof SearchApiEuropaSearchBackend
) {
$europa_servers[$server->id()] = $server;
}
}
foreach ($europa_servers as $server) {
if (!empty($valid_options)) {
$valid_options[] = 'OR';
}
$valid_options[] = [
'value' => $server->id(),
];
}
return empty($valid_options) ? ['value' => TRUE] : $valid_options;
}
/**
* Implements hook_facets_search_api_query_type_mapping_alter().
*/
function oe_search_facets_search_api_query_type_mapping_alter($backend_plugin_id, array &$query_types) {
if ($backend_plugin_id == 'search_api_europa_search') {
$query_types['string'] = 'europa_search_api_string';
$query_types['date_comparison'] = 'europa_date_query_type';
$query_types['oe_list_pages_date_status_comparison'] = 'oe_list_pages_europa_date_status_query_type';
}
}