restrictAccess(Auth::isManager()); switch (WT_Filter::get('action')) { case 'uploadform': $controller->setPageTitle(WT_I18N::translate('Upload family tree')); break; case 'importform': $controller->setPageTitle(WT_I18N::translate('Import family tree')); break; default: $controller->setPageTitle(WT_I18N::translate('Manage family trees')); break; } // Don’t allow the user to cancel the request. We do not want to be left // with an incomplete transaction. ignore_user_abort(true); /** * @param integer $gedcom_id * @param string $path the full path to the (possibly temporary) file. * @param string $filename the actual filename (no folder). * * @throws Exception */ function import_gedcom_file($gedcom_id, $path, $filename) { // Read the file in blocks of roughly 64K. Ensure that each block // contains complete gedcom records. This will ensure we don’t split // multi-byte characters, as well as simplifying the code to import // each block. $file_data = ''; $fp = fopen($path, 'rb'); WT_DB::beginTransaction(); WT_DB::prepare("DELETE FROM `##gedcom_chunk` WHERE gedcom_id=?")->execute(array($gedcom_id)); while (!feof($fp)) { $file_data .= fread($fp, 65536); // There is no strrpos() function that searches for substrings :-( for ($pos = strlen($file_data) - 1; $pos > 0; --$pos) { if ($file_data[$pos] == '0' && ($file_data[$pos - 1] == "\n" || $file_data[$pos - 1] == "\r")) { // We’ve found the last record boundary in this chunk of data break; } } if ($pos) { WT_DB::prepare( "INSERT INTO `##gedcom_chunk` (gedcom_id, chunk_data) VALUES (?, ?)" )->execute(array($gedcom_id, substr($file_data, 0, $pos))); $file_data = substr($file_data, $pos); } } WT_DB::prepare( "INSERT INTO `##gedcom_chunk` (gedcom_id, chunk_data) VALUES (?, ?)" )->execute(array($gedcom_id, $file_data)); WT_Tree::get($gedcom_id)->setPreference('gedcom_filename', $filename); WT_DB::commit(); fclose($fp); } // Process POST actions switch (WT_Filter::post('action')) { case 'delete': $gedcom_id = WT_Filter::postInteger('gedcom_id'); if (WT_Filter::checkCsrf() && $gedcom_id) { WT_Tree::get($gedcom_id)->delete(); } header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME); exit; case 'setdefault': if (WT_Filter::checkCsrf()) { WT_Site::setPreference('DEFAULT_GEDCOM', WT_Filter::post('ged')); } header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME); exit; case 'new_tree': $tree_name = basename(WT_Filter::post('tree_name')); if (WT_Filter::checkCsrf() && $tree_name) { WT_Tree::create($tree_name); } header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?ged=' . $tree_name); exit; case 'replace_upload': $gedcom_id = WT_Filter::postInteger('gedcom_id'); // Make sure the gedcom still exists if (WT_Filter::checkCsrf() && WT_Tree::get($gedcom_id)) { foreach ($_FILES as $FILE) { if ($FILE['error'] == 0 && is_readable($FILE['tmp_name'])) { import_gedcom_file($gedcom_id, $FILE['tmp_name'], $FILE['name']); } } } header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?keep_media' . $gedcom_id . '=' . WT_Filter::postBool('keep_media' . $gedcom_id)); return; case 'replace_import': $gedcom_id = WT_Filter::postInteger('gedcom_id'); // Make sure the gedcom still exists if (WT_Filter::checkCsrf() && WT_Tree::get($gedcom_id)) { $tree_name = basename(WT_Filter::post('tree_name')); import_gedcom_file($gedcom_id, WT_DATA_DIR . $tree_name, $tree_name); } header('Location: ' . WT_SERVER_NAME . WT_SCRIPT_PATH . WT_SCRIPT_NAME . '?keep_media' . $gedcom_id . '=' . WT_Filter::postBool('keep_media' . $gedcom_id)); return; } $default_tree_title = WT_I18N::translate('My family tree'); $default_tree_name = 'tree'; $default_tree_number = 1; $existing_trees = WT_Tree::getNameList(); while (array_key_exists($default_tree_name . $default_tree_number, $existing_trees)) { $default_tree_number++; } $default_tree_name .= $default_tree_number; $controller->pageHeader(); ?>
', WT_I18N::translate('This will delete all the genealogical data from %s and replace it with data from another GEDCOM file.', $tree->tree_name_html), ''; // the javascript in the next line strips any path associated with the file before comparing it to the current GEDCOM name (both Chrome and IE8 include c:\fakepath\ in the filename). $previous_gedcom_filename = $tree->getPreference('gedcom_filename'); echo ''; exit; } } echo '