function MenuDevelGenerate::generateLinks
Same name in other branches
- 8.x-1.x devel_generate/src/Plugin/DevelGenerate/MenuDevelGenerate.php \Drupal\devel_generate\Plugin\DevelGenerate\MenuDevelGenerate::generateLinks()
- 4.x devel_generate/src/Plugin/DevelGenerate/MenuDevelGenerate.php \Drupal\devel_generate\Plugin\DevelGenerate\MenuDevelGenerate::generateLinks()
Generates menu links in a tree structure.
Return value
array<int|string, string> Array containing the titles of the generated menu links.
1 call to MenuDevelGenerate::generateLinks()
- MenuDevelGenerate::generateElements in devel_generate/
src/ Plugin/ DevelGenerate/ MenuDevelGenerate.php - Business logic relating with each DevelGenerate plugin.
File
-
devel_generate/
src/ Plugin/ DevelGenerate/ MenuDevelGenerate.php, line 300
Class
- MenuDevelGenerate
- Provides a MenuDevelGenerate plugin.
Namespace
Drupal\devel_generate\Plugin\DevelGenerateCode
protected function generateLinks(int $num_links, array $menus, int $title_length, array $link_types, int $max_depth, int $max_width) : array {
$links = [];
$menus = array_keys(array_filter($menus));
$link_types = array_keys(array_filter($link_types));
$nids = [];
for ($i = 1; $i <= $num_links; ++$i) {
// Pick a random menu.
$menu_name = $menus[array_rand($menus)];
// Build up our link.
$link_title = $this->getRandom()
->word(mt_rand(2, max(2, $title_length)));
/** @var \Drupal\menu_link_content\MenuLinkContentInterface $menuLinkContent */
$menuLinkContent = $this->menuLinkContentStorage
->create([
'menu_name' => $menu_name,
'weight' => mt_rand(-50, 50),
'title' => $link_title,
'bundle' => 'menu_link_content',
'description' => $this->t('Description of @title.', [
'@title' => $link_title,
]),
]);
$link = $menuLinkContent->get('link');
$options['devel'] = TRUE;
$link->setValue([
'options' => $options,
]);
// For the first $max_width items, make first level links, otherwise, get
// a random parent menu depth.
$max_link_depth = $i <= $max_width ? 0 : mt_rand(1, max(1, $max_depth - 1));
// Get a random parent link from the proper depth.
for ($depth = $max_link_depth; $depth >= 0; --$depth) {
$parameters = new MenuTreeParameters();
$parameters->setMinDepth($depth);
$parameters->setMaxDepth($depth);
$tree = $this->menuLinkTree
->load($menu_name, $parameters);
if ($tree === []) {
continue;
}
$menuLinkContent->set('parent', array_rand($tree));
break;
}
$link_type = array_rand($link_types);
switch ($link_types[$link_type]) {
case 'node':
// Grab a random node ID.
$select = $this->database
->select('node_field_data', 'n')
->fields('n', [
'nid',
'title',
])
->condition('n.status', 1)
->range(0, 1)
->orderRandom();
// Don't put a node into the menu twice.
if (isset($nids[$menu_name])) {
$select->condition('n.nid', $nids[$menu_name], 'NOT IN');
}
$node = $select->execute()
->fetchAssoc();
if (isset($node['nid'])) {
$nids[$menu_name][] = $node['nid'];
$link->setValue([
'uri' => 'entity:node/' . $node['nid'],
]);
$menuLinkContent->set('title', $node['title']);
break;
}
case 'external':
$link->setValue([
'uri' => 'https://www.example.com/',
]);
break;
case 'front':
$link->setValue([
'uri' => 'internal:/<front>',
]);
break;
default:
break;
}
$menuLinkContent->save();
$links[$menuLinkContent->id()] = $menuLinkContent->getTitle();
}
return $links;
}