public static function move($id, $droppedOn, $typeOfDrop, $tree, $language = null)
{
$id = (int) $id;
$droppedOn = (int) $droppedOn;
$typeOfDrop = \SpoonFilter::getValue($typeOfDrop, array('before', 'after', 'inside'), 'inside');
$tree = \SpoonFilter::getValue($tree, array('main', 'meta', 'footer', 'root'), 'inside');
$language = $language === null ? BL::getWorkingLanguage() : (string) $language;
// get db
$db = BackendModel::getContainer()->get('database');
// reset type of drop for special pages
if ($droppedOn == 1) {
$typeOfDrop = 'inside';
}
if ($droppedOn == 0) {
$typeOfDrop = 'inside';
}
// get data for pages
$page = self::get($id, null, $language);
$droppedOnPage = self::get($droppedOn, null, $language);
// reset if the drop was on 0 (new meta)
if ($droppedOn == 0) {
$droppedOnPage = self::get(1, null, $language);
}
// validate
if (empty($page) || empty($droppedOnPage)) {
return false;
}
// calculate new parent for items that should be moved inside
if ($droppedOn == 0) {
$newParent = 0;
} elseif ($typeOfDrop == 'inside') {
// check if item allows children
if ($droppedOnPage['allow_children'] != 'Y') {
return false;
}
// set new parent to the dropped on page.
$newParent = $droppedOnPage['id'];
} else {
// if the item has to be moved before or after
$newParent = $droppedOnPage['parent_id'];
}
// decide new type
if ($droppedOn == 0) {
if ($tree == 'footer') {
$newType = 'footer';
} else {
$newType = 'meta';
}
} elseif ($newParent == 0) {
$newType = $droppedOnPage['type'];
} else {
$newType = 'page';
}
// calculate new sequence for items that should be moved inside
if ($typeOfDrop == 'inside') {
// get highest sequence + 1
$newSequence = (int) $db->getVar('SELECT MAX(i.sequence)
FROM pages AS i
WHERE i.id = ? AND i.language = ? AND i.status = ?', array($newParent, $language, 'active')) + 1;
// update
$db->update('pages', array('parent_id' => $newParent, 'sequence' => $newSequence, 'type' => $newType), 'id = ? AND language = ? AND status = ?', array($id, $language, 'active'));
} elseif ($typeOfDrop == 'before') {
// calculate new sequence for items that should be moved before
// get new sequence
$newSequence = (int) $db->getVar('SELECT i.sequence
FROM pages AS i
WHERE i.id = ? AND i.language = ? AND i.status = ?
LIMIT 1', array($droppedOnPage['id'], $language, 'active')) - 1;
// increment all pages with a sequence that is higher or equal to the current sequence;
$db->execute('UPDATE pages
SET sequence = sequence + 1
WHERE parent_id = ? AND language = ? AND sequence >= ?', array($newParent, $language, $newSequence + 1));
// update
$db->update('pages', array('parent_id' => $newParent, 'sequence' => $newSequence, 'type' => $newType), 'id = ? AND language = ? AND status = ?', array($id, $language, 'active'));
} elseif ($typeOfDrop == 'after') {
// calculate new sequence for items that should be moved after
// get new sequence
$newSequence = (int) $db->getVar('SELECT i.sequence
FROM pages AS i
WHERE i.id = ? AND i.language = ? AND i.status = ?
LIMIT 1', array($droppedOnPage['id'], $language, 'active')) + 1;
// increment all pages with a sequence that is higher then the current sequence;
$db->execute('UPDATE pages
SET sequence = sequence + 1
WHERE parent_id = ? AND language = ? AND sequence > ?', array($newParent, $language, $newSequence));
// update
$db->update('pages', array('parent_id' => $newParent, 'sequence' => $newSequence, 'type' => $newType), 'id = ? AND language = ? AND status = ?', array($id, $language, 'active'));
} else {
return false;
}
// get current URL
$currentURL = (string) $db->getVar('SELECT url
FROM meta AS m
WHERE m.id = ?', array($page['meta_id']));
// rebuild url
$newURL = self::getURL($currentURL, $id, $newParent, isset($page['data']['is_action']) && $page['data']['is_action'] == 'Y');
// store
$db->update('meta', array('url' => $newURL), 'id = ?', array($page['meta_id']));
// return
return true;
}