Forked from
project / facets
109 commits behind, 38 commits ahead of the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
facets.install 7.82 KiB
<?php
/**
* @file
* Update hooks for the facets module.
*/
use Drupal\facets\Entity\Facet;
use Drupal\facets\Entity\FacetSource;
use Drupal\block\Entity\Block;
use Drupal\facets\Plugin\facets\facet_source\SearchApiDisplay;
/**
* Implements hook_update_dependencies().
*/
function facets_update_dependencies() {
$dependencies = [];
if (version_compare(\Drupal::VERSION, '8.6', '>=')
&& \Drupal::service('module_handler')->moduleExists('block_content')
) {
// block_content_update_8600() adds some fields to Blocks that makes
// facets_update_8006() fail if upgraded at the same time.
$dependencies['facets'][8006] = [
'block_content' => 8600,
];
}
return $dependencies;
}
/**
* Convert facets on Search Api facet sources to use the display plugin.
*/
function facets_update_8001() {
// We changed the way we work with search api facet sources, we're now using
// the SearchApiDisplay plugins that search api ships with. This consolidates
// the external points for facets, sorts, autocomplete and others. This
// refactor made us a better member of the Search API family. It also makes it
// easier for other modules that provide a display to support facets, for
// example, for the search_api_page module.
//
// This only works for the 3 default plugins that we previously shipped. So
// only views that have a page, block, or rest display. The id will get
// replaced from views_page:foo to search_api:views_page__foo.
$old_ids = ['views_page', 'views_block', 'views_rest'];
/** @var \Drupal\facets\FacetInterface[] $entities */
$entities = Facet::loadMultiple();
foreach ($entities as $entity) {
$facetSourceId = $entity->getFacetSourceId();
foreach ($old_ids as $id) {
if (strpos($facetSourceId, $id) !== FALSE) {
$new_id = str_replace($id . ':', 'search_api:' . $id . '__', $facetSourceId);
$entity->setFacetSourceId($new_id);
$entity->save();
}
}
}
/** @var \Drupal\facets\FacetSourceInterface[] $facetsources */
$facetsources = FacetSource::loadMultiple();
foreach ($facetsources as $facetsource) {
$as_array = $facetsource->toArray();
// Replace id and name to new naming scheme.
foreach ($old_ids as $id) {
if (strpos($as_array['id'], $id) !== FALSE) {
$as_array['id'] = str_replace($id . '__', 'search_api__' . $id . '__', $as_array['id']);
$as_array['name'] = str_replace($id . ':', 'search_api:' . $id . '__', $as_array['name']);
}
}
// Create new source.
unset($as_array['uuid']);
$existing = FacetSource::load($as_array['id']);
if (!$existing) {
FacetSource::create($as_array)->save();
// Delete old facet source.
$facetsource->delete();
}
}
}
/**
* Remove 'other_facet' plugin for older versions of facets.
*/
function facets_update_8002() {
$database = \Drupal::database();
$query = $database
->query("SELECT * FROM {config} WHERE data LIKE '%other_facet%'");
$results = $query->fetchAll();
foreach ($results as $result) {
$data = unserialize($result->data);
if (isset($data['visibility']['other_facet'])) {
unset($data['visibility']['other_facet']);
}
$database->update('config')
->fields([
'data' => serialize($data),
])
->condition('name', $result->name)
->execute();
}
}
/**
* WARNING: Facets core search support has been moved into a separate project.
*
* If you are using this feature, you need do download the "facets_core_search"
* module from drupal.org."
*/
function facets_update_8003() {
\Drupal::database()->delete('key_value')
->condition('collection', 'system.schema')
->condition('name', 'core_search_facets')
->execute();
}
/**
* Migrate facets with date widget to use date processor and links widget.
*/
function facets_update_8004() {
foreach (Facet::loadMultiple() as $facet) {
$widget = $facet->getWidget();
if ($widget['type'] === 'datebasic') {
// Set widget to use links instead.
$facet->setWidget('links', ['show_numbers' => $widget['config']['show_numbers']]);
// Migrate widget to processor settings and enable date_item processor.
$settings = [
'date_format' => $widget['config']['date_display'],
'granularity' => $widget['config']['granularity'],
'date_display' => 'actual_date',
];
if ($widget['config']['display_relative']) {
$settings['date_display'] = 'relative_date';
}
$facet->addProcessor([
'processor_id' => 'date_item',
'weights' => ['build' => 35],
'settings' => $settings,
]);
$facet->save();
}
}
}
/**
* Migrate facets with granular widget to use date processors + links widget.
*/
function facets_update_8005() {
foreach (Facet::loadMultiple() as $facet) {
$widget = $facet->getWidget();
if ($widget['type'] === 'numericgranular') {
// Set widget to use links instead.
$facet->setWidget('links', ['show_numbers' => $widget['config']['show_numbers']]);
// Migrate widget to processor settings and enable date_item processor.
$settings = [
'granularity' => $widget['config']['granularity'],
];
$facet->addProcessor([
'processor_id' => 'granularity_item',
'weights' => ['build' => 35],
'settings' => $settings,
]);
$facet->save();
}
}
}
/**
* Update facet blocks configuration with a block id used for AJAX support.
*/
function facets_update_8006() {
$query = \Drupal::entityQuery('block')
->condition('plugin', 'facet_block', 'STARTS_WITH')
->accessCheck()
->execute();
foreach ($query as $block_id) {
$block = Block::load($block_id);
$configuration = $block->get('settings');
$configuration['block_id'] = $block_id;
$block->set('settings', $configuration);
$block->save();
}
}
/**
* Resave facets for consistent configuration export.
*/
function facets_update_8007() {
// Moved to facets_update_8009().
}
/**
* Support different hierarchy plugin types.
*/
function facets_update_8008() {
$config_factory = \Drupal::configFactory();
foreach ($config_factory->listAll('facets.facet.') as $facet_config_name) {
$facet = $config_factory->getEditable($facet_config_name);
$facet->set('hierarchy', ['type' => 'taxonomy', 'config' => []]);
$facet->save(TRUE);
}
}
/**
* Resave facets for consistent configuration export.
*/
function facets_update_8009() {
// Moved to facets_update_8011().
}
/**
* Enable facet block caching for the views with "Search API tag or time" cache.
*/
function facets_update_8010() {
// Moved to facets_update_8012().
}
/**
* Resave facets for consistent configuration export.
*/
function facets_update_8011() {
$facets = Facet::loadMultiple();
foreach ($facets as $facet) {
$facet->save();
}
}
/**
* Update facet block caching for the views with "Search API tag or time" cache.
*/
function facets_update_8012() {
$facet_storage = \Drupal::entityTypeManager()->getStorage('facets_facet');
$processed_views = [];
/** @var \Drupal\facets\FacetInterface $facet */
foreach ($facet_storage->loadMultiple() as $facet) {
if (
($source = $facet->getFacetSource())
&& $source instanceof SearchApiDisplay
&& ($view_executable = $source->getViewsDisplay())
&& !in_array($view_executable->id(), $processed_views)
&& ($cache_plugin = $view_executable->getDisplay()->getPlugin('cache'))
&& in_array(
$cache_plugin->getPluginId(),
['search_api_tag', 'search_api_time']
)
) {
$view_executable->save();
$processed_views[] = $view_executable->id();
}
}
return !empty($processed_views)
? sprintf('Facet caching was updated for the following views: %s.', implode(', ', $processed_views))
: 'There are no views with search API cache plugins and facets in the same time, so nothing has been updated.';
}