18c2e8227SGreg Roach<?php 28c2e8227SGreg Roachnamespace Fisharebest\Webtrees; 38c2e8227SGreg Roach 48c2e8227SGreg Roach/** 58c2e8227SGreg Roach * webtrees: online genealogy 68c2e8227SGreg Roach * Copyright (C) 2015 webtrees development team 78c2e8227SGreg Roach * This program is free software: you can redistribute it and/or modify 88c2e8227SGreg Roach * it under the terms of the GNU General Public License as published by 98c2e8227SGreg Roach * the Free Software Foundation, either version 3 of the License, or 108c2e8227SGreg Roach * (at your option) any later version. 118c2e8227SGreg Roach * This program is distributed in the hope that it will be useful, 128c2e8227SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 138c2e8227SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 148c2e8227SGreg Roach * GNU General Public License for more details. 158c2e8227SGreg Roach * You should have received a copy of the GNU General Public License 168c2e8227SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>. 178c2e8227SGreg Roach */ 188c2e8227SGreg Roach 198c2e8227SGreg Roach/** 208c2e8227SGreg Roach * Class HtmlBlockModule 218c2e8227SGreg Roach */ 22e2a378d3SGreg Roachclass HtmlBlockModule extends AbstractModule implements ModuleBlockInterface { 238c2e8227SGreg Roach /** {@inheritdoc} */ 248c2e8227SGreg Roach public function getTitle() { 258c2e8227SGreg Roach return /* I18N: Name of a module */ I18N::translate('HTML'); 268c2e8227SGreg Roach } 278c2e8227SGreg Roach 288c2e8227SGreg Roach /** {@inheritdoc} */ 298c2e8227SGreg Roach public function getDescription() { 308c2e8227SGreg Roach return /* I18N: Description of the “HTML” module */ I18N::translate('Add your own text and graphics.'); 318c2e8227SGreg Roach } 328c2e8227SGreg Roach 338c2e8227SGreg Roach /** {@inheritdoc} */ 348c2e8227SGreg Roach public function getBlock($block_id, $template = true, $cfg = null) { 358c2e8227SGreg Roach global $ctype, $WT_TREE; 368c2e8227SGreg Roach 37e2a378d3SGreg Roach $title = $this->getBlockSetting($block_id, 'title'); 38e2a378d3SGreg Roach $html = $this->getBlockSetting($block_id, 'html'); 39e2a378d3SGreg Roach $gedcom = $this->getBlockSetting($block_id, 'gedcom'); 40e2a378d3SGreg Roach $show_timestamp = $this->getBlockSetting($block_id, 'show_timestamp', '0'); 41e2a378d3SGreg Roach $languages = $this->getBlockSetting($block_id, 'languages'); 428c2e8227SGreg Roach 438c2e8227SGreg Roach // Only show this block for certain languages 448c2e8227SGreg Roach if ($languages && !in_array(WT_LOCALE, explode(',', $languages))) { 458c2e8227SGreg Roach return ''; 468c2e8227SGreg Roach } 478c2e8227SGreg Roach 488c2e8227SGreg Roach /* 498c2e8227SGreg Roach * Select GEDCOM 508c2e8227SGreg Roach */ 518c2e8227SGreg Roach switch ($gedcom) { 528c2e8227SGreg Roach case '__current__': 538c2e8227SGreg Roach $stats = new Stats($WT_TREE); 548c2e8227SGreg Roach break; 558c2e8227SGreg Roach case '__default__': 56ef2fd529SGreg Roach $tree = Tree::findByName(Site::getPreference('DEFAULT_GEDCOM')); 57ef2fd529SGreg Roach if ($tree) { 58ef2fd529SGreg Roach $stats = new Stats($tree); 598c2e8227SGreg Roach } else { 608c2e8227SGreg Roach $stats = new Stats($WT_TREE); 618c2e8227SGreg Roach } 628c2e8227SGreg Roach break; 638c2e8227SGreg Roach default: 64ef2fd529SGreg Roach $tree = Tree::findByName($gedcom); 65ef2fd529SGreg Roach if ($tree) { 66ef2fd529SGreg Roach $stats = new Stats($tree); 678c2e8227SGreg Roach } else { 688c2e8227SGreg Roach $stats = new Stats($WT_TREE); 698c2e8227SGreg Roach } 708c2e8227SGreg Roach break; 718c2e8227SGreg Roach } 728c2e8227SGreg Roach 738c2e8227SGreg Roach /* 748c2e8227SGreg Roach * Retrieve text, process embedded variables 758c2e8227SGreg Roach */ 768c2e8227SGreg Roach if (strpos($title, '#') !== false || strpos($html, '#') !== false) { 778c2e8227SGreg Roach $title = $stats->embedTags($title); 788c2e8227SGreg Roach $html = $stats->embedTags($html); 798c2e8227SGreg Roach } 808c2e8227SGreg Roach 818c2e8227SGreg Roach /* 828c2e8227SGreg Roach * Start Of Output 838c2e8227SGreg Roach */ 848c2e8227SGreg Roach $id = $this->getName() . $block_id; 858c2e8227SGreg Roach $class = $this->getName() . '_block'; 864b9ff166SGreg Roach if ($ctype === 'gedcom' && Auth::isManager($WT_TREE) || $ctype === 'user' && Auth::check()) { 87*9353052eSGreg Roach $title = '<a class="icon-admin" title="' . I18N::translate('Configure') . '" href="block_edit.php?block_id=' . $block_id . '&ged=' . $WT_TREE->getNameHtml() . '&ctype=' . $ctype . '"></a>'; 888c2e8227SGreg Roach } 898c2e8227SGreg Roach 908c2e8227SGreg Roach $content = $html; 918c2e8227SGreg Roach 928c2e8227SGreg Roach if ($show_timestamp) { 93309092efSGreg Roach $content .= '<br>' . format_timestamp($this->getBlockSetting($block_id, 'timestamp', WT_TIMESTAMP) + WT_TIMESTAMP_OFFSET); 948c2e8227SGreg Roach } 958c2e8227SGreg Roach 968c2e8227SGreg Roach if ($template) { 978c2e8227SGreg Roach return Theme::theme()->formatBlock($id, $title, $class, $content); 988c2e8227SGreg Roach } else { 998c2e8227SGreg Roach return $content; 1008c2e8227SGreg Roach } 1018c2e8227SGreg Roach } 1028c2e8227SGreg Roach 1038c2e8227SGreg Roach /** {@inheritdoc} */ 1048c2e8227SGreg Roach public function loadAjax() { 1058c2e8227SGreg Roach return false; 1068c2e8227SGreg Roach } 1078c2e8227SGreg Roach 1088c2e8227SGreg Roach /** {@inheritdoc} */ 1098c2e8227SGreg Roach public function isUserBlock() { 1108c2e8227SGreg Roach return true; 1118c2e8227SGreg Roach } 1128c2e8227SGreg Roach 1138c2e8227SGreg Roach /** {@inheritdoc} */ 1148c2e8227SGreg Roach public function isGedcomBlock() { 1158c2e8227SGreg Roach return true; 1168c2e8227SGreg Roach } 1178c2e8227SGreg Roach 1188c2e8227SGreg Roach /** {@inheritdoc} */ 1198c2e8227SGreg Roach public function configureBlock($block_id) { 1204b9ff166SGreg Roach global $WT_TREE; 1214b9ff166SGreg Roach 1228c2e8227SGreg Roach if (Filter::postBool('save') && Filter::checkCsrf()) { 123c999a340SGreg Roach $languages = Filter::postArray('lang'); 124e2a378d3SGreg Roach $this->setBlockSetting($block_id, 'gedcom', Filter::post('gedcom')); 125e2a378d3SGreg Roach $this->setBlockSetting($block_id, 'title', Filter::post('title')); 126e2a378d3SGreg Roach $this->setBlockSetting($block_id, 'html', Filter::post('html')); 127e2a378d3SGreg Roach $this->setBlockSetting($block_id, 'show_timestamp', Filter::postBool('show_timestamp')); 128e2a378d3SGreg Roach $this->setBlockSetting($block_id, 'timestamp', Filter::post('timestamp')); 129e2a378d3SGreg Roach $this->setBlockSetting($block_id, 'languages', implode(',', $languages)); 1308c2e8227SGreg Roach } 1318c2e8227SGreg Roach 1328c2e8227SGreg Roach $templates = array( 1338c2e8227SGreg Roach I18N::translate('Keyword examples')=> 1348c2e8227SGreg Roach '#getAllTagsTable#', 1358c2e8227SGreg Roach 1368c2e8227SGreg Roach I18N::translate('Narrative description')=> 1378c2e8227SGreg Roach /* I18N: do not translate the #keywords# */ I18N::translate('This family tree was last updated on #gedcomUpdated#. There are #totalSurnames# surnames in this family tree. The earliest recorded event is the #firstEventType# of #firstEventName# in #firstEventYear#. The most recent event is the #lastEventType# of #lastEventName# in #lastEventYear#.<br><br>If you have any comments or feedback please contact #contactWebmaster#.'), 1388c2e8227SGreg Roach 1398c2e8227SGreg Roach I18N::translate('Statistics')=> 1408c2e8227SGreg Roach '<div class="gedcom_stats"> 1418c2e8227SGreg Roach <span style="font-weight: bold;"><a href="index.php?command=gedcom">#gedcomTitle#</a></span><br> 1428c2e8227SGreg Roach ' . I18N::translate('This family tree was last updated on %s.', '#gedcomUpdated#') . ' 1438c2e8227SGreg Roach <table id="keywords"> 1448c2e8227SGreg Roach <tr> 1458c2e8227SGreg Roach <td valign="top" class="width20"> 1468c2e8227SGreg Roach <table cellspacing="1" cellpadding="0"> 1478c2e8227SGreg Roach <tr> 1488c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Individuals') . '</td> 1498c2e8227SGreg Roach <td class="facts_value" align="right"><a href="indilist.php?surname_sublist=no">#totalIndividuals#</a></td> 1508c2e8227SGreg Roach </tr> 1518c2e8227SGreg Roach <tr> 1528c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Males') . '</td> 1538c2e8227SGreg Roach <td class="facts_value" align="right">#totalSexMales#<br>#totalSexMalesPercentage#</td> 1548c2e8227SGreg Roach </tr> 1558c2e8227SGreg Roach <tr> 1568c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Females') . '</td> 1578c2e8227SGreg Roach <td class="facts_value" align="right">#totalSexFemales#<br>#totalSexFemalesPercentage#</td> 1588c2e8227SGreg Roach </tr> 1598c2e8227SGreg Roach <tr> 1608c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Total surnames') . '</td> 1614b9ff166SGreg Roach <td class="facts_value" align="right"><a href="indilist.php?show_all=yes&surname_sublist=yes&ged='. $WT_TREE->getNameUrl() . '">#totalSurnames#</a></td> 1628c2e8227SGreg Roach </tr> 1638c2e8227SGreg Roach <tr> 1648c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Families') . '</td> 1654b9ff166SGreg Roach <td class="facts_value" align="right"><a href="famlist.php?ged='. $WT_TREE->getNameUrl() . '">#totalFamilies#</a></td> 1668c2e8227SGreg Roach </tr> 1678c2e8227SGreg Roach <tr> 1688c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Sources') . '</td> 1694b9ff166SGreg Roach <td class="facts_value" align="right"><a href="sourcelist.php?ged='. $WT_TREE->getNameUrl() . '">#totalSources#</a></td> 1708c2e8227SGreg Roach </tr> 1718c2e8227SGreg Roach <tr> 1728c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Media objects') . '</td> 1734b9ff166SGreg Roach <td class="facts_value" align="right"><a href="medialist.php?ged='. $WT_TREE->getNameUrl() . '">#totalMedia#</a></td> 1748c2e8227SGreg Roach </tr> 1758c2e8227SGreg Roach <tr> 1768c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Repositories') . '</td> 1774b9ff166SGreg Roach <td class="facts_value" align="right"><a href="repolist.php?ged='. $WT_TREE->getNameUrl() . '">#totalRepositories#</a></td> 1788c2e8227SGreg Roach </tr> 1798c2e8227SGreg Roach <tr> 1808c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Total events') . '</td> 1818c2e8227SGreg Roach <td class="facts_value" align="right">#totalEvents#</td> 1828c2e8227SGreg Roach </tr> 1838c2e8227SGreg Roach <tr> 1848c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Total users') . '</td> 1858c2e8227SGreg Roach <td class="facts_value" align="right">#totalUsers#</td> 1868c2e8227SGreg Roach </tr> 1878c2e8227SGreg Roach </table> 1888c2e8227SGreg Roach </td> 1898c2e8227SGreg Roach <td><br></td> 1908c2e8227SGreg Roach <td valign="top"> 1918c2e8227SGreg Roach <table cellspacing="1" cellpadding="0" border="0"> 1928c2e8227SGreg Roach <tr> 1938c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Earliest birth year') . '</td> 1948c2e8227SGreg Roach <td class="facts_value" align="right">#firstBirthYear#</td> 1958c2e8227SGreg Roach <td class="facts_value">#firstBirth#</td> 1968c2e8227SGreg Roach </tr> 1978c2e8227SGreg Roach <tr> 1988c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Latest birth year') . '</td> 1998c2e8227SGreg Roach <td class="facts_value" align="right">#lastBirthYear#</td> 2008c2e8227SGreg Roach <td class="facts_value">#lastBirth#</td> 2018c2e8227SGreg Roach </tr> 2028c2e8227SGreg Roach <tr> 2038c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Earliest death year') . '</td> 2048c2e8227SGreg Roach <td class="facts_value" align="right">#firstDeathYear#</td> 2058c2e8227SGreg Roach <td class="facts_value">#firstDeath#</td> 2068c2e8227SGreg Roach </tr> 2078c2e8227SGreg Roach <tr> 2088c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Latest death year') . '</td> 2098c2e8227SGreg Roach <td class="facts_value" align="right">#lastDeathYear#</td> 2108c2e8227SGreg Roach <td class="facts_value">#lastDeath#</td> 2118c2e8227SGreg Roach </tr> 2128c2e8227SGreg Roach <tr> 2138c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Individual who lived the longest') . '</td> 2148c2e8227SGreg Roach <td class="facts_value" align="right">#longestLifeAge#</td> 2158c2e8227SGreg Roach <td class="facts_value">#longestLife#</td> 2168c2e8227SGreg Roach </tr> 2178c2e8227SGreg Roach <tr> 2188c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Average age at death') . '</td> 2198c2e8227SGreg Roach <td class="facts_value" align="right">#averageLifespan#</td> 2208c2e8227SGreg Roach <td class="facts_value"></td> 2218c2e8227SGreg Roach </tr> 2228c2e8227SGreg Roach <tr> 2238c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Family with the most children') . '</td> 2248c2e8227SGreg Roach <td class="facts_value" align="right">#largestFamilySize#</td> 2258c2e8227SGreg Roach <td class="facts_value">#largestFamily#</td> 2268c2e8227SGreg Roach </tr> 2278c2e8227SGreg Roach <tr> 2288c2e8227SGreg Roach <td class="facts_label">'. I18N::translate('Average number of children per family') . '</td> 2298c2e8227SGreg Roach <td class="facts_value" align="right">#averageChildren#</td> 2308c2e8227SGreg Roach <td class="facts_value"></td> 2318c2e8227SGreg Roach </tr> 2328c2e8227SGreg Roach </table> 2338c2e8227SGreg Roach </td> 2348c2e8227SGreg Roach </tr> 2358c2e8227SGreg Roach </table><br> 2368c2e8227SGreg Roach <span style="font-weight: bold;">' . I18N::translate('Most common surnames') . '</span><br> 2378c2e8227SGreg Roach #commonSurnames# 2388c2e8227SGreg Roach </div>' 2398c2e8227SGreg Roach ); 2408c2e8227SGreg Roach 241e2a378d3SGreg Roach $title = $this->getBlockSetting($block_id, 'title'); 242e2a378d3SGreg Roach $html = $this->getBlockSetting($block_id, 'html'); 243e2a378d3SGreg Roach $gedcom = $this->getBlockSetting($block_id, 'gedcom'); 244e2a378d3SGreg Roach $show_timestamp = $this->getBlockSetting($block_id, 'show_timestamp', '0'); 245e2a378d3SGreg Roach $languages = explode(',', $this->getBlockSetting($block_id, 'languages')); 2468c2e8227SGreg Roach 2478c2e8227SGreg Roach echo '<tr><td class="descriptionbox wrap">', 248764a01d9SGreg Roach GedcomTag::getLabel('TITL'), 2498c2e8227SGreg Roach '</td><td class="optionbox"><input type="text" name="title" size="30" value="', Filter::escapeHtml($title), '"></td></tr>'; 2508c2e8227SGreg Roach 2518c2e8227SGreg Roach // templates 2528c2e8227SGreg Roach echo '<tr><td class="descriptionbox wrap">', 2538c2e8227SGreg Roach I18N::translate('Templates'), 2548c2e8227SGreg Roach '</td><td class="optionbox wrap">'; 2558c2e8227SGreg Roach // The CK editor needs lots of help to load/save data :-( 2568c2e8227SGreg Roach if (Module::getModuleByName('ckeditor')) { 2578c2e8227SGreg Roach $ckeditor_onchange = 'CKEDITOR.instances.html.setData(document.block.html.value);'; 2588c2e8227SGreg Roach } else { 2598c2e8227SGreg Roach $ckeditor_onchange = ''; 2608c2e8227SGreg Roach } 2618c2e8227SGreg Roach echo '<select name="template" onchange="document.block.html.value=document.block.template.options[document.block.template.selectedIndex].value;', $ckeditor_onchange, '">'; 2628c2e8227SGreg Roach echo '<option value="', Filter::escapeHtml($html), '">', I18N::translate('Custom'), '</option>'; 2638c2e8227SGreg Roach foreach ($templates as $title=>$template) { 2648c2e8227SGreg Roach echo '<option value="', Filter::escapeHtml($template), '">', $title, '</option>'; 2658c2e8227SGreg Roach } 2668c2e8227SGreg Roach echo '</select>'; 2678c2e8227SGreg Roach if (!$html) { 2688c2e8227SGreg Roach echo '<p>', I18N::translate('To assist you in getting started with this block, we have created several standard templates. When you select one of these templates, the text area will contain a copy that you can then alter to suit your site’s requirements.'), '</p>'; 2698c2e8227SGreg Roach } 2708c2e8227SGreg Roach echo '</td></tr>'; 2718c2e8227SGreg Roach 2728c2e8227SGreg Roach if (count(Tree::getAll()) > 1) { 2738c2e8227SGreg Roach if ($gedcom == '__current__') {$sel_current = 'selected'; } else {$sel_current = ''; } 2748c2e8227SGreg Roach if ($gedcom == '__default__') {$sel_default = 'selected'; } else {$sel_default = ''; } 2758c2e8227SGreg Roach echo '<tr><td class="descriptionbox wrap">', 2768c2e8227SGreg Roach I18N::translate('Family tree'), 2778c2e8227SGreg Roach '</td><td class="optionbox">', 2788c2e8227SGreg Roach '<select name="gedcom">', 2798c2e8227SGreg Roach '<option value="__current__" ', $sel_current, '>', I18N::translate('Current'), '</option>', 2808c2e8227SGreg Roach '<option value="__default__" ', $sel_default, '>', I18N::translate('Default'), '</option>'; 2818c2e8227SGreg Roach foreach (Tree::getAll() as $tree) { 2828c2e8227SGreg Roach if ($tree->getName() === $gedcom) {$sel = 'selected'; } else {$sel = ''; } 283a77340e1SGreg Roach echo '<option value="', $tree->getNameHtml(), '" ', $sel, '>', $tree->getTitleHtml(), '</option>'; 2848c2e8227SGreg Roach } 2858c2e8227SGreg Roach echo '</select>'; 2868c2e8227SGreg Roach echo '</td></tr>'; 2878c2e8227SGreg Roach } 2888c2e8227SGreg Roach 2898c2e8227SGreg Roach // html 2908c2e8227SGreg Roach echo '<tr><td colspan="2" class="descriptionbox">', 2918c2e8227SGreg Roach I18N::translate('Content'); 2928c2e8227SGreg Roach if (!$html) { 2938c2e8227SGreg Roach echo '<p>', I18N::translate('As well as using the toolbar to apply HTML formatting, you can insert database fields which are updated automatically. These special fields are marked with <b>#</b> characters. For example <b>#totalFamilies#</b> will be replaced with the actual number of families in the database. Advanced users may wish to apply CSS classes to their text, so that the formatting matches the currently selected theme.'), '</p>'; 2948c2e8227SGreg Roach } 2958c2e8227SGreg Roach echo 2968c2e8227SGreg Roach '</td></tr><tr>', 2978c2e8227SGreg Roach '<td colspan="2" class="optionbox">'; 2988c2e8227SGreg Roach echo '<textarea name="html" class="html-edit" rows="10" style="width:98%;">', Filter::escapeHtml($html), '</textarea>'; 2998c2e8227SGreg Roach echo '</td></tr>'; 3008c2e8227SGreg Roach 3018c2e8227SGreg Roach echo '<tr><td class="descriptionbox wrap">'; 3028c2e8227SGreg Roach echo I18N::translate('Show the date and time of update'); 3038c2e8227SGreg Roach echo '</td><td class="optionbox">'; 3048c2e8227SGreg Roach echo edit_field_yes_no('show_timestamp', $show_timestamp); 3058c2e8227SGreg Roach echo '<input type="hidden" name="timestamp" value="', WT_TIMESTAMP, '">'; 3068c2e8227SGreg Roach echo '</td></tr>'; 3078c2e8227SGreg Roach 3088c2e8227SGreg Roach echo '<tr><td class="descriptionbox wrap">'; 3098c2e8227SGreg Roach echo I18N::translate('Show this block for which languages?'); 3108c2e8227SGreg Roach echo '</td><td class="optionbox">'; 3118c2e8227SGreg Roach echo edit_language_checkboxes('lang', $languages); 3128c2e8227SGreg Roach echo '</td></tr>'; 3138c2e8227SGreg Roach } 3148c2e8227SGreg Roach} 315