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'), '
';
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
'