Backend\Modules\Pages\Engine\Model::move PHP Method

move() public static method

Move a page
public static move ( integer $id, integer $droppedOn, string $typeOfDrop, string $tree, string $language = null ) : boolean
$id integer The id for the page that has to be moved.
$droppedOn integer The id for the page where to page has been dropped on.
$typeOfDrop string The type of drop, possible values are: before, after, inside.
$tree string The tree the item is dropped on, possible values are: main, meta, footer, root.
$language string The language to use, if not provided we will use the working language.
return boolean
    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;
    }

Usage Example

Example #1
0
 /**
  * Execute the action
  */
 public function execute()
 {
     // call parent
     parent::execute();
     // get parameters
     $id = \SpoonFilter::getPostValue('id', null, 0, 'int');
     $droppedOn = \SpoonFilter::getPostValue('dropped_on', null, -1, 'int');
     $typeOfDrop = \SpoonFilter::getPostValue('type', null, '');
     $tree = \SpoonFilter::getPostValue('tree', array('main', 'meta', 'footer', 'root'), '');
     // init validation
     $errors = array();
     // validate
     if ($id === 0) {
         $errors[] = 'no id provided';
     }
     if ($droppedOn === -1) {
         $errors[] = 'no dropped_on provided';
     }
     if ($typeOfDrop == '') {
         $errors[] = 'no type provided';
     }
     if ($tree == '') {
         $errors[] = 'no tree provided';
     }
     // got errors
     if (!empty($errors)) {
         $this->output(self::BAD_REQUEST, array('errors' => $errors), 'not all fields were filled');
     } else {
         // get page
         $success = BackendPagesModel::move($id, $droppedOn, $typeOfDrop, $tree);
         // build cache
         BackendPagesModel::buildCache(BL::getWorkingLanguage());
         // output
         if ($success) {
             $this->output(self::OK, BackendPagesModel::get($id), 'page moved');
         } else {
             $this->output(self::ERROR, null, 'page not moved');
         }
     }
 }