Xpressengine\Menu\MenuHandler::moveItem PHP 메소드

moveItem() 공개 메소드

Move menu item
public moveItem ( Menu $menu, MenuItem $item, MenuItem $parent = null ) : MenuItem
$menu Xpressengine\Menu\Models\Menu menu instance
$item Xpressengine\Menu\Models\MenuItem menu item instance
$parent Xpressengine\Menu\Models\MenuItem menu item instance
리턴 Xpressengine\Menu\Models\MenuItem
    public function moveItem(Menu $menu, MenuItem $item, MenuItem $parent = null)
    {
        if ($parent && $menu->getKey() != $parent->menu->getKey()) {
            throw new InvalidArgumentException(['name' => 'parent object']);
        }
        if ($item->{$item->getParentIdName()}) {
            $oldParent = $this->repo->findItem($item->{$item->getParentIdName()});
            $this->unlinkHierarchy($item, $oldParent);
            $item->{$item->getParentIdName()} = null;
        }
        if ($parent) {
            $this->linkHierarchy($item, $parent);
            $item->parentId = $parent->getKey();
        }
        // 캐시를 사용하는 경우 기존 메뉴를 대상으로 하는 캐시의 갱신이 필요하여
        // 변경전 업데이트를 수행함
        $this->repo->update($item->menu);
        $item->{$item->getAggregatorKeyName()} = $menu->getKey();
        $item->setRelation('menu', $menu);
        $item = $this->repo->updateItem($item);
        // 연관 객체 정보들이 변경 되었으므로 객채를 갱신 함
        return $this->repo->findItem($item->getKey());
    }

Usage Example

예제 #1
0
 /**
  * moveItem
  *
  * @param MenuHandler $handler menu handler
  *
  * @return RendererInterface
  * @throws Exception
  */
 public function moveItem(MenuHandler $handler)
 {
     $ordering = Input::get('ordering');
     $itemId = Input::get('itemId');
     $parentId = Input::get('parent');
     XeDB::beginTransaction();
     try {
         $item = $handler->getItem($itemId);
         /** @var Menu $menu */
         if (!($parent = $handler->getItem($parentId))) {
             $menu = $handler->get($parentId);
         } else {
             $menu = $parent->menu;
         }
         $old = clone $item;
         // 이동되기 전 상태의 객체를 구성하기 위해 relation 을 사전에 load
         $old->ancestors;
         $item = $handler->moveItem($menu, $item, $parent);
         $handler->setOrder($item, $ordering);
         $handler->moveItemConfig($old, $item);
         $toKey = $handler->permKeyString($item);
         $toKey = substr($toKey, 0, strrpos($toKey, '.'));
         $this->permissionMove($handler->permKeyString($old), $toKey);
     } catch (\Exception $e) {
         XeDB::rollback();
         throw $e;
     }
     XeDB::commit();
     return XePresenter::makeApi(Input::all());
 }