コード例 #1
0
 /**
  * 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;
 }