function _draggableviews_rebuild_hierarchy in DraggableViews 7
Same name and namespace in other branches
- 6.3 draggableviews.inc \_draggableviews_rebuild_hierarchy()
 
Rebuild hierarchy
This function is called when the structure is broken.
Parameters
$info: The structured information array. Look at _draggableviews_info(..) to learn more.
1 call to _draggableviews_rebuild_hierarchy()
- draggableviews_views_pre_render in ./
draggableviews.module  - Implements hook_views_pre_render
 
File
- ./
draggableviews.inc, line 389  - Draggableviews processing functions. Rough summary of what functions in this file do:
 
Code
function _draggableviews_rebuild_hierarchy(&$info) {
  // We backup the page settings and restore them after completing all operations.
  $pager = $info['view']->query->pager;
  if ($info['needs_pager_modifications']) {
    // We have to make sure that there's no hidden node with an order value that refers to the current page.
    // If the items to display per page are limitated we load the entire view.
    //@todo: We reduce the fields to a minimum because of performance issues.
    _draggableviews_reload_info($info, DRAGGABLEVIEWS_DBQUERY_LIMIT, 0, $pager->options['offset']);
  }
  // Calculate depth values.
  // Nodes with broken parents will be brought down to the root level.
  // These depth values will be used for both theming and repairing broken structures.
  _draggableviews_calculate_depths($info);
  // Detect and repair ordering errors.
  // The child node order values on the parent's level have to equal
  // with the parent's order values. If they don't equal they will be set properly.
  // In order to avoid ambiguous values we add unique float
  // values ($safe_offset < 1) to all order values. This assures that
  // child nodes always appear right after their parents even if there
  // are other nodes with the same order value on the parents level.
  $safe_offset = 0;
  foreach ($info['nodes'] as $nid => $values) {
    $info['nodes'][$nid]['order'][$values['depth']] += $safe_offset;
    $safe_offset += DRAGGABLEVIEWS_SAFE_OFFSET;
  }
  _draggableviews_check_order($info);
  // The last issue we have to deal with is the order itself.
  // We just sort the nodes by their current order values and
  // then we subsequently assign ascending numbers.
  _draggableviews_sort_nodes($info['nodes']);
  _draggableviews_ascending_numbers($info, $pager->options['offset'], TRUE);
  // Save hierarchy.
  _draggableviews_save_hierarchy($info);
  // The structure should be valid now.
  // Nonetheless let's make a final check for debugging reasons.
  if (!_draggableviews_quick_check_structure($info)) {
    drupal_set_message(t("Draggableviews: Rebuilding structure didn't work. The structure is broken."), "error");
  }
}