Вы здесь

Как программно изменить ссылку в пункте меню?

0

Делаю сайт, на котором пользователю на определённом этапе нужно выбрать регион. Если регион не выбран, то ссылки в меню должны отображать все материалы. Если регион выбран, то к ссылке в меню должен добавляться аргумент с номером региона.

Например. Обычная ссылка: http://test.ru/events/
Ссылка с регионом: http://test.ru/events/1

Подскажите, как программно изменть ссылку?

Версия Drupal: 
7.x
Категория: 
Menu API
Вопрос задан 26.10.2015 - 16:55
Аватар пользователя shu
shu
136

Ответы

0

вы можете вывести меню программно и делать с ссылками что угодно

$menu = menu_tree('название меню');

foreach (element_children($menu) as $key => $value) {
    if  ($value['#href'] == 'events') {
        //...
    }
}

return render($menu);
Ответ дан 26.10.2015 - 19:23
<?

/**
 * Implements hook_block_info().
 */
function culture_block_info() {
  $blocks['culture-menu'] = array(
    'info' => 'Меню',
    'cache' => DRUPAL_NO_CACHE,
  );
  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function culture_block_view($delta = '') {
  $block = array();
  switch ($delta) {

    case 'culture-menu':
      $block['subject'] = '';

      //берём меню и правим его, если нужно. у меня динамическая переменная хранится в $_SESSION['region']
      $region = (isset($_SESSION['region'])) ? $_SESSION['region'] : FALSE ;
      $menu = menu_tree('main-menu'); //в каком меню нужно править ссылки
      foreach ($menu as $key => $value) {
        if(isset($value['#href']) && $region){ // если в меню ссылка и есть динамическая переменная
          $href = drupal_parse_url($value['#href']); //разбираем урл
          $path = explode('/', $href['path']); //разбираем путь
          if($path[0] == 'r' && $path[1]){ //если путь начинается с r и есть что-то после r
            $path[1] = $region; //то заменяем это что-то своей переменной
          }
          $menu[$key]['#href'] = implode('/', $path); //собираем путь обратно
        }
      }

      $block['content'] = render($menu); //рендерим меню в своём блоке
      break;
  }
  return $block;
}
Комментарий оставлен 23.01.2016 - 16:12
0

Если сделать нужно только в одном конкретном блоке меню, а не вообще все ссылки на сайте, то можно так. Взять хук hook_block_view_alter (https://api.drupal.org/api/drupal/modules!block!block.api.php/function/h...) и пройтись по пунктам меню в $data['content'] - там массивчик внутри будет. В этом массивчике можно поменять одни пункты на другие.

Ответ дан 26.10.2015 - 17:20

Если же нужно фундаментальное решение, чтобы все ссылки так работали, можно пошаманить с hook_url_inbound/outbound_alter

Комментарий оставлен 26.10.2015 - 17:24
0

Для задания динамических ссылок в меню, когда ссылка формируется от каких-то значений, используются функции to_arg()
Вот здесь об этом рассказывается
http://books-cms.clan.su/publ/drupal/cms_drupal_7_rukovodstvo_po_razrabo...
Желательно ознакомиться с главой про систему меню с самого начала.

В общем случае здесь в своем модуле определяется две ссылки в hook_menu -
$items['events'] и $items['events/%region']

Далее описываете функцию region_to_arg($arg), в которой возвращаете id выбранного пользователем региона.

А чтобы в случае без регионов отображалась первая ссылка, в во втором случае - вторая - это можно решить с помощью функций access callback для обеих ссылок.
Только для первой ссылки разрешаете доступ в случае, если регион не выбран. А во второй ссылке разрешаете доступ в случае, если регион выбран.

Ответ дан 26.10.2015 - 18:02

Да, с access callback будет правильно: то одна ссылка будет видна, то другая.

Комментарий оставлен 26.10.2015 - 18:12

Думаю, если бы ссылки были не events и events/1, а, например, events/all и events/1, то было бы намного проще.
Уже было бы достаточно одного элемента в hook_menu и не нужно было бы разделять их отображение с помощью access callback.

Комментарий оставлен 26.10.2015 - 19:56

На самом деле нет, hook_menu это одно, а как определить, какую ссылку показывать в самом меню - это другое :)

Комментарий оставлен 26.10.2015 - 22:43

Сложновато показалось для моего случая. Но посмотрю, тема интересная.

Комментарий оставлен 27.10.2015 - 16:05