public function moveSubtree($locationPath, Request $request)
{
$locationToMove = $this->locationService->loadLocation($this->extractLocationIdFromPath($locationPath));
$destinationLocationId = null;
$destinationHref = $request->headers->get('Destination');
try {
// First check to see if the destination is for moving within another subtree
$destinationLocationId = $this->extractLocationIdFromPath($this->requestParser->parseHref($destinationHref, 'locationPath'));
// We're moving the subtree
$destinationLocation = $this->locationService->loadLocation($destinationLocationId);
$this->locationService->moveSubtree($locationToMove, $destinationLocation);
// Reload the location to get the new position is subtree
$locationToMove = $this->locationService->loadLocation($locationToMove->id);
return new Values\ResourceCreated($this->router->generate('ezpublish_rest_loadLocation', array('locationPath' => trim($locationToMove->pathString, '/'))));
} catch (Exceptions\InvalidArgumentException $e) {
// If parsing of destination fails, let's try to see if destination is trash
try {
$route = $this->requestParser->parse($destinationHref);
if (!isset($route['_route']) || $route['_route'] !== 'ezpublish_rest_loadTrashItems') {
throw new Exceptions\InvalidArgumentException('');
}
// Trash the subtree
$trashItem = $this->trashService->trash($locationToMove);
if (isset($trashItem)) {
return new Values\ResourceCreated($this->router->generate('ezpublish_rest_loadTrashItem', array('trashItemId' => $trashItem->id)));
} else {
// Only a location has been trashed and not the object
return new Values\NoContent();
}
} catch (Exceptions\InvalidArgumentException $e) {
// If that fails, the Destination header is not formatted right
// so just throw the BadRequestException
throw new BadRequestException("{$destinationHref} is not an acceptable destination");
}
}
}