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

Главные вкладки

Аватар пользователя drupal noob drupal noob 23 октября 2015 в 15:06

Добрый день.

В общем, пытаюсь добавить программно дополнительный пункт в меню на сайте, для чего мне это нужно - долгая история.
По теме нашёл такую конструкцию:

    $item = array(
      'link_path' => 'node/' . $node->nid, // - путь на который будет вести ссылка.
      'link_title' => $node->title, // - заголовок нового пункта меню.
      'menu_name' => 'main-menu', // - системное имя меню, куда добавим ссылку.
      'hidden' => 0 // - 0 или 1.
    );
    menu_link_save($item);
   

Но что-то не работает.

Ещё нашёл "мануал" https://api.drupal.org/api/drupal/includes!menu.inc/function/menu_link_s... но это тоже не работает, хотя тут я не уверен что всё делаю правильно. Выдаёт ошибку "Cannot redeclare menu_link_save() \includes\menu.inc:3106"

Если кто-то в курсе, подскажите как это сделать правильно.

Комментарии

Аватар пользователя drupal noob drupal noob 23 октября 2015 в 16:24

Хорошо, допустим я погуглил про hook_menu(), посмотрел примеры и написал модуль:

function my_module_menu() {

  $items = array(); // инициализируем массив наших пунктов меню
     
    $items['page_example'] = array(  //добавляем страницу по пути 'page_example'
      'title' => 'Страница', //заголовок страницы
      'description' => 'Обычная страница', //описание страницы
      'page callback' => '_page_example', //функция возвращающая контент страницы
      'access callback' => TRUE, // разрешаем всем просматривать эту страницу
      'expanded' => TRUE,
      'menu_name' => 'my_menu', // Меню в котором вылазит ссылка
  );    
     
     
    return $items; //возвращаем список страниц
}

Всё это хорошо, всё это работает. Но что-то мне подсказывает, что решение моей задачи таким способом слишком громоздкое. И т.к. я не собираюсь создавать отдельную страницу по этому пути, мне такое решение не нравится и получается много лишних телодвижений. В Drupal API я пока не силён, с ходу разобраться не могу. Может подскажете что-то более конкретное и правильное?

Аватар пользователя drupal noob drupal noob 23 октября 2015 в 18:09

"dashiwa" wrote:
Берем форму меню,смотрим функцию сабмита,смотрим передаваемые значения, повторяем. Все в menu.module

Я разве не написал, что не очень понимаю API и мне нужны конкретные примеры?

Аватар пользователя .poltergeist .poltergeist 23 октября 2015 в 18:58

Enrico wrote:
"dashiwa" wrote:
Берем форму меню,смотрим функцию сабмита,смотрим передаваемые значения, повторяем. Все в menu.module

Я разве не написал, что не очень понимаю API и мне нужны конкретные примеры?

мы в сказке?
лого можно приделать в theme layer, например
https://api.drupal.org/api/drupal/includes!theme.inc/function/theme/7

Аватар пользователя drupal noob drupal noob 23 октября 2015 в 19:18

Слушайте, господа, если бы я отлично понимал вот это https://api.drupal.org/api, я бы не стал сюда писать. Всё это я уже видел и смотрю туда до сих пор, а обратился я за помощью в конкретных примерах, т.к. моё ковыряние с этим https://api.drupal.org/api пока ни к чему не привело, если всё что вы можете, это кинуть те же ссылки что я в состоянии нагуглить, то спасибо за старания, но мне не помогло.

Аватар пользователя .poltergeist .poltergeist 23 октября 2015 в 19:59

т.е. лучше как обезьяна с гранатой действовать?
зы конкретный пример может последовать, только если присутствует конкретный контекст (вы его не предоставили, и при этом ждете некий код на блюдце, который словно по волшебству сделает меню вашей мечты)

Аватар пользователя drupal noob drupal noob 23 октября 2015 в 20:15

