/** * If node does not have a display order or a sibling node has the same display order value the display order is set to the next available number. * @param \Navinator\Node $node the node to set the display order of * @param int $displayOrder The display order of the node in relation to it's siblings */ protected function autoSetNodeDisplayOrder(\Navinator\Node $node, $displayOrder = null) { // keep the same by default $newNodeDisplayOrder = $displayOrder; $siblings = $node->getSiblings($this); if ($displayOrder == null) { if (empty($siblings)) { $newNodeDisplayOrder = 1; } else { $newNodeDisplayOrder = max($this->getNodeDisplayOrders($siblings)) + 1; } } else { $siblingDisplayOrders = $this->getNodeDisplayOrders($siblings); // if the desired display order is already taken if (in_array($displayOrder, $siblingDisplayOrders)) { //find first gap in sort order list after desired position $start = $displayOrder; sort($siblingDisplayOrders); if ($displayOrder == 1 && count($siblings) == 1) { $newNodeDisplayOrder = 2; } else { foreach ($siblingDisplayOrders as $v) { if ($v <= $displayOrder) { continue; } if ($start + 1 != $v) { $newNodeDisplayOrder = $start + 1; break; } $start = $v; } } } } $this->node_display_order[$node->getPath()] = $newNodeDisplayOrder; }