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);
}