Обновлять ссылку меню программно

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

Я хочу обновить ссылки меню с идентификаторами узлов в моем сценарии импорта, но я не нашел, как это сделать программно. Мы не хотим обновлять их вручную во время окончательной миграции.

Как я могу это сделать?

6 голосов | спросил user1359 1 PM00000090000003131 2014, 21:13:31

1 ответ


8

Я предполагаю, что вы знаете путь к ссылке, которую нужно изменить, и все? Если это так, то это сработает для вас. Обратите внимание, что я добавил комментарии вместо сообщений об ошибках /успехах, которые вы можете добавить, если хотите.

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

Примечание. Пути, используемые для пунктов меню, - внутренние пути drupal, а не псевдонимы путей. Чтобы преобразовать псевдоним пути во внутренний путь, вы можете использовать drupal_get_normal_path () .

// Variables used below. Set these to the values you need.
// The current path of the link.
$path = '';
// The menu the link is in. If you don't want to be menu specific remove the menu_name part of the SQL below.
$menu = '';
// The new path for the link.
$new_path = '';

// Get the menu link ID for the given path in the given menu.
// If you donb't know the menu it is in you can omit that part of the query.
// This also handles the case where there are multiple menu links for the same
// path.
$mlids = db_query("SELECT mlid FROM {menu_links} WHERE link_path = :path AND menu_name = :menu", array(':path' => $path, ':menu' => $menu))->fetchCol();
if ($mlids) {
  // Loop through the matching menu items and update them.
  foreach ($mlids as $mlid) {
    if ($menu_link = menu_link_load($mlid)) {
      // Set the new menu link data.
      $menu_link['link_path'] = $new_path;
      // Save the menu link.
      if (!menu_link_save($menu_link)) {
        // There was an error saving the link.
      }
      else {
        // The link has been saved successfully.
      }
    }
    else {
      // Menu link $mlid not found.
    }
  }
}
else {
  // No menu links were found for this $path.
}
ответил rooby 4 AM00000050000005431 2014, 05:07:54

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132