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

copy() public static method

Copy pages
public static copy ( string $from, string $to )
$from string The language code to copy the pages from.
$to string The language code we want to copy the pages to.
    public static function copy($from, $to)
    {
        // get db
        $db = BackendModel::getContainer()->get('database');
        // copy contentBlocks and get copied contentBlockIds
        $copyContentBlocks = new CopyContentBlocksToOtherLocale(Locale::fromString($to), Locale::fromString($from));
        BackendModel::get('command_bus')->handle($copyContentBlocks);
        $contentBlockIds = $copyContentBlocks->extraIdMap;
        // define old block ids
        $contentBlockOldIds = array_keys($contentBlockIds);
        // get all old pages
        $ids = $db->getColumn('SELECT id
             FROM pages AS i
             WHERE i.language = ? AND i.status = ?', array($to, 'active'));
        // any old pages
        if (!empty($ids)) {
            // delete existing pages
            foreach ($ids as $id) {
                // redefine
                $id = (int) $id;
                // get revision ids
                $revisionIDs = (array) $db->getColumn('SELECT i.revision_id
                     FROM pages AS i
                     WHERE i.id = ? AND i.language = ?', array($id, $to));
                // get meta ids
                $metaIDs = (array) $db->getColumn('SELECT i.meta_id
                     FROM pages AS i
                     WHERE i.id = ? AND i.language = ?', array($id, $to));
                // delete meta records
                if (!empty($metaIDs)) {
                    $db->delete('meta', 'id IN (' . implode(',', $metaIDs) . ')');
                }
                // delete blocks and their revisions
                if (!empty($revisionIDs)) {
                    $db->delete('pages_blocks', 'revision_id IN (' . implode(',', $revisionIDs) . ')');
                }
                // delete page and the revisions
                if (!empty($revisionIDs)) {
                    $db->delete('pages', 'revision_id IN (' . implode(',', $revisionIDs) . ')');
                }
            }
        }
        // delete search indexes
        $db->delete('search_index', 'module = ? AND language = ?', array('pages', $to));
        // get all active pages
        $ids = BackendModel::getContainer()->get('database')->getColumn('SELECT id
             FROM pages AS i
             WHERE i.language = ? AND i.status = ?', array($from, 'active'));
        // loop
        foreach ($ids as $id) {
            // get data
            $sourceData = self::get($id, null, $from);
            // get and build meta
            $meta = $db->getRecord('SELECT *
                 FROM meta
                 WHERE id = ?', array($sourceData['meta_id']));
            // remove id
            unset($meta['id']);
            // init page
            $page = array();
            // build page
            $page['id'] = $sourceData['id'];
            $page['user_id'] = BackendAuthentication::getUser()->getUserId();
            $page['parent_id'] = $sourceData['parent_id'];
            $page['template_id'] = $sourceData['template_id'];
            $page['meta_id'] = (int) $db->insert('meta', $meta);
            $page['language'] = $to;
            $page['type'] = $sourceData['type'];
            $page['title'] = $sourceData['title'];
            $page['navigation_title'] = $sourceData['navigation_title'];
            $page['navigation_title_overwrite'] = $sourceData['navigation_title_overwrite'];
            $page['hidden'] = $sourceData['hidden'];
            $page['status'] = 'active';
            $page['publish_on'] = BackendModel::getUTCDate();
            $page['created_on'] = BackendModel::getUTCDate();
            $page['edited_on'] = BackendModel::getUTCDate();
            $page['allow_move'] = $sourceData['allow_move'];
            $page['allow_children'] = $sourceData['allow_children'];
            $page['allow_edit'] = $sourceData['allow_edit'];
            $page['allow_delete'] = $sourceData['allow_delete'];
            $page['sequence'] = $sourceData['sequence'];
            $page['data'] = $sourceData['data'] !== null ? serialize($sourceData['data']) : null;
            // insert page, store the id, we need it when building the blocks
            $revisionId = self::insert($page);
            // init var
            $blocks = array();
            // get the blocks
            $sourceBlocks = self::getBlocks($id, null, $from);
            // loop blocks
            foreach ($sourceBlocks as $sourceBlock) {
                // build block
                $block = $sourceBlock;
                $block['revision_id'] = $revisionId;
                $block['created_on'] = BackendModel::getUTCDate();
                $block['edited_on'] = BackendModel::getUTCDate();
                if (in_array($block['extra_id'], $contentBlockOldIds)) {
                    $block['extra_id'] = $contentBlockIds[$block['extra_id']];
                }
                // add block
                $blocks[] = $block;
            }
            // insert the blocks
            self::insertBlocks($blocks);
            // init var
            $text = '';
            // build search-text
            foreach ($blocks as $block) {
                $text .= ' ' . $block['html'];
            }
            // add
            BackendSearchModel::saveIndex('Pages', (int) $page['id'], array('title' => $page['title'], 'text' => $text), $to);
            // get tags
            $tags = BackendTagsModel::getTags('pages', $id, 'string', $from);
            // save tags
            if ($tags != '') {
                $saveWorkingLanguage = BL::getWorkingLanguage();
                // If we don't set the working language to the target language,
                // BackendTagsModel::getURL() will use the current working
                // language, possibly causing unnecessary '-2' suffixes in
                // tags.url
                BL::setWorkingLanguage($to);
                BackendTagsModel::saveTags($page['id'], $tags, 'pages', $to);
                BL::setWorkingLanguage($saveWorkingLanguage);
            }
        }
        // build cache
        self::buildCache($to);
    }

Usage Example

Example #1
0
 /**
  * Execute the action
  */
 public function execute()
 {
     // call parent, this will probably add some general CSS/JS or other required files
     parent::execute();
     // get parameters
     $this->from = $this->getParameter('from');
     $this->to = $this->getParameter('to');
     // validate
     if ($this->from == '') {
         throw new BackendException('Specify a from-parameter.');
     }
     if ($this->to == '') {
         throw new BackendException('Specify a to-parameter.');
     }
     // copy pages
     BackendPagesModel::copy($this->from, $this->to);
     // redirect
     $this->redirect(BackendModel::createURLForAction('Index') . '&report=copy-added&var=' . urlencode($this->to));
 }
All Usage Examples Of Backend\Modules\Pages\Engine\Model::copy