File: /home/iestorre/www2/modules/node_menu/node_menu.module
<?php
// $Id: node_menu.module,v 1.4.2.1 2009/04/10 11:52:56 develCuy Exp $
/**
* Implementation of hook_form_alter().
*/
function node_menu_form_alter(&$form, $form_state, $form_id) {
if ($form_id == 'menu_edit_item_form') {
$node_menu = db_fetch_object(db_query("SELECT nr.nid, nr.title, nr.body FROM {node_menu} JOIN {node_revisions} nr ON nr.nid = nm_node_id WHERE nm_menu_id = %d", $form['mid']['#value']));
if (is_object($node_menu)) {
// Recover from node
$form['title']['#value'] = $node_menu->title;
$form['description']['#value'] = $node_menu->body;
// Copy
$form['nm_title'] = $form['title'];
$form['nm_description'] = $form['description'];
// Hide
$form['title']['#type'] = 'hidden';
$form['description']['#type'] = 'hidden';
// Sort
$form['nm_title']['#weight'] = -2;
$form['nm_description']['#weight'] = -1;
// Set to read-only
$form['nm_title']['#type'] = 'item';
$form['nm_description']['#type'] = 'item';
// Link to node
$form['nm_title']['#value'] = l($node_menu->title, 'node/'. $node_menu->nid);
}
else {
if (strlen($form['description']['#default_value']) > 50) {
$form['description']['#type'] = 'textarea';
$form['description']['#rows'] = '5';
}
}
}
if (isset($form['#node']) && $form['#id'] == 'node-form' && user_access('administer menu')) {
$item = array();
if ($form['nid']['#value'] > 0) {
$item = db_fetch_array(db_query("SELECT *, nm_menu_id mlid FROM {node_menu} JOIN {menu_links} ml ON nm_menu_id = ml.mlid WHERE nm_node_id = %d", $form['nid']['#value']));
if (isset($form['#post']['node_menu']) && is_array($form['#post']['node_menu'])) {
$item = !is_array($item) ? $form['#post']['node_menu'] : (($form['#post']['op'] == t('Preview')) ? array_merge($item, $form['#post']['node_menu']) : array_merge($form['#post']['node_menu'], $item));
}
}
$form['node_menu'] = array(
'#type' => 'fieldset',
'#title' => 'Node menu settings',
'#access' => user_access('administer menu'),
'#collapsible' => TRUE,
'#collapsed' => !is_array($item),
'#tree' => TRUE,
'#weight' => -2,
'#attributes' => array('class' => 'menu-item-form'),
);
$item = $form['#node']->node_menu;
if ($item['mlid'] > 0) {
$form['node_menu']['delete'] = array(
'#type' => 'checkbox',
'#title' => t('Check to delete this menu item.'),
'#default_value' => $item['delete'],
);
}
foreach (array('mlid', 'module', 'hidden', 'has_children', 'customized', 'options', 'expanded', 'hidden', 'parent_depth_limit') as $key) {
$form['node_menu'][$key] = array('#type' => 'value', '#value' => $item[$key]);
}
$form['node_menu']['link_path'] = array(
'#type' => 'textfield',
'#title' => t('Override path'),
'#default_value' => $item['link_path'],
'#description' => t('Optional. To be used instead of current node page.'),
);
// Generate a list of possible parents.
$options = menu_parent_options(menu_get_menus(), $item);
$default = $item['menu_name'] .':'. $item['plid'];
if (!isset($options[$default])) {
$default = 'primary-links:0';
}
$form['node_menu']['parent'] = array(
'#type' => 'select',
'#title' => t('Parent item'),
'#default_value' => $default,
'#options' => $options,
'#description' => t('The maximum depth for an item and all its children is fixed at !maxdepth. Some menu items may not be available as parents if selecting them would exceed this limit.', array('!maxdepth' => MENU_MAX_DEPTH)),
'#attributes' => array('class' => 'menu-title-select'),
);
$form['node_menu']['weight'] = array(
'#type' => 'weight',
'#title' => t('Weight'),
'#delta' => 50,
'#default_value' => $item['weight'],
'#description' => t('Optional. In the menu, the heavier items will sink and the lighter items will be positioned nearer the top.'),
);
}
}
/**
* Implementation of hook_nodeapi().
*/
function node_menu_nodeapi(&$node, $op) {
$admin_access = user_access('administer menu');
switch ($op) {
case 'insert':
case 'update':
if ($admin_access) {
if (isset($node->node_menu)) {
$item = $node->node_menu;
if (!empty($item['delete'])) {
node_menu_delete_item($node);
}
elseif (trim($item['link_path'])) {
// Syncronyze with Node
$item['link_title'] = $node->title;
$item['options']['attributes']['title'] = $node->body;
// Completion with valid data
$item['menu_name'] = current(explode(':', $item['parent']));
$item['module'] = 'menu';
$item['customized'] = TRUE;
$menu_id = menu_link_save($item);
if (!$menu_id)
drupal_set_message(t('There was an error saving the node menu link.'), 'error');
else {
node_menu_save_item($node->nid, $menu_id);
}
}
}
}
break;
case 'delete':
if (user_access('administer menu')) {
node_menu_delete_item($node);
}
break;
case 'prepare':
if (empty($node->node_menu)) {
// Prepare the node for the edit form so that $node->menu always exists.
$menu_name = variable_get('menu_default_node_menu', 'primary-links');
$item = array();
if (isset($node->nid)) {
// Give priority to the default menu
$mlid = db_result(db_query_range("SELECT nm_menu_id mlid FROM {node_menu} JOIN {menu_links} ml ON nm_menu_id = ml.mlid WHERE nm_node_id = %d", $node->nid, 0, 1));
// Check all menus if a link does not exist in the default menu.
if ($mlid) {
$item = menu_link_load($mlid);
}
}
// Set default values.
$node->node_menu = $item + array('link_title' => '', 'mlid' => 0, 'plid' => 0, 'menu_name' => $menu_name, 'weight' => 0, 'options' => array(), 'module' => 'menu', 'expanded' => 0, 'hidden' => 0, 'has_children' => 0, 'customized' => 0);
}
// Find the depth limit for the parent select.
if (!isset($node->node_menu['parent_depth_limit'])) {
$node->node_menu['parent_depth_limit'] = _menu_parent_depth_limit($node->node_menu);
}
break;
}
}
/**
* Save node-menu association by given Node ID and Menu ID.
*/
function node_menu_save_item($node_id, $menu_id) {
// Just one node for one menu item
if (is_numeric($node_id) && is_numeric($menu_id)) {
$rs = db_result(db_query("SELECT count(*) FROM {node_menu} WHERE nm_node_id = %d", $node_id));
if ($rs) {
$node_menu = db_fetch_object($rs);
db_query("UPDATE {node_menu} SET nm_menu_id = %d WHERE nm_node_id = %d", $node_id, $menu_id);
return TRUE;
}
else {
db_query("INSERT INTO {node_menu}(nm_node_id, nm_menu_id) VALUES(%d, %d)", $node_id, $menu_id);
return TRUE;
}
}
// Something goes wrong
return FALSE;
}
/**
* Delete node-menu association by given valid Node Object.
*/
function node_menu_delete_item($node) {
if (isset($node->nid) && is_numeric($node->nid)) {
// Delete menu item
menu_link_delete($node->node_menu['mlid']);
// Delete relation
db_query("DELETE FROM {node_menu} WHERE nm_node_id = %d", $node->nid);
}
}
/**
* Implementation of hook_views_data().
*/
function node_menu_views_data() {
// ----------------------------------------------------------------
// node_menu table
// Define the base group of this table. Fields that don't
// have a group defined will go into this field by default.
$data['node_menu']['table']['group'] = t('Node menu');
/*
$data['node_menu']['table']['base'] = array(
'field' => 'nm_id',
'title' => t('Node Menu'),
'help' => t('Relationships between nodes and menus.'),
);
*/
$data['node_menu']['table']['join'] = array(
'node' => array(
'left_field' => 'nid',
'field' => 'nm_node_id',
'type' => 'INNER',
),
);
$data['node_menu']['nm_menu_id'] = array(
'title' => t('Menu link ID'),
'help' => t('Unique menu link identifier.'),
'field' => array(
'handler' => 'views_handler_field',
),
'relationship' => array(
'base' => 'menu_links',
'field' => 'mlid',
'handler' => 'views_handler_relationship',
'label' => t('Menu links'),
),
);
// ----------------------------------------------------------------
// node_menu table
$data['menu_links']['table']['group'] = t('Node menu');
$data['menu_links']['table']['base'] = array(
'field' => 'mlid',
'title' => t('Menu link ID'),
'help' => t('Menu links created in your system.'),
);
$data['menu_links']['table']['join'] = array(
'node_menu' => array(
'left_field' => 'nm_menu_id',
'field' => 'mlid',
'type' => 'INNER',
),
);
$data['menu_links']['mlid'] = array(
'title' => t('Link title'),
'help' => t('Display node title linked to its node menu url.'),
'field' => array(
'handler' => 'node_menu_handler_field_link_title',
),
);
$data['menu_links']['link_path'] = array(
'title' => t('Link'),
'help' => t('Display link with custom text.'),
'field' => array(
'handler' => 'node_menu_handler_field_link',
),
);
return $data;
}
/**
* Implementation of hook_views_handlers().
*/
function node_menu_views_handlers() {
return array(
'handlers' => array(
'node_menu_handler_field_link_title' => array(
'parent' => 'views_handler_field',
),
'node_menu_handler_field_link' => array(
'parent' => 'views_handler_field',
),
),
);
}