Лучше чем что? Я спрашиваю совета, а вы мне тычите своим самомнением. Какого контекста вы от меня хотите, я привёл примеры сверху, которыми я располагаю. Я не услышал про них ничего, правильные они не правильные, и вообще можно ли так делать или в чём ошибка. Или вы думаете что от слов "theme layer" меня должно осенить? Или может я за час разберусь с API? И я разве где-то требовал готовый код? Можно хоть намекнуть на что-то более конкретное, правда, мы ведь не в угадайку играем? Если в вашем арсенале нет ничего кроме упрёков, то оставьте пожалуйста эту затею и не тратьте ваше время.

Аватар пользователя .poltergeist .poltergeist 23 октября 2015 в 20:56

спрашиваете как программно добавить, но API смотреть это не по вашей части. хех
обижаетесь на комментарии по делу, игнорируя смысл

смотрите template.php в темах, где меню переписывается
под контекстом подразумеваю модуль, ответственный за меню, требования к версте. телепаты в отпуске

Аватар пользователя dashiwa dashiwa 23 октября 2015 в 20:34

Не бывает легких путей , пробуйте спрашивать несколько раз

$node = node_load(123); // Load some node from database and use them for new menu link.
$item = array(
'link_path' => 'node/' . $node->nid,
'link_title' => $node->title,
'menu_name' => 'header-top-menu', // Menu machine name, for example: main-menu
'weight' => 0,
'language' => $node->language,
'plid' => 0, // Parent menu item, 0 if menu item is on top level
'module' => 'menu',
);
menu_link_save($item);
Аватар пользователя Studio VIZA Studio VIZA 23 октября 2015 в 20:48

"Enrico" wrote:
тычите своим самомнением

Посмотрел ваши темы, вы везде так вызывающе себя ведёте к участникам форума.

Нанимайте специалиста.

Аватар пользователя drupal noob drupal noob 24 октября 2015 в 1:24

"Director cemetery" wrote:
Посмотрел ваши темы, вы везде так вызывающе себя ведёте к участникам форума.

Нанимайте специалиста.


Вы являетесь таким специалистом? Давайте обсудим

Аватар пользователя drupal noob drupal noob 25 октября 2015 в 1:42

"Enrico" wrote:
спрашиваете как программно добавить, но API смотреть это не по вашей части. хех
обижаетесь на комментарии по делу, игнорируя смысл

смотрите template.php в темах, где меню переписывается
под контекстом подразумеваю модуль, ответственный за меню, требования к версте. телепаты в отпуске


Смысла в ваших комментариях нет. Я вам говорю - смотрю API и не понимаю за что зацепиться, подскажите, вы мне говорите - смотрите API. В чём ценность вашего совета? Может вы просто штатный тролль на этом форуме? Вот dashiwa, посмотрел мой пример и ответил на вопрос. Теперь я вижу свою ошибку, даже не одну. Одна из ошибок в самом вопросе, зато ответ дан чётко. А от вас я слышу только - "Блаблабла".
А про модуль ответственный за меню, и требования к вёртке, я вообще теряюсь что сказать. Вы правда не знаете какой модуль отвечает за меню в Drupal7? И чтоб вы поняли что такое меню, вам нужно сверстать стандартную структуру меню? Или к чему вы вообще приплетаете сюда вёрстку?

Аватар пользователя drupal noob drupal noob 24 октября 2015 в 1:44

"dashiwa" wrote:

Не бывает легких путей , пробуйте спрашивать несколько раз

Спасибо, теперь всё работает, но как выяснилось решает несколько не ту задачу. Тут получается, что ссылка пишется в базу каждый раз. Мне же нужно, чтобы ссылка вызывалась просто из кода, на как я понимаю такого не бывает, либо бывает только в том случае если скажем переопределить/перезаписать уже существующую ссылку.

Аватар пользователя gor gor 24 октября 2015 в 6:33

По сути вашей задачи, вам надо единожды добавить пункт меню.

Вы можете не мучаться с кодом, а в настройках меню добавить новый элемент.

Если же этот вариант вам не работает, пишите зачем и для сего делаете.
Вполне может быть что решать можно совсем по другому без кода совсем.

Аватар пользователя drupal noob drupal noob 25 октября 2015 в 1:41

Ну я уже выяснил, что моя задумка в принципе ошибочна, я пошёл не тем путём. Я думал что таким образом смогу перенести логотип в меню.