You are here

menu.inc in Node import 6

Support file for the core menu module.

File

supported/menu.inc
View source
<?php

// $Id: menu.inc,v 1.1.2.8 2009/01/15 20:05:52 robrechtj Exp $

/**
 * @file
 * Support file for the core menu module.
 */

/**
 * Implementation of hook_node_import_fields().
 */
function menu_node_import_fields($type) {
  $fields = array();
  if (($node_type = node_import_type_is_node($type)) !== FALSE) {
    $fields['menu:link_title'] = array(
      'title' => t('Menu link title'),
      'group' => t('Menu settings'),
      'module' => 'menu',
      'is_mappable' => user_access('administer menu'),
    );
    $fields['menu:path'] = array(
      'title' => t('Alias for node which should be used as parent menu'),
      'group' => t('Menu settings'),
      'module' => 'menu',
      'is_mappable' => user_access('administer menu'),
    );
    $fields['menu:parent'] = array(
      'title' => t('Parent Menu'),
      'group' => t('Menu settings'),
      'module' => 'menu',
      'is_mappable' => FALSE,
    );
  }
  return $fields;
}

/**
 * Implementation of hook_node_import_defaults().
 * 
 * Global defaults for menus would be confusing. Select only the parent menu.
 */
function menu_node_import_defaults($type, $defaults, $fields, $map) {
  $form = array();

  // If we are importing nodes and user can administer menus...
  if (($node_type = node_import_type_is_node($type)) !== FALSE && user_access('administer menu')) {

    // Which main menu will these items be imported under.
    $result = db_query("SELECT * FROM {menu_custom} ORDER BY title");
    $menu_options = array();
    while ($menu = db_fetch_array($result)) {
      $menu_options[$menu['menu_name']] = $menu['menu_name'];
    }
    $menu_options = menu_parent_options(menu_get_menus(), array(
      'mlid' => 0,
    ));
    $form['menu:parent'] = array(
      '#title' => t('Parent Menu'),
      '#type' => 'select',
      '#options' => $menu_options,
      '#default_value' => isset($defaults['menu:parent']) ? $defaults['menu:parent'] : 'primary-links:0',
    );
  }
  return $form;
}

/**
 * Implementation of hook_node_import_values_alter().
 * 
 * Look up the menu item using the provided path alias for the node's chosen
 * menu parent.
 * 
 * Here we restructure the values back from the menu: format back into an array
 * for saving.
 */
function menu_node_import_values_alter(&$values, $type, $defaults, $options, $fields, $preview) {
  static $first_run = TRUE;

  // If we are importing nodes and user can administer menus...
  if (($node_type = node_import_type_is_node($type)) !== FALSE && user_access('administer menu')) {
    if ($first_run) {
      $menu_weight = -50;
      $first_run = FALSE;
    }
    else {
      $menu_weight = variable_get('node_import_menu_weight', -51);
      $menu_weight++;

      // If the menu weight gets above the max, roll it over...
      if ($menu_weight > 50) {
        $menu_weight = -50;
      }
    }
    variable_set('node_import_menu_weight', $menu_weight);

    // If the user is trying to configure menu path...
    if (isset($values['menu:path']) && drupal_strlen($values['menu:path']) > 0) {

      // dpm("Set menu based on path '".$values['menu:path']."' under parent: '".$values['menu:parent']."'");
      // Get the menu id using the provided parent node alias
      if (($parent = node_import_get_object('menu:path', $values['menu:path'])) || ($parent = menu_node_import_get_parent_from_path($values['menu:path']))) {
        $values['menu:parent'] = $parent;
      }
      else {

        // otherwise drop it into the configured menu root.
        drupal_set_message("Failed to find an existing menu parent of " . $values['menu:path'] . " - just dropping it in the root of the menu.");
      }

      // Caching the parent will avoid looking it up the next time
      node_import_set_object('menu:path', $values['menu:parent'], $values['menu:path']);

      // Every menu needs a title, even if one wasn't provided
      $values['menu:link_title'] = isset($values['menu:link_title']) ? $values['menu:link_title'] : $values['title'];

      // dpm("Parent of '".$values['title']."' will be '".$values['menu:parent']."'");
      $values['menu'] = array(
        'parent' => $values['menu:parent'],
        'weight' => $menu_weight,
        'link_title' => $values['menu:link_title'],
      );
    }
    else {
      if (isset($values['menu:link_title']) && drupal_strlen($values['menu:link_title']) > 0) {

        // If user configured menu link title, just drop it in the root of the menu

        //dpm("Parent of '".$values['menu:link_title']."' will be '".$values['menu:parent']."'");
        $values['menu'] = array(
          'parent' => $values['menu:parent'],
          'weight' => $menu_weight,
          'link_title' => $values['menu:link_title'],
        );
      }
    }
  }
}

/**
 * Given an url alias, look to see if a menu item already exists
 */
function menu_node_import_get_parent_from_path($parent_path) {
  if (!$parent_path) {
    return NULL;
  }

  // look up appropriate menu item identifier
  drupal_lookup_path('wipe');

  // batch jobbing this needs to flush the cache
  if ($parent_system_path = drupal_get_normal_path($parent_path)) {

    // menu doesn't provide a get-menu item by name. Do it myself. This also helps avoid menu caching issues.
    $result = db_query("SELECT mlid,plid,menu_name FROM {menu_links} WHERE link_path = '%s' LIMIT 1", $parent_system_path);
    while ($menu_item = db_fetch_array($result)) {
      $parent = $menu_item['menu_name'] . ':' . $menu_item['mlid'];
    }

    // However later processes (node_save validate) are not up to date with the just-created menu items
    // and don't believe the parent exists :-(
    // Do I really have to:
    // menu_rebuild(); // each time?
    // This slows everything down HEAPS
    // so really should check if it's needed first
    menu_rebuild();

    // menu.module appears to provide an out? - beware - this setting messes up menu selector functions

    #variable_set('menu_override_parent_selector', TRUE);
    return $parent;
  }
}

Functions

Namesort descending Description
menu_node_import_defaults Implementation of hook_node_import_defaults().
menu_node_import_fields Implementation of hook_node_import_fields().
menu_node_import_get_parent_from_path Given an url alias, look to see if a menu item already exists
menu_node_import_values_alter Implementation of hook_node_import_values_alter().