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::exec("START TRANSACTION"); 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)); set_gedcom_setting($gedcom_id, 'gedcom_filename', $filename); WT_DB::exec("COMMIT"); fclose($fp); }
// it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA if (!defined('WT_WEBTREES')) { header('HTTP/1.0 403 Forbidden'); exit; } $settings = self::prepare("SELECT gedcom_id, setting_value FROM `##gedcom_setting` WHERE setting_name='SHOW_RELATIVES_EVENTS'")->fetchAssoc(); foreach ($settings as $gedcom_id => $setting) { // Delete old settings $setting = preg_replace('/_(BIRT|MARR|DEAT)_(COUS|MSIB|FSIB|GGCH|NEPH|GGPA)/', '', $setting); $setting = preg_replace('/_FAMC_(RESI_EMIG)/', '', $setting); // Rename settings $setting = preg_replace('/_MARR_(MOTH|FATH|FAMC)/', '_MARR_PARE', $setting); $setting = preg_replace('/_DEAT_(MOTH|FATH)/', '_DEAT_PARE', $setting); // Remove duplicates preg_match_all('/[_A-Z]+/', $setting, $match); // And save set_gedcom_setting($gedcom_id, 'SHOW_RELATIVES_EVENTS', implode(',', array_unique($match[0]))); } // Update the version to indicate success WT_Site::setPreference($schema_name, $next_version);
$gedcom_privacy = "\${INDEX_DIRECTORY}" . $FILE . "_priv.php"; } if (empty($gedcom_title)) { if (!empty($_POST["gedcom_title"])) { $gedcom_title = $_POST["gedcom_title"]; } else { $gedcom_title = str_replace("#GEDCOMFILE#", $FILE, $pgv_lang["new_gedcom_title"]); } } // Create the gedcom if it doesn't already exist $ged_id = get_id_from_gedcom($FILE, true); set_gedcom_setting($ged_id, 'config', $gedcom_config); set_gedcom_setting($ged_id, 'privacy', $gedcom_privacy); set_gedcom_setting($ged_id, 'title', $gedcom_title); set_gedcom_setting($ged_id, 'path', $path . $GEDFILENAME); set_gedcom_setting($ged_id, 'pgv_ver', PGV_VERSION); // Check that add/remove common surnames are separated by [,;] blank $_POST["NEW_COMMON_NAMES_REMOVE"] = preg_replace("/[,;]\\b/", ", ", $_POST["NEW_COMMON_NAMES_REMOVE"]); $_POST["NEW_COMMON_NAMES_ADD"] = preg_replace("/[,;]\\b/", ", ", $_POST["NEW_COMMON_NAMES_ADD"]); $COMMON_NAMES_THRESHOLD = $_POST["NEW_COMMON_NAMES_THRESHOLD"]; $COMMON_NAMES_ADD = $_POST["NEW_COMMON_NAMES_ADD"]; $COMMON_NAMES_REMOVE = $_POST["NEW_COMMON_NAMES_REMOVE"]; $boolarray = array(); $boolarray["yes"] = "true"; $boolarray["no"] = "false"; $boolarray[false] = "false"; $boolarray[true] = "true"; $configtext = implode('', file("config_gedcom.php")); $_POST["NEW_MEDIA_DIRECTORY"] = preg_replace('/\\\\/', '/', $_POST["NEW_MEDIA_DIRECTORY"]); $ct = preg_match("'/\$'", $_POST["NEW_MEDIA_DIRECTORY"]); if ($ct == 0) {
} // Calculate progress so far $percent = 100 * ($row->import_offset / $row->import_total); $status = WT_I18N::translate('Loading data from GEDCOM: %.1f%%', $percent); echo '<div id="progressbar', $gedcom_id, '"><div style="position:absolute;">', $status, '</div></div>'; $controller->addInlineJavascript('jQuery("#progressbar' . $gedcom_id . '").progressbar({value: ' . round($percent, 1) . '});'); $first_time = $row->import_offset == 0; // Run for one second. This keeps the resource requirements low. for ($end_time = microtime(true) + 1.0; microtime(true) < $end_time;) { $data = WT_DB::prepare("SELECT gedcom_chunk_id, REPLACE(chunk_data, '\r', '\n') AS chunk_data" . " FROM `##gedcom_chunk`" . " WHERE gedcom_id=? AND NOT imported" . " ORDER BY gedcom_chunk_id" . " LIMIT 1")->execute(array($gedcom_id))->fetchOneRow(); // If we are at the start position, do some tidying up if ($first_time) { $keep_media = WT_Filter::getBool('keep_media' . $gedcom_id); // Delete any existing genealogical data empty_database($gedcom_id, $keep_media); set_gedcom_setting($gedcom_id, 'imported', false); // Remove any byte-order-mark WT_DB::prepare("UPDATE `##gedcom_chunk`" . " SET chunk_data=TRIM(LEADING ? FROM chunk_data)" . " WHERE gedcom_chunk_id=?")->execute(array(WT_UTF8_BOM, $data->gedcom_chunk_id)); // Re-fetch the data, now that we have removed the BOM $data = WT_DB::prepare("SELECT gedcom_chunk_id, REPLACE(chunk_data, '\r', '\n') AS chunk_data" . " FROM `##gedcom_chunk`" . " WHERE gedcom_chunk_id=?")->execute(array($data->gedcom_chunk_id))->fetchOneRow(); if (substr($data->chunk_data, 0, 6) != '0 HEAD') { WT_DB::exec("ROLLBACK"); echo WT_I18N::translate('Invalid GEDCOM file - no header record found.'); $controller->addInlineJavascript('jQuery("#actions' . $gedcom_id . '").toggle();'); exit; } // What character set is this? Need to convert it to UTF8 if (preg_match('/\\n[ \\t]*1 CHAR(?:ACTER)? (.+)/', $data->chunk_data, $match)) { $charset = strtoupper($match[1]); } else { $charset = 'ASCII';
public static function create($tree_name) { try { // Create a new tree WT_DB::prepare("INSERT INTO `##gedcom` (gedcom_name) VALUES (?)")->execute(array($tree_name)); $tree_id = WT_DB::prepare("SELECT LAST_INSERT_ID()")->fetchOne(); } catch (PDOException $ex) { // A tree with that name already exists? return; } // Update the list of trees - to include this new one self::$trees = null; // Module privacy WT_Module::setDefaultAccess($tree_id); // Gedcom and privacy settings set_gedcom_setting($tree_id, 'ADVANCED_NAME_FACTS', 'NICK,_AKA'); set_gedcom_setting($tree_id, 'ADVANCED_PLAC_FACTS', ''); set_gedcom_setting($tree_id, 'ALLOW_THEME_DROPDOWN', true); set_gedcom_setting($tree_id, 'CALENDAR_FORMAT', 'gregorian'); set_gedcom_setting($tree_id, 'CHART_BOX_TAGS', ''); set_gedcom_setting($tree_id, 'COMMON_NAMES_ADD', ''); set_gedcom_setting($tree_id, 'COMMON_NAMES_REMOVE', ''); set_gedcom_setting($tree_id, 'COMMON_NAMES_THRESHOLD', '40'); set_gedcom_setting($tree_id, 'CONTACT_USER_ID', WT_USER_ID); set_gedcom_setting($tree_id, 'DEFAULT_PEDIGREE_GENERATIONS', '4'); set_gedcom_setting($tree_id, 'EXPAND_RELATIVES_EVENTS', false); set_gedcom_setting($tree_id, 'EXPAND_SOURCES', false); set_gedcom_setting($tree_id, 'FAM_FACTS_ADD', 'CENS,MARR,RESI,SLGS,MARR_CIVIL,MARR_RELIGIOUS,MARR_PARTNERS,RESN'); set_gedcom_setting($tree_id, 'FAM_FACTS_QUICK', 'MARR,DIV,_NMR'); set_gedcom_setting($tree_id, 'FAM_FACTS_UNIQUE', 'NCHI,MARL,DIV,ANUL,DIVF,ENGA,MARB,MARC,MARS'); set_gedcom_setting($tree_id, 'FAM_ID_PREFIX', 'F'); set_gedcom_setting($tree_id, 'FORMAT_TEXT', 'markdown'); set_gedcom_setting($tree_id, 'FULL_SOURCES', false); set_gedcom_setting($tree_id, 'GEDCOM_ID_PREFIX', 'I'); set_gedcom_setting($tree_id, 'GEDCOM_MEDIA_PATH', ''); set_gedcom_setting($tree_id, 'GENERATE_UIDS', false); set_gedcom_setting($tree_id, 'HIDE_GEDCOM_ERRORS', true); set_gedcom_setting($tree_id, 'HIDE_LIVE_PEOPLE', true); set_gedcom_setting($tree_id, 'INDI_FACTS_ADD', 'AFN,BIRT,DEAT,BURI,CREM,ADOP,BAPM,BARM,BASM,BLES,CHRA,CONF,FCOM,ORDN,NATU,EMIG,IMMI,CENS,PROB,WILL,GRAD,RETI,DSCR,EDUC,IDNO,NATI,NCHI,NMR,OCCU,PROP,RELI,RESI,SSN,TITL,BAPL,CONL,ENDL,SLGC,_MILI,ASSO,RESN'); set_gedcom_setting($tree_id, 'INDI_FACTS_QUICK', 'BIRT,BURI,BAPM,CENS,DEAT,OCCU,RESI'); set_gedcom_setting($tree_id, 'INDI_FACTS_UNIQUE', ''); set_gedcom_setting($tree_id, 'KEEP_ALIVE_YEARS_BIRTH', ''); set_gedcom_setting($tree_id, 'KEEP_ALIVE_YEARS_DEATH', ''); set_gedcom_setting($tree_id, 'LANGUAGE', WT_LOCALE); // Default to the current admin’s language set_gedcom_setting($tree_id, 'MAX_ALIVE_AGE', 120); set_gedcom_setting($tree_id, 'MAX_DESCENDANCY_GENERATIONS', '15'); set_gedcom_setting($tree_id, 'MAX_PEDIGREE_GENERATIONS', '10'); set_gedcom_setting($tree_id, 'MEDIA_DIRECTORY', 'media/'); set_gedcom_setting($tree_id, 'MEDIA_ID_PREFIX', 'M'); set_gedcom_setting($tree_id, 'MEDIA_UPLOAD', WT_PRIV_USER); set_gedcom_setting($tree_id, 'META_DESCRIPTION', ''); set_gedcom_setting($tree_id, 'META_TITLE', WT_WEBTREES); set_gedcom_setting($tree_id, 'NOTE_FACTS_ADD', 'SOUR,RESN'); set_gedcom_setting($tree_id, 'NOTE_FACTS_QUICK', ''); set_gedcom_setting($tree_id, 'NOTE_FACTS_UNIQUE', ''); set_gedcom_setting($tree_id, 'NOTE_ID_PREFIX', 'N'); set_gedcom_setting($tree_id, 'NO_UPDATE_CHAN', false); set_gedcom_setting($tree_id, 'PEDIGREE_FULL_DETAILS', true); set_gedcom_setting($tree_id, 'PEDIGREE_LAYOUT', true); set_gedcom_setting($tree_id, 'PEDIGREE_ROOT_ID', ''); set_gedcom_setting($tree_id, 'PEDIGREE_SHOW_GENDER', false); set_gedcom_setting($tree_id, 'PREFER_LEVEL2_SOURCES', '1'); set_gedcom_setting($tree_id, 'QUICK_REQUIRED_FACTS', 'BIRT,DEAT'); set_gedcom_setting($tree_id, 'QUICK_REQUIRED_FAMFACTS', 'MARR'); set_gedcom_setting($tree_id, 'REPO_FACTS_ADD', 'PHON,EMAIL,FAX,WWW,NOTE,SHARED_NOTE,RESN'); set_gedcom_setting($tree_id, 'REPO_FACTS_QUICK', ''); set_gedcom_setting($tree_id, 'REPO_FACTS_UNIQUE', 'NAME,ADDR'); set_gedcom_setting($tree_id, 'REPO_ID_PREFIX', 'R'); set_gedcom_setting($tree_id, 'REQUIRE_AUTHENTICATION', false); set_gedcom_setting($tree_id, 'SAVE_WATERMARK_IMAGE', false); set_gedcom_setting($tree_id, 'SAVE_WATERMARK_THUMB', false); set_gedcom_setting($tree_id, 'SHOW_AGE_DIFF', false); set_gedcom_setting($tree_id, 'SHOW_COUNTER', true); set_gedcom_setting($tree_id, 'SHOW_DEAD_PEOPLE', WT_PRIV_PUBLIC); set_gedcom_setting($tree_id, 'SHOW_EST_LIST_DATES', false); set_gedcom_setting($tree_id, 'SHOW_FACT_ICONS', true); set_gedcom_setting($tree_id, 'SHOW_GEDCOM_RECORD', false); set_gedcom_setting($tree_id, 'SHOW_HIGHLIGHT_IMAGES', true); set_gedcom_setting($tree_id, 'SHOW_LDS_AT_GLANCE', false); set_gedcom_setting($tree_id, 'SHOW_LEVEL2_NOTES', true); set_gedcom_setting($tree_id, 'SHOW_LIVING_NAMES', WT_PRIV_USER); set_gedcom_setting($tree_id, 'SHOW_MEDIA_DOWNLOAD', false); set_gedcom_setting($tree_id, 'SHOW_NO_WATERMARK', WT_PRIV_USER); set_gedcom_setting($tree_id, 'SHOW_PARENTS_AGE', true); set_gedcom_setting($tree_id, 'SHOW_PEDIGREE_PLACES', '9'); set_gedcom_setting($tree_id, 'SHOW_PEDIGREE_PLACES_SUFFIX', false); set_gedcom_setting($tree_id, 'SHOW_PRIVATE_RELATIONSHIPS', true); set_gedcom_setting($tree_id, 'SHOW_RELATIVES_EVENTS', '_BIRT_CHIL,_BIRT_SIBL,_MARR_CHIL,_MARR_PARE,_DEAT_CHIL,_DEAT_PARE,_DEAT_GPAR,_DEAT_SIBL,_DEAT_SPOU'); set_gedcom_setting($tree_id, 'SHOW_STATS', false); set_gedcom_setting($tree_id, 'SOURCE_ID_PREFIX', 'S'); set_gedcom_setting($tree_id, 'SOUR_FACTS_ADD', 'NOTE,REPO,SHARED_NOTE,RESN'); set_gedcom_setting($tree_id, 'SOUR_FACTS_QUICK', 'TEXT,NOTE,REPO'); set_gedcom_setting($tree_id, 'SOUR_FACTS_UNIQUE', 'AUTH,ABBR,TITL,PUBL,TEXT'); set_gedcom_setting($tree_id, 'SUBLIST_TRIGGER_I', '200'); set_gedcom_setting($tree_id, 'SURNAME_LIST_STYLE', 'style2'); switch (WT_LOCALE) { case 'es': set_gedcom_setting($tree_id, 'SURNAME_TRADITION', 'spanish'); break; case 'is': set_gedcom_setting($tree_id, 'SURNAME_TRADITION', 'icelandic'); break; case 'lt': set_gedcom_setting($tree_id, 'SURNAME_TRADITION', 'lithuanian'); break; case 'pl': set_gedcom_setting($tree_id, 'SURNAME_TRADITION', 'polish'); break; case 'pt': case 'pt-BR': set_gedcom_setting($tree_id, 'SURNAME_TRADITION', 'portuguese'); break; default: set_gedcom_setting($tree_id, 'SURNAME_TRADITION', 'paternal'); break; } set_gedcom_setting($tree_id, 'THEME_DIR', 'webtrees'); set_gedcom_setting($tree_id, 'THUMBNAIL_WIDTH', '100'); set_gedcom_setting($tree_id, 'USE_RIN', false); set_gedcom_setting($tree_id, 'USE_SILHOUETTE', true); set_gedcom_setting($tree_id, 'WATERMARK_THUMB', false); set_gedcom_setting($tree_id, 'WEBMASTER_USER_ID', WT_USER_ID); set_gedcom_setting($tree_id, 'WEBTREES_EMAIL', ''); set_gedcom_setting($tree_id, 'WORD_WRAPPED_NOTES', false); set_gedcom_setting($tree_id, 'imported', 0); set_gedcom_setting($tree_id, 'title', WT_I18N::translate('My family tree')); // Default restriction settings $statement = WT_DB::prepare("INSERT INTO `##default_resn` (gedcom_id, xref, tag_type, resn) VALUES (?, NULL, ?, ?)"); $statement->execute(array($tree_id, 'SSN', 'confidential')); $statement->execute(array($tree_id, 'SOUR', 'privacy')); $statement->execute(array($tree_id, 'REPO', 'privacy')); $statement->execute(array($tree_id, 'SUBM', 'confidential')); $statement->execute(array($tree_id, 'SUBN', 'confidential')); // Genealogy data // It is simpler to create a temporary/unimported GEDCOM than to populate all the tables... $john_doe = WT_I18N::translate('John /DOE/'); $note = WT_I18N::translate('Edit this individual and replace their details with your own'); WT_DB::prepare("INSERT INTO `##gedcom_chunk` (gedcom_id, chunk_data) VALUES (?, ?)")->execute(array($tree_id, "0 HEAD\n1 CHAR UTF-8\n0 @I1@ INDI\n1 NAME {$john_doe}\n1 SEX M\n1 BIRT\n2 DATE 01 JAN 1850\n2 NOTE {$note}\n0 TRLR\n")); // Set the initial blocks WT_DB::prepare("INSERT INTO `##block` (gedcom_id, location, block_order, module_name)" . " SELECT ?, location, block_order, module_name" . " FROM `##block`" . " WHERE gedcom_id=-1")->execute(array($tree_id)); // Update the list of trees - to include the new configuration settings self::$trees = null; }
set_gedcom_setting(WT_GED_ID, 'WEBMASTER_USER_ID', WT_Filter::post('NEW_WEBMASTER_USER_ID')); set_gedcom_setting(WT_GED_ID, 'WEBTREES_EMAIL', WT_Filter::post('NEW_WEBTREES_EMAIL')); set_gedcom_setting(WT_GED_ID, 'WORD_WRAPPED_NOTES', WT_Filter::postBool('NEW_WORD_WRAPPED_NOTES')); if (WT_Filter::post('gedcom_title')) { set_gedcom_setting(WT_GED_ID, 'title', WT_Filter::post('gedcom_title')); } // Only accept valid folders for NEW_MEDIA_DIRECTORY $NEW_MEDIA_DIRECTORY = preg_replace('/[\\/\\\\]+/', '/', WT_Filter::post('NEW_MEDIA_DIRECTORY') . '/'); if (substr($NEW_MEDIA_DIRECTORY, 0, 1) == '/') { $NEW_MEDIA_DIRECTORY = substr($NEW_MEDIA_DIRECTORY, 1); } if ($NEW_MEDIA_DIRECTORY) { if (is_dir(WT_DATA_DIR . $NEW_MEDIA_DIRECTORY)) { set_gedcom_setting(WT_GED_ID, 'MEDIA_DIRECTORY', $NEW_MEDIA_DIRECTORY); } elseif (@mkdir(WT_DATA_DIR . $NEW_MEDIA_DIRECTORY, 0755, true)) { set_gedcom_setting(WT_GED_ID, 'MEDIA_DIRECTORY', $NEW_MEDIA_DIRECTORY); WT_FlashMessages::addMessage(WT_I18N::translate('The folder %s was created.', WT_DATA_DIR . $NEW_MEDIA_DIRECTORY)); } else { WT_FlashMessages::addMessage(WT_I18N::translate('The folder %s does not exist, and it could not be created.', WT_DATA_DIR . $NEW_MEDIA_DIRECTORY)); } } $gedcom = WT_Filter::post('gedcom'); if ($gedcom && $gedcom != WT_GEDCOM) { try { WT_DB::prepare("UPDATE `##gedcom` SET gedcom_name = ? WHERE gedcom_id = ?")->execute(array($gedcom, WT_GED_ID)); WT_DB::prepare("UPDATE `##site_setting` SET setting_value = ? WHERE setting_name='DEFAULT_GEDCOM' AND setting_value = ?")->execute(array($gedcom, WT_GEDCOM)); } catch (Exception $ex) { // Probably a duplicate name. $gedcom = WT_GEDCOM; } }
private function admin() { $controller = new WT_Controller_Page(); $controller->restrictAccess(Auth::isAdmin())->setPageTitle($this->getTitle())->pageHeader(); // Save the updated preferences if (WT_Filter::post('action') == 'save') { foreach (WT_Tree::getAll() as $tree) { set_gedcom_setting($tree->tree_id, 'include_in_sitemap', WT_Filter::postBool('include' . $tree->tree_id)); } // Clear cache and force files to be regenerated WT_DB::prepare("DELETE FROM `##module_setting` WHERE setting_name LIKE 'sitemap%'")->execute(); } $include_any = false; echo '<h3>', $this->getTitle(), '</h3>', '<p>', WT_I18N::translate('Sitemaps are a way for webmasters to tell search engines about the pages on a website that are available for crawling. All major search engines support sitemaps. For more information, see <a href="http://www.sitemaps.org/">www.sitemaps.org</a>.') . '</p>', '<p>', WT_I18N::translate('Which family trees should be included in the sitemaps?'), '</p>', '<form method="post" action="module.php?mod=' . $this->getName() . '&mod_action=admin">', '<input type="hidden" name="action" value="save">'; foreach (WT_Tree::getAll() as $tree) { echo '<p><input type="checkbox" name="include', $tree->tree_id, '"'; if (get_gedcom_setting($tree->tree_id, 'include_in_sitemap')) { echo ' checked="checked"'; $include_any = true; } echo '>', $tree->tree_title_html, '</p>'; } echo '<input type="submit" value="', WT_I18N::translate('save'), '">', '</form>', '<hr>'; if ($include_any) { $site_map_url1 = WT_SERVER_NAME . WT_SCRIPT_PATH . 'module.php?mod=' . $this->getName() . '&mod_action=generate&file=sitemap.xml'; $site_map_url2 = rawurlencode(WT_SERVER_NAME . WT_SCRIPT_PATH . 'module.php?mod=' . $this->getName() . '&mod_action=generate&file=sitemap.xml'); echo '<p>', WT_I18N::translate('To tell search engines that sitemaps are available, you should add the following line to your robots.txt file.'), '</p>'; echo '<pre>Sitemap: ', $site_map_url1, '</pre>', '<hr>', '<p>', WT_I18N::translate('To tell search engines that sitemaps are available, you can use the following links.'), '</p>', '<ul>', '<li><a target="_blank" href="http://www.bing.com/webmaster/ping.aspx?siteMap=' . $site_map_url2 . '">Bing</a></li>', '<li><a target="_blank" href="http://www.google.com/webmasters/tools/ping?sitemap=' . $site_map_url2 . '">Google</a></li>', '</ul>'; } }