Как показать меню на всех дочерних страницах дочерних страниц drupal

Это мой код. Я показываю меню на странице и на дочерних страницах. Вопрос в том, как отобразить это меню на всех детских страницах?

/**
* Implements hook_preprocess_page().
*/
function agnian_material_admin_preprocess_page(&$variables) {
// @todo: add an if statement to add below data only for "page__admin__content" page.
$variables['node_types'] = node_type_get_names();

/ ** * Отображение меню страницы "admin / structure" во всех подстраницах. * /

// get current page path
$path = \Drupal::request()->getPathInfo();
if(strpos($path, '/admin/structure') !== false) {
$tree = \Drupal::menuTree();
$params = $tree->getCurrentRouteMenuTreeParameters('admin');
$admin_menu = $tree->load('admin', $params);
$admin_structure_menu = array_key_exists('system.admin_structure', $admin_menu['system.admin']->subtree) ? $admin_menu['system.admin']->subtree['system.admin_structure'] : null;
if($admin_structure_menu) {
$subtree = $tree->build($admin_structure_menu->subtree);

/ * эта часть предназначена только для синхронизации позиций пунктов меню между страницей "admin / structure" и ее дочерними страницами * /

$old_items = $subtree['#items'];
$tmp = $subtree['#items'] = array();
foreach($old_items as $key => $value) $tmp[$key] = $value['title'];
asort($tmp);
foreach($tmp as $key => $value) $subtree['#items'][$key] = $old_items[$key];

/ * конец синхронизации * /

$variables['admin_menu'] = $subtree;
}
}

/ ** Конец отрисовки меню страницы "admin / structure" на всех подстраницах. * /}


person Evi    schedule 18.10.2016    source источник
comment
Я не понимаю, если вы свяжете страницы и подстраницы с меню, используя бэк-офис, меню будет отображаться на всех этих страницах   -  person Matoeil    schedule 21.10.2016
comment
другой вариант создать меню в бэк-офисе, отобразить блок меню и по параметрам видимости выбрать страницу, на которой вы хотите, чтобы она отображалась   -  person Matoeil    schedule 21.10.2016
comment
Спасибо за ваш повтор. Я не понимаю, что такое бэк-офис? С этой треской меню отображается только в первом дочернем элементе, например, моя страница - x, меню показано в x, а its child x1 , and not shown in x1s child x2 (x ›x1› x2). МОЯ проблема - показать меню на страницах x2 и x3.   -  person Evi    schedule 21.10.2016
comment
Вам нужно сложное программное решение? пробовали ли вы использовать возможности, предлагаемые бэк-офисом (/ admin)   -  person Matoeil    schedule 24.10.2016
comment
Я не могу использовать бэк-офис, мне нужен только код решения   -  person Evi    schedule 24.10.2016
comment
я не прав или ваш код показывает меню только на странице / админке / структуре? Я думаю, вам нужно заменить if (strpos ($ path, '/ admin / structure')! == false) на регулярное выражение, чтобы получить все / admin / structure / *   -  person Matoeil    schedule 24.10.2016
comment
Мой код показывает меню на / admin / structure и / admin / structure / child. Я хочу показать это в / admin / structure / child / child / child   -  person Evi    schedule 24.10.2016


Ответы (1)


попробуйте заменить

 if(strpos($path, '/admin/structure') !== false) {

с участием

 if(preg_match("/admin/structure/[^/]+/[^/]+", $path)!== false) {

[^ /] + означает «Один или несколько символов, кроме косой черты».

или что-то еще после структуры должно быть

     if(  preg_match("/admin/structure(.*)", $path)!== false) {
person Matoeil    schedule 24.10.2016
comment
Дорогой, Матойл. Спасибо за ваше время и ответ. Я заменил его, но он не работает, и даже меню не отображается на родительской странице (я не знаю, что делать ( - person Evi; 27.10.2016