-
Notifications
You must be signed in to change notification settings - Fork 0
/
weeshop_demo.module
150 lines (137 loc) · 4.64 KB
/
weeshop_demo.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
<?php
/**
* @file
* Contains weeshop_demo.module.
*/
use Drupal\Core\Config\FileStorage;
use Drupal\Core\Config\InstallStorage;
use Drupal\menu_link_content\Entity\MenuLinkContent;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\migrate\MigrateExecutable;
use Drupal\migrate\MigrateMessage;
use Symfony\Component\Yaml\Yaml;
/**
* Implements hook_help().
*/
function weeshop_demo_help($route_name, RouteMatchInterface $route_match): string {
switch ($route_name) {
// Main module help for the weeshop_demo module.
case 'help.page.weeshop_demo':
$output = '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('WeeShop demonstration data provider.') . '</p>';
return $output;
default:
return '';
}
}
/**
* Tool to concat the file names with a prefix path.
*/
function _weeshop_demo_migration_concat_file_path(array $data): array {
$files = explode('|', $data[0]);
$path = $data[1];
$new = [];
foreach ($files as $file) {
$new[] = $path . $file;
}
return $new;
}
/**
* Get all available migration ids.
*/
function _weeshop_demo_get_migration_list(): array {
$config_path = Drupal::service('extension.path.resolver')
->getPath('module', 'weeshop_demo') . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY;
$config_storage = new FileStorage($config_path);
return $config_storage->listAll('migrate_plus.migration');
}
/**
* Dynamic alter the relative file path to an absolute path.
*/
function weeshop_demo_migration_plugins_alter(array &$migrations): void {
$migration_list = _weeshop_demo_get_migration_list();
foreach ($migrations as $id => $migration) {
if (in_array('migrate_plus.migration.' . $id, $migration_list)) {
$migration['source']['path'] = __DIR__ . '/' . $migration['source']['path'];
if (isset($migration['source']['constants']['file_source_path'])) {
$migration['source']['constants']['file_source_path'] = __DIR__ . '/' . $migration['source']['constants']['file_source_path'];
}
$migrations[$id] = $migration;
}
}
}
/**
* Get migration list from migration file.
*/
function _weeshop_demo_get_migration_list_from_manifest_file() {
$manifest_file = Drupal::service('extension.path.resolver')
->getPath('module', 'weeshop_demo') . '/migrate_manifest.yml';
return Yaml::parse(file_get_contents($manifest_file));
}
/**
* Import or rollback the demonstration data.
*
* @noinspection PhpUnhandledExceptionInspection
*/
function _weeshop_demo_execute_migrations($action = 'import'): void {
Drupal::logger('weeshop_demo')->notice('Start to process migrations, action is [' . $action . ']');
$migrations = _weeshop_demo_get_migration_list_from_manifest_file();
if ($action === 'rollback') {
$migrations = array_reverse($migrations);
}
foreach ($migrations as $migration_id) {
$migration = Drupal::service('plugin.manager.migration')->createInstance($migration_id);
$executable = new MigrateExecutable($migration, new MigrateMessage());
if ($action === 'import') {
$executable->import();
}
if ($action === 'rollback') {
$executable->rollback();
}
Drupal::logger('weeshop_demo')->notice('Finished processing migration [' . $migration_id . ']');
}
Drupal::logger('weeshop_demo')->notice('Finished processing all migrations.');
// Create menu link for every product category terms.
/** @var \Drupal\taxonomy\TermStorageInterface $termStorage */
/*
$termStorage = Drupal::entityTypeManager()->getStorage('taxonomy_term');
$categories = $termStorage->loadTree('product_categories', 0, NULL, TRUE);
_weeshop_demo_create_menu_links($categories);
*/
}
/**
* Create menu links for the given categories.
*
* @throws \Drupal\Core\Entity\EntityStorageException
*/
function _weeshop_demo_create_menu_links($categories, $parent = NULL, $parent_link = NULL): void {
foreach ($categories as $category) {
/** @var \Drupal\taxonomy\TermInterface $category */
$field = $category->get('parent');
$empty = $field->isEmpty();
$entity = $field->entity;
if ($parent) {
if ($empty || !$entity || $entity->id() !== $parent) {
continue;
}
}
else {
if ($entity !== NULL) {
continue;
}
}
$data = [
'bundle' => 'menu_link_content',
'title' => $category->label(),
'link' => 'internal:/product-search?f[0]=categories:' . $category->id(),
'menu_name' => 'main',
'expanded' => TRUE,
];
if ($parent) {
$data['parent'] = 'menu_link_content:' . $parent_link->uuid();
}
$menu_link = MenuLinkContent::create($data);
$menu_link->save();
_weeshop_demo_create_menu_links($categories, $category->id(), $menu_link);
}
}