| 1 |
<?php |
<?php |
| 2 |
// $Id: category_menu.module,v 1.53 2009/02/07 11:37:14 jaza Exp $ |
// $Id: category_menu.module,v 1.54 2009/05/31 10:24:23 jaza Exp $ |
| 3 |
|
|
| 4 |
/** |
/** |
| 5 |
* @file |
* @file |
| 71 |
|
|
| 72 |
case 'prepare': |
case 'prepare': |
| 73 |
$behavior = variable_get('category_behavior_'. $node->type, 0); |
$behavior = variable_get('category_behavior_'. $node->type, 0); |
| 74 |
if (!empty($behavior)) { |
if (!empty($behavior) && $behavior == 'container') { |
|
$links_for_nodes = $_POST['category']['menu']['links_for_nodes']; |
|
|
$container_has_parent_link = $_POST['category']['menu']['container_has_parent_link']; |
|
|
|
|
| 75 |
// Prepare defaults for the add/edit form. |
// Prepare defaults for the add/edit form. |
| 76 |
if (empty($node->category_menu)) { |
if (empty($node->category_menu)) { |
| 77 |
$node->category_menu = array(); |
$node->category_menu = array(); |
| 78 |
} |
} |
|
|
|
|
if (!empty($links_for_nodes) && is_array($links_for_nodes)) { |
|
|
$links_for_nodes = array_intersect_key(node_get_types('names'), $links_for_nodes); |
|
|
foreach (array_keys($links_for_nodes) as $node_type) { |
|
|
$links_for_nodes[$node_type] = $node_type; |
|
|
} |
|
|
$node->category_menu['links_for_nodes'] = $links_for_nodes; |
|
|
} |
|
|
if (isset($_POST['category']['menu']['container_has_parent_link'])) { |
|
|
$node->category_menu['container_has_parent_link'] = $container_has_parent_link; |
|
|
} |
|
|
|
|
|
if (!isset($node->category_menu['container_has_parent_link'])) { |
|
|
$node->category_menu['container_has_parent_link'] = !empty($node->category_menu['plid_for_container']); |
|
|
} |
|
|
if (!empty($node->category_menu['plid_for_container'])) { |
|
|
$item = db_fetch_array(db_query("SELECT m.*, ml.* FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE ml.mlid = %d", $node->category_menu['plid_for_container'])); |
|
|
$node->category_menu['plid_value_for_container'] = $node->category_menu['plid_for_container']; |
|
|
$node->category_menu['plid_for_container'] = $item['menu_name'] .':'. $node->category_menu['plid_for_container']; |
|
|
} |
|
| 79 |
} |
} |
| 80 |
|
// No break: Remove menu-on-the-fly information retrieved by core menu module (just in case) |
| 81 |
|
|
| 82 |
|
case 'presave': |
| 83 |
|
// Remove any menu-on-the-fly information prior to saving a node, |
| 84 |
|
// so that core menu module doesn't save any menu items. |
| 85 |
|
unset($node->menu); |
| 86 |
break; |
break; |
| 87 |
|
|
| 88 |
case 'insert': |
case 'insert': |
| 89 |
case 'update': |
case 'update': |
| 90 |
$behavior = variable_get('category_behavior_'. $node->type, 0); |
$behavior = variable_get('category_behavior_'. $node->type, 0); |
|
_category_menu_flatten_values($node); |
|
|
|
|
| 91 |
if (!empty($behavior) && $behavior == 'container') { |
if (!empty($behavior) && $behavior == 'container') { |
| 92 |
|
// On updates of already populated containers, show a reminder to refresh |
| 93 |
|
// site's data through category_resave, if critical menu settings changed. |
| 94 |
|
if ($op == 'update' && db_fetch_array(db_query("SELECT * FROM {category} WHERE cnid = %d", $node->nid))) { |
| 95 |
|
$old_settings = (array) category_menu_get_container($node->nid); |
| 96 |
|
if (!empty($node->category_menu['links_for_nodes'])) { |
| 97 |
|
$node->category_menu['links_for_nodes'] = array_filter($node->category_menu['links_for_nodes']); |
| 98 |
|
} |
| 99 |
|
foreach (array('links_for_cats', 'expanded_for_cats', 'menu_name', 'links_for_nodes') as $key) { |
| 100 |
|
if (isset($old_settings[$key]) && $old_settings[$key] != $node->category_menu[$key]) { |
| 101 |
|
drupal_set_message(t('Your changes affected behavior of generated menu links. To apply these changes properly, you need to refresh categories and/or nodes in this container now. The <em>category resave</em> module offers an easy way to perform this operation on existing content.')); |
| 102 |
|
break; |
| 103 |
|
} |
| 104 |
|
} |
| 105 |
|
} |
| 106 |
category_menu_save_container($node); |
category_menu_save_container($node); |
| 107 |
} |
} |
| 108 |
|
|
| 111 |
|
|
| 112 |
case 'delete': |
case 'delete': |
| 113 |
$behavior = variable_get('category_behavior_'. $node->type, 0); |
$behavior = variable_get('category_behavior_'. $node->type, 0); |
|
|
|
| 114 |
if (!empty($behavior) && $behavior == 'container') { |
if (!empty($behavior) && $behavior == 'container') { |
| 115 |
category_menu_del_container($node->nid); |
category_menu_del_container($node->nid); |
| 116 |
} |
} |
| 121 |
} |
} |
| 122 |
|
|
| 123 |
/** |
/** |
| 124 |
|
* Implementation of hook_menu_link_alter(). |
| 125 |
|
* |
| 126 |
|
* Deals with external changes to maintained menu links before they are saved, |
| 127 |
|
* either by merging the changes back into category system, or disallowing |
| 128 |
|
* the changes to be saved. |
| 129 |
|
*/ |
| 130 |
|
function category_menu_menu_link_alter(&$item, $menu) { |
| 131 |
|
if ($item['module'] == 'category_menu' && empty($item['options']['category_menu_unlock']) && !empty($item['mlid']) && $old_item = db_fetch_array(db_query("SELECT * FROM {menu_links} WHERE mlid = %d", $item['mlid']))) { |
| 132 |
|
// Disallow changes to these values, because we cannot keep them: Next |
| 133 |
|
// edit of the node is going to overwrite them. |
| 134 |
|
foreach (array('expanded', 'plid', 'link_title', 'hidden') as $key) { |
| 135 |
|
if ($item[$key] != $old_item[$key]) { |
| 136 |
|
$item[$key] = $old_item[$key]; |
| 137 |
|
} |
| 138 |
|
} |
| 139 |
|
// Merge new menu item weight back to category, so that reordering of menus work. |
| 140 |
|
// This is split into two queries, to avoid PgSQL compatibility issues on JOINs. |
| 141 |
|
if ($item['weight'] != $old_item['weight']) { |
| 142 |
|
$node = db_fetch_array(db_query("SELECT * FROM {category_menu_map} WHERE mlid = %d", $item['mlid'])); |
| 143 |
|
if (!empty($node['nid'])) { |
| 144 |
|
db_query("UPDATE {category} SET weight = %d WHERE cid = %d", $item['weight'], $node['nid']); |
| 145 |
|
category_cache_op('flush', 'all'); |
| 146 |
|
} |
| 147 |
|
} |
| 148 |
|
} |
| 149 |
|
unset($item['options']['category_menu_unlock']); |
| 150 |
|
} |
| 151 |
|
|
| 152 |
|
/** |
| 153 |
* Implementation of hook_form_alter(). |
* Implementation of hook_form_alter(). |
| 154 |
* |
* |
| 155 |
* Adds the category menu settings to the container node form. |
* Adds the category menu settings to the container node form, |
| 156 |
|
* and alters menu overview screen for compatibility. |
| 157 |
*/ |
*/ |
| 158 |
function category_menu_form_alter(&$form, $form_state, $form_id) { |
function category_menu_form_alter(&$form, $form_state, $form_id) { |
| 159 |
if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] |
if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] |
| 160 |
.'_node_form' == $form_id) { |
.'_node_form' == $form_id) { |
| 161 |
|
// Remove the menu-on-the-fly fieldset added by core menu module. |
| 162 |
|
unset($form['menu']); |
| 163 |
|
|
| 164 |
// Add elements to the node form |
// Add elements to the node form |
| 165 |
$node = $form['#node']; |
$node = $form['#node']; |
| 166 |
|
|
| 172 |
'#value' => $node->category_menu_map['mlid'], |
'#value' => $node->category_menu_map['mlid'], |
| 173 |
); |
); |
| 174 |
} |
} |
| 175 |
|
$form['#submit'][] = 'category_menu_node_form_submit'; |
| 176 |
|
|
| 177 |
$behavior = variable_get('category_behavior_'. $node->type, 0); |
$behavior = variable_get('category_behavior_'. $node->type, 0); |
| 178 |
|
|
| 179 |
if (!empty($behavior) && $behavior == 'container') { |
if (!empty($behavior) && $behavior == 'container') { |
| 180 |
|
// Prepare existing settings |
| 181 |
|
if (!isset($node->category_menu['container_has_parent_link'])) { |
| 182 |
|
$node->category_menu['container_has_parent_link'] = !empty($node->category_menu['plid_for_container']); |
| 183 |
|
} |
| 184 |
|
if (!empty($node->category_menu['plid_for_container'])) { |
| 185 |
|
$item = db_fetch_array(db_query("SELECT m.*, ml.* FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE ml.mlid = %d", $node->category_menu['plid_for_container'])); |
| 186 |
|
$node->category_menu['plid_value_for_container'] = $node->category_menu['plid_for_container']; |
| 187 |
|
$node->category_menu['plid_for_container'] = $item['menu_name'] .':'. $node->category_menu['plid_for_container']; |
| 188 |
|
} |
| 189 |
|
|
| 190 |
$form['category']['menu'] = array( |
$form['category']['menu'] = array( |
| 191 |
'#type' => 'fieldset', |
'#type' => 'fieldset', |
| 192 |
'#title' => t('Menu links'), |
'#title' => t('Menu links'), |
| 235 |
|
|
| 236 |
$default_options = array(); |
$default_options = array(); |
| 237 |
$taken_options = array(); |
$taken_options = array(); |
| 238 |
if (!empty($node->category_menu['links_for_nodes'])) { |
$is_preset = !empty($node->category_menu['links_for_nodes']); |
| 239 |
$default_options = $node->category_menu['links_for_nodes']; |
foreach (array_keys($nodes_options) as $type) { |
| 240 |
} |
$type_setting = variable_get('category_menu_links_'. $type, 0); |
| 241 |
else { |
$was_selected = ($is_preset && !empty($node->category_menu['links_for_nodes'][$type])); |
| 242 |
foreach (array_keys($nodes_options) as $type) { |
if (!empty($type_setting)) { |
| 243 |
$type_setting = variable_get('category_menu_links_'. $type, 0); |
if ($type_setting == $node->nid) { |
| 244 |
if (!empty($type_setting)) { |
if (!$is_preset || $was_selected) { |
|
if ($type_setting == $node->nid) { |
|
| 245 |
$default_options[$type] = $type; |
$default_options[$type] = $type; |
| 246 |
} |
} |
|
else { |
|
|
$taken_options[$type] = $type; |
|
|
} |
|
| 247 |
} |
} |
| 248 |
|
else { |
| 249 |
|
$taken_options[$type] = $type; |
| 250 |
|
} |
| 251 |
|
} |
| 252 |
|
else if ($was_selected) { |
| 253 |
|
$default_options[$type] = $type; |
| 254 |
} |
} |
| 255 |
} |
} |
| 256 |
$category_link['links_for_nodes'] = $nodes_options; |
$category_link['links_for_nodes'] = $nodes_options; |
| 341 |
} |
} |
| 342 |
} |
} |
| 343 |
} |
} |
| 344 |
|
|
| 345 |
|
// Grey-out incompatible settings for maintained menu items on the menu overview |
| 346 |
|
// screen, and swap edit link to point to corresponding node edit. |
| 347 |
|
if ($form_id == 'menu_overview_form') { |
| 348 |
|
$title = t('To change this item, you need to edit the corresponding node.'); |
| 349 |
|
foreach ($form as $key => $row) { |
| 350 |
|
if (!empty($row['#item']['module']) && $row['#item']['module'] == 'category_menu') { |
| 351 |
|
$form[$key]['hidden']['#disabled'] = TRUE; |
| 352 |
|
$form[$key]['expanded']['#disabled'] = TRUE; |
| 353 |
|
$form[$key]['operations']['edit']['#value'] = l(t('edit node'), $row['#item']['link_path'] .'/edit', array('query' => drupal_get_destination(), 'attributes' => array('title' => $title))); |
| 354 |
|
} |
| 355 |
|
} |
| 356 |
|
} |
| 357 |
|
} |
| 358 |
|
|
| 359 |
|
/** |
| 360 |
|
* Additional form submit handler for node forms. |
| 361 |
|
* |
| 362 |
|
* Flattens and processes the $form_state['values']['category']['menu'] |
| 363 |
|
* and ...['menu_map'] arrays on both submits and previews. |
| 364 |
|
*/ |
| 365 |
|
function category_menu_node_form_submit($form, &$form_state) { |
| 366 |
|
$fieldsets = array( |
| 367 |
|
'menu' => TRUE, |
| 368 |
|
'menu_map' => TRUE, |
| 369 |
|
); |
| 370 |
|
if (!empty($form_state['values']['category']) && is_array($form_state['values']['category'])) { |
| 371 |
|
foreach ($form_state['values']['category'] as $key => $value) { |
| 372 |
|
if (isset($fieldsets[$key]) && is_array($value)) { |
| 373 |
|
if (isset($value['plid_for_container']) && preg_match('/^[A-Za-z0-9\-_]+:[0-9]+$/', $value['plid_for_container'])) { |
| 374 |
|
$value_parts = explode(':', $value['plid_for_container']); |
| 375 |
|
$value['plid_for_container'] = $value_parts[1]; |
| 376 |
|
} |
| 377 |
|
|
| 378 |
|
$fieldset = 'category_'. $key; |
| 379 |
|
if (empty($form_state['values'][$fieldset])) { |
| 380 |
|
$form_state['values'][$fieldset] = array(); |
| 381 |
|
} |
| 382 |
|
$form_state['values'][$fieldset] = $value + $form_state['values'][$fieldset]; |
| 383 |
|
|
| 384 |
|
unset($form_state['values']['category'][$key]); |
| 385 |
|
} |
| 386 |
|
} |
| 387 |
|
} |
| 388 |
} |
} |
| 389 |
|
|
| 390 |
/** |
/** |
| 582 |
* The menu settings for the specified node. |
* The menu settings for the specified node. |
| 583 |
*/ |
*/ |
| 584 |
function category_menu_get_container($nid) { |
function category_menu_get_container($nid) { |
| 585 |
$result = db_query("SELECT * FROM {category_menu} WHERE cid = %d", $nid); |
$cache_key = 'cmenu_get_cont'; |
| 586 |
|
$container = category_cache_op('get', $nid, $cache_key); |
| 587 |
if ($container = db_fetch_object($result)) { |
if (!isset($container)) { |
| 588 |
$links_for_nodes = array(); |
|
| 589 |
foreach (array_keys(node_get_types('names')) as $type) { |
$result = db_query("SELECT * FROM {category_menu} WHERE cid = %d", $nid); |
| 590 |
$links_setting = variable_get('category_menu_links_'. $type, 0); |
|
| 591 |
if (!empty($links_setting) && $links_setting == $nid) { |
if ($container = db_fetch_object($result)) { |
| 592 |
$links_for_nodes[$type] = $type; |
$links_for_nodes = array(); |
| 593 |
|
foreach (array_keys(node_get_types('names')) as $type) { |
| 594 |
|
$links_setting = variable_get('category_menu_links_'. $type, 0); |
| 595 |
|
if (!empty($links_setting) && $links_setting == $nid) { |
| 596 |
|
$links_for_nodes[$type] = $type; |
| 597 |
|
} |
| 598 |
} |
} |
| 599 |
|
$container->links_for_nodes = $links_for_nodes; |
| 600 |
|
} |
| 601 |
|
else { |
| 602 |
|
$container = (object) array(); |
| 603 |
} |
} |
|
$container->links_for_nodes = $links_for_nodes; |
|
| 604 |
|
|
| 605 |
return $container; |
category_cache_op('set', $nid, $cache_key, $container); |
| 606 |
} |
} |
| 607 |
|
return $container; |
| 608 |
} |
} |
| 609 |
|
|
| 610 |
/** |
/** |
| 639 |
} |
} |
| 640 |
} |
} |
| 641 |
|
|
| 642 |
|
category_cache_op('flush', 'all'); |
| 643 |
return $status; |
return $status; |
| 644 |
} |
} |
| 645 |
|
|
| 659 |
variable_del('category_menu_links_'. $type); |
variable_del('category_menu_links_'. $type); |
| 660 |
} |
} |
| 661 |
} |
} |
| 662 |
|
category_cache_op('flush', 'all'); |
| 663 |
} |
} |
| 664 |
|
|
| 665 |
/** |
/** |
| 680 |
* during hook_nodeapi('load'). |
* during hook_nodeapi('load'). |
| 681 |
*/ |
*/ |
| 682 |
function category_menu_map_load_by_nid($nid) { |
function category_menu_map_load_by_nid($nid) { |
| 683 |
if ($item = db_fetch_array(db_query('SELECT ml.*, cmm.nid, m.* FROM {menu_links} ml INNER JOIN {category_menu_map} cmm ON cmm.mlid = ml.mlid LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE cmm.nid = %d', $nid))) { |
$cache_key = 'cmenu_map_load_nid'; |
| 684 |
|
$item = category_cache_op('get', $nid, $cache_key); |
| 685 |
|
if (!isset($item)) { |
| 686 |
|
|
| 687 |
$item['options'] = unserialize($item['options']); |
if ($item = db_fetch_array(db_query('SELECT m.*, cmm.nid, ml.* FROM {menu_links} ml INNER JOIN {category_menu_map} cmm ON cmm.mlid = ml.mlid LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE cmm.nid = %d', $nid))) { |
| 688 |
return $item; |
$item['options'] = unserialize($item['options']); |
| 689 |
|
} |
| 690 |
|
else { |
| 691 |
|
$item = FALSE; |
| 692 |
|
} |
| 693 |
|
|
| 694 |
|
category_cache_op('set', $nid, $cache_key, $item); |
| 695 |
} |
} |
| 696 |
return FALSE; |
return $item; |
| 697 |
} |
} |
| 698 |
|
|
| 699 |
/** |
/** |
| 753 |
} |
} |
| 754 |
|
|
| 755 |
$node->category_menu_map['expanded'] = $container_settings['expanded_for_cats']; |
$node->category_menu_map['expanded'] = $container_settings['expanded_for_cats']; |
| 756 |
|
$node->category_menu_map['weight'] = $node->category['weight']; |
| 757 |
} |
} |
| 758 |
// Logic for assigned node types. |
// Logic for assigned node types. |
| 759 |
else { |
else { |
| 796 |
} |
} |
| 797 |
|
|
| 798 |
$new_plid = $assigned_cat_menu_link['mlid']; |
$new_plid = $assigned_cat_menu_link['mlid']; |
| 799 |
|
// Weight for nodes will be re-saved as is (if available), to keep possible |
| 800 |
|
// menu order customizations. |
| 801 |
} |
} |
| 802 |
|
|
| 803 |
$node->category_menu_map['menu_name'] = category_menu_menu_name($container_settings['menu_name'], $container_settings['cid']); |
$node->category_menu_map['menu_name'] = category_menu_menu_name($container_settings['menu_name'], $container_settings['cid']); |
| 806 |
$node->category_menu_map['parent_mismatch'] = FALSE; |
$node->category_menu_map['parent_mismatch'] = FALSE; |
| 807 |
$node->category_menu_map['module'] = 'category_menu'; |
$node->category_menu_map['module'] = 'category_menu'; |
| 808 |
$node->category_menu_map['plid'] = $new_plid; |
$node->category_menu_map['plid'] = $new_plid; |
| 809 |
|
$node->category_menu_map['hidden'] = (int) !$node->status; |
| 810 |
$menu_name = $node->category_menu_map['menu_name']; |
$menu_name = $node->category_menu_map['menu_name']; |
| 811 |
|
|
| 812 |
|
$node->category_menu_map['options']['category_menu_unlock'] = TRUE; |
| 813 |
if (menu_link_save($node->category_menu_map)) { |
if (menu_link_save($node->category_menu_map)) { |
| 814 |
if ($new) { |
if ($new) { |
| 815 |
// Insert new. |
// Insert new. |
| 847 |
* by the category hierarchy), or 0 if no suitable menu link was found. |
* by the category hierarchy), or 0 if no suitable menu link was found. |
| 848 |
*/ |
*/ |
| 849 |
function _category_menu_map_save_category($nid) { |
function _category_menu_map_save_category($nid) { |
| 850 |
$parents = category_get_parents($nid, 'cid', TRUE, TRUE); |
category_cache_op('flush', 'all'); |
| 851 |
|
$parents = category_get_parents($nid, 'cid', TRUE); |
| 852 |
$parent = reset($parents); |
$parent = reset($parents); |
| 853 |
|
|
| 854 |
if (empty($parent->cid)) { |
if (empty($parent->cid)) { |
| 940 |
* children of bottom-level menu items. |
* children of bottom-level menu items. |
| 941 |
*/ |
*/ |
| 942 |
function category_menu_tree_all_data($menu_name, &$item, $max_depth = NULL, $cache_prefix = 'category-menu-') { |
function category_menu_tree_all_data($menu_name, &$item, $max_depth = NULL, $cache_prefix = 'category-menu-') { |
| 943 |
// Start with a regular tree, based on the specified item, containing |
// Cache key employs current user's roles, to cover access check performed |
| 944 |
// items local to the $menu_name menu. |
// inside _category_menu_tree_all_data(). (TODO: Check whether that check is |
| 945 |
$tree = _category_menu_tree_all_data($menu_name, $item, $cache_prefix, $max_depth); |
// necessary, considering these are our own generated menu items.) |
| 946 |
|
global $user; |
| 947 |
// Next, find top-level items with defined parents, and extend the tree |
$cache_key = 'cmenu_tree_all_data'. $menu_name .':'. $item[$mlid] .':'. $max_depth .':'. implode(':', $user->roles); |
| 948 |
// to include such parents and their ancestors. |
$tree = category_cache_op('get', 0, $cache_key); |
| 949 |
$parent_link = reset($tree); |
if (!isset($tree)) { |
| 950 |
$parent_link_key = key($tree); |
|
| 951 |
while ($parent_link['link']['plid']) { |
// Start with a regular tree, based on the specified item, containing |
| 952 |
$item['has_children'] = 1; |
// items local to the $menu_name menu. |
| 953 |
$ancestor_link = menu_link_load($parent_link['link']['plid']); |
$tree = _category_menu_tree_all_data($menu_name, $item, $cache_prefix, $max_depth); |
| 954 |
if ($ancestor_link['menu_name'] != $menu_name) { |
|
| 955 |
$tree = _category_menu_tree_all_data($ancestor_link['menu_name'], $ancestor_link, $cache_prefix); |
// Next, find top-level items with defined parents, and extend the tree |
| 956 |
_category_menu_tree_above($tree, array( |
// to include such parents and their ancestors. |
| 957 |
'key' => $parent_link_key, |
$parent_link = reset($tree); |
| 958 |
'value' => $parent_link, |
$parent_link_key = key($tree); |
| 959 |
)); |
while ($parent_link['link']['plid']) { |
| 960 |
|
$item['has_children'] = 1; |
| 961 |
|
$ancestor_link = menu_link_load($parent_link['link']['plid']); |
| 962 |
|
if ($ancestor_link['menu_name'] != $menu_name) { |
| 963 |
|
$tree = _category_menu_tree_all_data($ancestor_link['menu_name'], $ancestor_link, $cache_prefix); |
| 964 |
|
_category_menu_tree_above($tree, array( |
| 965 |
|
'key' => $parent_link_key, |
| 966 |
|
'value' => $parent_link, |
| 967 |
|
)); |
| 968 |
|
|
| 969 |
$parent_link = reset($tree); |
$parent_link = reset($tree); |
| 970 |
$parent_link_key = key($tree); |
$parent_link_key = key($tree); |
| 971 |
} |
} |
| 972 |
else { |
else { |
| 973 |
$parent_link['link']['plid'] = 0; |
$parent_link['link']['plid'] = 0; |
| 974 |
} |
} |
| 975 |
}; |
}; |
| 976 |
|
|
| 977 |
$query_nodetypes1 = ''; |
$query_nodetypes1 = ''; |
| 978 |
$query_nodetypes2 = ''; |
$query_nodetypes2 = ''; |
| 979 |
$args = array($item['mlid'], $menu_name); |
$args = array($item['mlid'], $menu_name); |
| 980 |
if ($category = db_fetch_object(db_query('SELECT c.* FROM {category} c INNER JOIN {category_menu_map} cmm ON c.cid = cmm.nid WHERE cmm.mlid = %d', $item['mlid']))) { |
if ($category = db_fetch_object(db_query('SELECT c.* FROM {category} c INNER JOIN {category_menu_map} cmm ON c.cid = cmm.nid WHERE cmm.mlid = %d', $item['mlid']))) { |
| 981 |
$cnid = !empty($category->cnid) ? $category->cnid : $category->cid; |
$cnid = !empty($category->cnid) ? $category->cnid : $category->cid; |
| 982 |
$node_types = array(); |
$node_types = array(); |
| 983 |
$query_nodetypes = db_query('SELECT type FROM {category_cont_node_types} WHERE cid = %d', $cnid); |
$query_nodetypes = db_query('SELECT type FROM {category_cont_node_types} WHERE cid = %d', $cnid); |
| 984 |
|
|
| 985 |
while ($node_type = db_fetch_object($query_nodetypes)) { |
while ($node_type = db_fetch_object($query_nodetypes)) { |
| 986 |
$node_types[] = 'category-menu-toc-'. $node_type->type; |
$node_types[] = 'category-menu-toc-'. $node_type->type; |
| 987 |
} |
} |
| 988 |
|
|
| 989 |
if (!empty($node_types)) { |
if (!empty($node_types)) { |
| 990 |
$query_nodetypes1 = ' LEFT JOIN {category_menu_map} cmm ON ml.mlid = cmm.mlid LEFT JOIN {node} n ON cmm.nid = n.nid'; |
$query_nodetypes1 = ' LEFT JOIN {category_menu_map} cmm ON ml.mlid = cmm.mlid LEFT JOIN {node} n ON cmm.nid = n.nid'; |
| 991 |
|
|
| 992 |
$placeholders = db_placeholders($node_types, 'varchar'); |
$placeholders = db_placeholders($node_types, 'varchar'); |
| 993 |
$query_nodetypes2 = ' AND ml.menu_name NOT IN('. $placeholders .')'; |
$query_nodetypes2 = ' AND ml.menu_name NOT IN('. $placeholders .')'; |
| 994 |
$args = array_merge($args, $node_types); |
$args = array_merge($args, $node_types); |
| 995 |
|
} |
| 996 |
} |
} |
|
} |
|
| 997 |
|
|
| 998 |
$query = "SELECT m.*, ml.* FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path". $query_nodetypes1 ." WHERE ml.plid = %d AND ml.menu_name != '%s'". $query_nodetypes2; |
$query = "SELECT m.*, ml.* FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path". $query_nodetypes1 ." WHERE ml.plid = %d AND ml.menu_name != '%s'". $query_nodetypes2; |
| 999 |
|
|
| 1000 |
if (isset($max_depth)) { |
if (isset($max_depth)) { |
| 1001 |
$query .= ' AND ml.depth < %d'; |
$query .= ' AND ml.depth < %d'; |
| 1002 |
$args[] = $max_depth - 1; |
$args[] = $max_depth - 1; |
| 1003 |
} |
} |
| 1004 |
// Finally, find distant children with the specified item as their parent, |
// Finally, find distant children with the specified item as their parent, |
| 1005 |
// and extend the tree to include such children and their descendants. |
// and extend the tree to include such children and their descendants. |
| 1006 |
$children = db_query($query, $args); |
$children = db_query($query, $args); |
| 1007 |
$child_tree_prev = array(); |
$child_tree_prev = array(); |
| 1008 |
|
|
| 1009 |
while ($child_link = db_fetch_array($children)) { |
while ($child_link = db_fetch_array($children)) { |
| 1010 |
$item['has_children'] = 1; |
$item['has_children'] = 1; |
| 1011 |
_menu_link_translate($child_link); |
_menu_link_translate($child_link); |
| 1012 |
$child_tree = _category_menu_tree_all_data($child_link['menu_name'], $child_link, $cache_prefix); |
$child_tree = _category_menu_tree_all_data($child_link['menu_name'], $child_link, $cache_prefix); |
| 1013 |
if (!empty($child_tree) && $child_tree != $child_tree_prev) { |
if (!empty($child_tree) && $child_tree != $child_tree_prev) { |
| 1014 |
_category_menu_tree_below($tree, $child_tree, $item); |
_category_menu_tree_below($tree, $child_tree, $item); |
| 1015 |
$child_tree_prev = $child_tree; |
$child_tree_prev = $child_tree; |
| 1016 |
|
} |
| 1017 |
} |
} |
| 1018 |
|
|
| 1019 |
|
category_cache_op('set', 0, $cache_key, $tree); |
| 1020 |
} |
} |
| 1021 |
|
|
| 1022 |
return $tree; |
return $tree; |
| 1154 |
} |
} |
| 1155 |
} |
} |
| 1156 |
} |
} |
|
|
|
|
/** |
|
|
* Helper function to flatten the $node->category['menu'] array. |
|
|
*/ |
|
|
function _category_menu_flatten_values(&$node) { |
|
|
$fieldsets = array( |
|
|
'menu' => TRUE, |
|
|
'menu_map' => TRUE, |
|
|
); |
|
|
if (!empty($node->category) && is_array($node->category)) { |
|
|
foreach ($node->category as $key => $value) { |
|
|
if (isset($fieldsets[$key]) && is_array($value)) { |
|
|
if (isset($value['plid_for_container']) && preg_match('/^[A-Za-z0-9\-_]+:[0-9]+$/', $value['plid_for_container'])) { |
|
|
$value_parts = explode(':', $value['plid_for_container']); |
|
|
$value['plid_for_container'] = $value_parts[1]; |
|
|
} |
|
|
|
|
|
$fieldset = 'category_'. $key; |
|
|
if (empty($node->$fieldset)) { |
|
|
$node->$fieldset = array(); |
|
|
} |
|
|
$node->$fieldset += $value; |
|
|
|
|
|
unset($node->category[$key]); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|