/
localgov_directories.module
271 lines (253 loc) · 9.46 KB
/
localgov_directories.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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
<?php
/**
* @file
* Provides a directory facets entity type.
*/
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\Display\EntityFormDisplayInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Render\Element;
use Drupal\facets\FacetInterface;
use Drupal\field\FieldConfigInterface;
use Drupal\localgov_directories\ConfigurationHelper;
use Drupal\localgov_directories\Constants as Directory;
use Drupal\localgov_directories\DirectoryExtraFieldDisplay;
use Drupal\localgov_roles\RolesHelper;
use Drupal\node\NodeInterface;
use Drupal\pathauto\Entity\PathautoPattern;
use Drupal\search_api\IndexInterface;
/**
* Implements hook_theme().
*/
function localgov_directories_theme() {
return [
'localgov_directories_facets' => [
'render element' => 'elements',
],
'facets_item_list__links__localgov_directories_facets' => [
'base hook' => 'facets_item_list',
],
// Facets for proximity search look no different.
'facets_item_list__links__localgov_directories_facets_proximity_search' => [
'base hook' => 'facets_item_list',
'template' => 'facets-item-list--links--localgov-directories-facets',
],
// Facet Checkboxes are rendered through Javascript. So the same markup as
// "link" Facets suffices.
'facets_item_list__checkbox__localgov_directories_facets' => [
'base hook' => 'facets_item_list',
'template' => 'facets-item-list--links--localgov-directories-facets',
],
'facets_item_list__checkbox__localgov_directories_facets_proximity_search' => [
'base hook' => 'facets_item_list',
'template' => 'facets-item-list--links--localgov-directories-facets',
],
'facets_item_list__dropdown__localgov_directories_facets' => [
'base hook' => 'facets_item_list',
'template' => 'facets-item-list--dropdown--localgov-directories-facets',
],
'facets_item_list__dropdown__localgov_directories_facets_proximity_search' => [
'base hook' => 'facets_item_list',
'template' => 'facets-item-list--dropdown--localgov-directories-facets',
],
];
}
/**
* Implements hook_localgov_role_default().
*/
function localgov_directories_localgov_roles_default() {
return [
RolesHelper::EDITOR_ROLE => [
'access directory facets overview',
'delete directory facets',
'create directory facets',
'view directory facets',
'edit directory facets',
'create localgov_directory content',
'delete any localgov_directory content',
'delete own localgov_directory content',
'edit any localgov_directory content',
'edit own localgov_directory content',
'revert localgov_directory revisions',
'view localgov_directory revisions',
],
];
}
/**
* Implements hook_modules_installed().
*/
function localgov_directories_modules_installed($modules) {
$services = in_array('localgov_services_navigation', $modules);
if ($services) {
\Drupal::service('config.installer')->installOptionalConfig(NULL, [
'config' => 'field.storage.node.localgov_services_parent',
]);
localgov_directories_optional_fields_settings($services);
}
}
/**
* Implements hook_entity_extra_field_info().
*/
function localgov_directories_entity_extra_field_info() {
return \Drupal::service('class_resolver')
->getInstanceFromDefinition(DirectoryExtraFieldDisplay::class)
->entityExtraFieldInfo();
}
/**
* Implements hook_ENTITY_TYPE_view().
*/
function localgov_directories_node_view(array &$build, NodeInterface $node, EntityViewDisplayInterface $display, $view_mode) {
return \Drupal::service('class_resolver')
->getInstanceFromDefinition(DirectoryExtraFieldDisplay::class)
->nodeView($build, $node, $display, $view_mode);
}
/**
* Implements hook_pathauto_pattern_alter().
*/
function localgov_directories_pathauto_pattern_alter(PathautoPattern $pattern, array $context) {
// If pathauto isn't set to include this entity into directory, but
// it has opt-ed in with the field add the (optional) parent to the path.
$entity = reset($context['data']);
assert($entity instanceof ContentEntityInterface);
if ($entity->hasField('localgov_directory_channels') && strpos($pattern->getPattern(), '[node:localgov_directory_channels:0:entity:url:relative]') === FALSE) {
$pattern->setPattern('[node:localgov_directory_channels:0:entity:url:relative]/' . $pattern->getPattern());
}
}
/**
* Set form settings for optional services and topic fields on installation.
*
* @param bool $services
* If localgov_services is (being) installed.
*/
function localgov_directories_optional_fields_settings($services) {
$properties = [
'targetEntityType' => 'node',
'bundle' => 'localgov_directory',
];
if ($form_displays = \Drupal::entityTypeManager()->getStorage('entity_form_display')->loadByProperties($properties)) {
foreach ($form_displays as $form_display) {
assert($form_display instanceof EntityFormDisplayInterface);
if ($services && !$form_display->getComponent('localgov_services_parent')) {
$form_display->setComponent('localgov_services_parent', [
'type' => 'entity_reference_autocomplete',
'region' => 'content',
'settings' => [
'match_operator' => 'CONTAINS',
'size' => '60',
'placeholder' => '',
'match_limit' => 10,
],
'weight' => -10,
])->save();
}
}
}
}
/**
* Implements hook_ENTITY_TYPE_insert().
*
* - Mark new Directory entry content type for indexing.
* - Display the Directory channel search block on pages of this new Directory
* entry content type.
*/
function localgov_directories_field_config_insert(FieldConfigInterface $field) {
if ($field->getName() == Directory::CHANNEL_SELECTION_FIELD) {
\Drupal::classResolver(ConfigurationHelper::class)->insertedDirectoryChannelField($field);
}
elseif ($field->getName() == Directory::FACET_SELECTION_FIELD) {
\Drupal::classResolver(ConfigurationHelper::class)->insertedFacetField($field);
}
elseif ($field->getName() == Directory::TITLE_SORT_FIELD) {
\Drupal::classResolver(ConfigurationHelper::class)->insertedTitleSortField($field);
}
}
/**
* Implements hook_ENTITY_TYPE_insert().
*
* - Load optional configuration (presently facet blocks) when the facet is
* configured.
*/
function localgov_directories_facets_facet_insert(FacetInterface $facet) {
\Drupal::service('config.installer')->installOptionalConfig(NULL, [
'config' => 'facets.facet.' . $facet->id(),
]);
}
/**
* Implements hook_ENTITY_TYPE_delete().
*/
function localgov_directories_field_config_delete(FieldConfigInterface $field) {
if ($field->getName() == Directory::CHANNEL_SELECTION_FIELD) {
\Drupal::classResolver(ConfigurationHelper::class)->deletedDirectoryChannelField($field);
}
}
/**
* Implements hook_ENTITY_TYPE_update().
*/
function localgov_directories_search_api_index_update(IndexInterface $index) {
if ($index->status()
&& $index->getField(Directory::FACET_INDEXING_FIELD)
) {
\Drupal::classResolver(ConfigurationHelper::class)
->createFacet(Directory::FACET_CONFIG_ENTITY_ID, Directory::FACET_CONFIG_FILE);
}
}
/**
* Implements theme preprocess_facets_item_list().
*
* @see facets_preprocess_facets_item_list()
*/
function localgov_directories_preprocess_facets_item_list(array &$variables) {
if (!empty($variables['facet']) && ($variables['facet']->id() === Directory::FACET_CONFIG_ENTITY_ID || $variables['facet']->id() === Directory::FACET_CONFIG_ENTITY_ID_FOR_PROXIMITY_SEARCH)) {
\Drupal::service('class_resolver')
->getInstanceFromDefinition(DirectoryExtraFieldDisplay::class)
->preprocessFacetList($variables);
}
}
/**
* Prepares variables for directory facets templates.
*
* Default template: localgov-directories-facets.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An associative array containing the directory facets
* information and any fields attached to the entity.
* - attributes: HTML attributes for the containing element.
*/
function template_preprocess_localgov_directories_facets(array &$variables) {
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
}
/**
* Implements hook_search_api_index_items_alter().
*
* Populate localgov_directory_title_sort if empty.
*/
function localgov_directories_search_api_index_items_alter(IndexInterface $index, array &$items) {
foreach ($items as $item) {
if ($field = $item->getField('localgov_directory_title_sort')) {
$sort_value = $field->getValues();
if (empty($sort_value) || empty($sort_value[0])) {
// If the field is empty use the item title.
$sort_value = [trim($item->getOriginalObject()->getEntity()->label())];
$field->setValues($sort_value);
}
}
}
}
/**
* Implements hook_leaflet_map_view_style_alter().
*/
function localgov_directories_leaflet_map_view_style_alter(&$js_settings, $leaflet_map) {
// Add a value to the map if there are no features.
// https://github.com/localgovdrupal/localgov_directories/issues/229#issuecomment-1271418506
// This can be used in template if needed.
$js_settings['map']['is_empty'] = empty($js_settings['features']);
}
/**
* Implements hook_facets_search_api_query_type_mapping_alter().
*/
function localgov_directories_facets_search_api_query_type_mapping_alter($backend_plugin_id, array &$query_types) {
$query_types['localgov_directories'] = 'localgov_directories_query_type';
}