restrictAccess(Auth::isManager()) ->setPageTitle(WT_I18N::translate('Merge records')) ->addExternalJavascript(WT_STATIC_URL . 'js/autocomplete.js') ->addInlineJavascript('autocomplete();') ->pageHeader(); $ged = $GEDCOM; $gid1 = WT_Filter::post('gid1', WT_REGEX_XREF); $gid2 = WT_Filter::post('gid2', WT_REGEX_XREF); $action = WT_Filter::post('action', 'choose|select|merge', 'choose'); $ged1 = WT_Filter::post('ged1', null, $ged); $ged2 = WT_Filter::post('ged2', null, $ged); $keep1 = WT_Filter::postArray('keep1'); $keep2 = WT_Filter::postArray('keep2'); if ($action!='choose') { if ($gid1==$gid2 && $ged1==$ged2) { $action='choose'; echo '', WT_I18N::translate('You entered the same IDs. You cannot merge the same records.'), ''; } else { $rec1 = WT_GedcomRecord::getInstance($gid1, WT_Tree::getIdFromName($ged1)); $rec2 = WT_GedcomRecord::getInstance($gid2, WT_Tree::getIdFromName($ged2)); if (!$rec1) { echo '', WT_I18N::translate('Unable to find record with ID'), ': ', $gid1, ', ', $ged; $action='choose'; } elseif (!$rec2) { echo '', WT_I18N::translate('Unable to find record with ID'), ': ', $gid2, ', ', $ged2; $action='choose'; } elseif ($rec1::RECORD_TYPE != $rec2::RECORD_TYPE) { echo '', WT_I18N::translate('Records are not the same type. Cannot merge records that are not the same type.'), ''; $action='choose'; } else { $facts1 = array(); $facts2 = array(); foreach ($rec1->getFacts() as $fact) { if (!$fact->isOld()) { $facts1[$fact->getFactId()]=$fact; } } foreach ($rec2->getFacts() as $fact) { if (!$fact->isOld()) { $facts2[$fact->getFactId()]=$fact; } } if ($action=='select') { echo '

', WT_I18N::translate('Merge records'), '

'; echo '
'; echo WT_I18N::translate('The following facts were exactly the same in both records and will be merged automatically.'), '
'; echo ''; echo ''; echo ''; echo ''; echo ''; $skip = array(); echo ''; foreach ($facts1 as $fact_id1 => $fact1) { foreach ($facts2 as $fact_id2 => $fact2) { if ($fact_id1 == $fact_id2) { echo ''; $skip[] = $fact_id1; unset($facts1[$fact_id1]); unset($facts2[$fact_id2]); } } } if (!$skip) { echo ''; } echo '
getTarget()) { // Don't change links when merging remote facts. echo ' readonly="readonly"'; } echo '>', nl2br($fact1->getGedcom(), false), '
', WT_I18N::translate('No matching facts found'), '

'; echo WT_I18N::translate('The following facts did not match. Select the information you would like to keep.'); echo ''; echo ''; echo ''; echo '
', WT_I18N::translate('Record'), ' ', $rec1->getXref(), '', WT_I18N::translate('Record'), ' ', $rec2->getXref(), '
'; echo ''; foreach ($facts1 as $n=>$fact1) { if ($fact1->getTag() != 'CHAN') { echo ''; echo ''; } } echo '
getTarget()) { // Don't change links when merging remote facts. echo ' readonly="readonly"'; } echo '>', nl2br(WT_Filter::escapeHtml($fact1->getGedcom()), false), '
'; echo '
'; echo ''; foreach ($facts2 as $n=>$fact2) { if ($fact2->getTag() != 'CHAN') { echo ''; echo ''; } } echo '
getTarget()) { // Don't merge links from different trees. What would they point to! echo ' checked="checked"'; } else { echo ' readonly="readonly"'; } echo '>', nl2br(WT_Filter::escapeHtml($fact2->getGedcom()), false), '
'; echo '
'; echo ''; echo '
'; } elseif ($action=='merge') { echo '

', WT_I18N::translate('Merge records'), '

'; if ($GEDCOM==$ged2) { //-- replace all the records that linked to gid2 $ids=fetch_all_links($gid2, WT_GED_ID); foreach ($ids as $id) { $record=WT_GedcomRecord::getInstance($id); if (!$record->isOld()) { echo WT_I18N::translate('Updating linked record'), ' ', $id, '
'; $gedcom=str_replace("@$gid2@", "@$gid1@", $record->getGedcom()); $gedcom=preg_replace( '/(\n1.*@.+@.*(?:(?:\n[2-9].*)*))((?:\n1.*(?:\n[2-9].*)*)*\1)/', '$2', $gedcom ); $record->updateRecord($gedcom, true); } } // Update any linked user-accounts WT_DB::prepare( "UPDATE `##user_gedcom_setting`". " SET setting_value=?". " WHERE gedcom_id=? AND setting_name='gedcomid' AND setting_value=?" )->execute(array($gid2, WT_GED_ID, $gid1)); // Merge hit counters $hits=WT_DB::prepare( "SELECT page_name, SUM(page_count)". " FROM `##hit_counter`". " WHERE gedcom_id=? AND page_parameter IN (?, ?)". " GROUP BY page_name" )->execute(array(WT_GED_ID, $gid1, $gid2))->fetchAssoc(); foreach ($hits as $page_name=>$page_count) { WT_DB::prepare( "UPDATE `##hit_counter` SET page_count=?". " WHERE gedcom_id=? AND page_name=? AND page_parameter=?" )->execute(array($page_count, WT_GED_ID, $page_name, $gid1)); } WT_DB::prepare( "DELETE FROM `##hit_counter`". " WHERE gedcom_id=? AND page_parameter=?" )->execute(array(WT_GED_ID, $gid2)); } $gedcom = "0 @" . $rec1->getXref() . "@ " . $rec1::RECORD_TYPE; foreach ($facts1 as $fact_id=>$fact) { if (in_array($fact_id, $keep1)) { $gedcom .= "\n" . $fact->getGedcom(); echo WT_I18N::translate('Adding'), " ", $fact->getTag(), ' ', WT_I18N::translate('from'), ' ', $rec1->getXref(), '
'; } } foreach ($facts2 as $fact_id=>$fact) { if (in_array($fact_id, $keep2)) { $gedcom .= "\n" . $fact->getGedcom(); echo WT_I18N::translate('Adding'), " ", $fact->getTag(), ' ', WT_I18N::translate('from'), ' ', $rec2->getXref(), '
'; } } $rec1->updateRecord($gedcom, true); $rec2->deleteRecord(); echo WT_I18N::translate('GEDCOM record successfully deleted.'), '
'; echo '

', WT_I18N::translate( 'Record %s successfully updated.', ''.$rec1->getXref().'' ), ' 0) { echo '

', $fav_count, ' ', WT_I18N::translate('favorites updated.'), '

'; } echo '

'; } } } } if ($action=='choose') { $controller->addInlineJavascript(' function iopen_find(textbox, gedselect) { ged = gedselect.options[gedselect.selectedIndex].value; findIndi(textbox, null, ged); } function fopen_find(textbox, gedselect) { ged = gedselect.options[gedselect.selectedIndex].value; findFamily(textbox, ged); } function sopen_find(textbox, gedselect) { ged = gedselect.options[gedselect.selectedIndex].value; findSource(textbox, null, ged); } '); echo '

', WT_I18N::translate('Merge records'), '

', WT_I18N::translate('Select two GEDCOM records to merge. The records must be of the same type.'), '

', WT_I18N::translate('Merge to ID:'), '
', WT_I18N::translate('Merge from ID:'), '
'; }