Добрый день.
В общем, пытаюсь добавить программно дополнительный пункт в меню на сайте, для чего мне это нужно - долгая история.
По теме нашёл такую конструкцию:
'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"
Если кто-то в курсе, подскажите как это сделать правильно.
Комментарии
hook_menu
документация
RTFM
Хорошо, допустим я погуглил про hook_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 я пока не силён, с ходу разобраться не могу. Может подскажете что-то более конкретное и правильное?
и куда оно будет вести? поведайте долгую историю, иначе не ясно зачем этот огород
Ок. Всё банально. Нужно чтобы в меню первым пунктом выводился логотип сайта с ссылкой на главную страницу.
Берем форму меню,смотрим функцию сабмита,смотрим передаваемые значения, повторяем. Все в menu.module
Я разве не написал, что не очень понимаю API и мне нужны конкретные примеры?
мы в сказке?
лого можно приделать в theme layer, например
https://api.drupal.org/api/drupal/includes!theme.inc/function/theme/7
Слушайте, господа, если бы я отлично понимал вот это https://api.drupal.org/api, я бы не стал сюда писать. Всё это я уже видел и смотрю туда до сих пор, а обратился я за помощью в конкретных примерах, т.к. моё ковыряние с этим https://api.drupal.org/api пока ни к чему не привело, если всё что вы можете, это кинуть те же ссылки что я в состоянии нагуглить, то спасибо за старания, но мне не помогло.
т.е. лучше как обезьяна с гранатой действовать?
зы конкретный пример может последовать, только если присутствует конкретный контекст (вы его не предоставили, и при этом ждете некий код на блюдце, который словно по волшебству сделает меню вашей мечты)
Лучше чем что? Я спрашиваю совета, а вы мне тычите своим самомнением. Какого контекста вы от меня хотите, я привёл примеры сверху, которыми я располагаю. Я не услышал про них ничего, правильные они не правильные, и вообще можно ли так делать или в чём ошибка. Или вы думаете что от слов "theme layer" меня должно осенить? Или может я за час разберусь с API? И я разве где-то требовал готовый код? Можно хоть намекнуть на что-то более конкретное, правда, мы ведь не в угадайку играем? Если в вашем арсенале нет ничего кроме упрёков, то оставьте пожалуйста эту затею и не тратьте ваше время.
спрашиваете как программно добавить, но API смотреть это не по вашей части. хех
обижаетесь на комментарии по делу, игнорируя смысл
смотрите template.php в темах, где меню переписывается
под контекстом подразумеваю модуль, ответственный за меню, требования к версте. телепаты в отпуске
Не бывает легких путей , пробуйте спрашивать несколько раз
$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);
Посмотрел ваши темы, вы везде так вызывающе себя ведёте к участникам форума.
Нанимайте специалиста.
Вы являетесь таким специалистом? Давайте обсудим
Смысла в ваших комментариях нет. Я вам говорю - смотрю API и не понимаю за что зацепиться, подскажите, вы мне говорите - смотрите API. В чём ценность вашего совета? Может вы просто штатный тролль на этом форуме? Вот dashiwa, посмотрел мой пример и ответил на вопрос. Теперь я вижу свою ошибку, даже не одну. Одна из ошибок в самом вопросе, зато ответ дан чётко. А от вас я слышу только - "Блаблабла".
А про модуль ответственный за меню, и требования к вёртке, я вообще теряюсь что сказать. Вы правда не знаете какой модуль отвечает за меню в Drupal7? И чтоб вы поняли что такое меню, вам нужно сверстать стандартную структуру меню? Или к чему вы вообще приплетаете сюда вёрстку?
Спасибо, теперь всё работает, но как выяснилось решает несколько не ту задачу. Тут получается, что ссылка пишется в базу каждый раз. Мне же нужно, чтобы ссылка вызывалась просто из кода, на как я понимаю такого не бывает, либо бывает только в том случае если скажем переопределить/перезаписать уже существующую ссылку.
По сути вашей задачи, вам надо единожды добавить пункт меню.
Вы можете не мучаться с кодом, а в настройках меню добавить новый элемент.
Если же этот вариант вам не работает, пишите зачем и для сего делаете.
Вполне может быть что решать можно совсем по другому без кода совсем.
Ну я уже выяснил, что моя задумка в принципе ошибочна, я пошёл не тем путём. Я думал что таким образом смогу перенести логотип в меню.