xref: /webtrees/app/Module/HtmlBlockModule.php (revision 397e599a3131684b8a335ebfddcfe63828b9f51b)
18c2e8227SGreg Roach<?php
28c2e8227SGreg Roach/**
38c2e8227SGreg Roach * webtrees: online genealogy
41062a142SGreg Roach * Copyright (C) 2018 webtrees development team
58c2e8227SGreg Roach * This program is free software: you can redistribute it and/or modify
68c2e8227SGreg Roach * it under the terms of the GNU General Public License as published by
78c2e8227SGreg Roach * the Free Software Foundation, either version 3 of the License, or
88c2e8227SGreg Roach * (at your option) any later version.
98c2e8227SGreg Roach * This program is distributed in the hope that it will be useful,
108c2e8227SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
118c2e8227SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
128c2e8227SGreg Roach * GNU General Public License for more details.
138c2e8227SGreg Roach * You should have received a copy of the GNU General Public License
148c2e8227SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>.
158c2e8227SGreg Roach */
1676692c8bSGreg Roachnamespace Fisharebest\Webtrees\Module;
1776692c8bSGreg Roach
180e62c4b8SGreg Roachuse Fisharebest\Webtrees\Auth;
1915d603e7SGreg Roachuse Fisharebest\Webtrees\Bootstrap4;
200e62c4b8SGreg Roachuse Fisharebest\Webtrees\Filter;
213d7a8a4cSGreg Roachuse Fisharebest\Webtrees\Functions\FunctionsDate;
223d7a8a4cSGreg Roachuse Fisharebest\Webtrees\Functions\FunctionsEdit;
23cc5ab399SGreg Roachuse Fisharebest\Webtrees\Html;
240e62c4b8SGreg Roachuse Fisharebest\Webtrees\I18N;
250e62c4b8SGreg Roachuse Fisharebest\Webtrees\Site;
260e62c4b8SGreg Roachuse Fisharebest\Webtrees\Stats;
270e62c4b8SGreg Roachuse Fisharebest\Webtrees\Tree;
288c2e8227SGreg Roach
298c2e8227SGreg Roach/**
308c2e8227SGreg Roach * Class HtmlBlockModule
318c2e8227SGreg Roach */
32e2a378d3SGreg Roachclass HtmlBlockModule extends AbstractModule implements ModuleBlockInterface {
338c2e8227SGreg Roach	/** {@inheritdoc} */
348c2e8227SGreg Roach	public function getTitle() {
359c6524dcSGreg Roach		return /* I18N: Name of a module */
369c6524dcSGreg Roach			I18N::translate('HTML');
378c2e8227SGreg Roach	}
388c2e8227SGreg Roach
398c2e8227SGreg Roach	/** {@inheritdoc} */
408c2e8227SGreg Roach	public function getDescription() {
419c6524dcSGreg Roach		return /* I18N: Description of the “HTML” module */
429c6524dcSGreg Roach			I18N::translate('Add your own text and graphics.');
438c2e8227SGreg Roach	}
448c2e8227SGreg Roach
4576692c8bSGreg Roach	/**
4676692c8bSGreg Roach	 * Generate the HTML content of this block.
4776692c8bSGreg Roach	 *
4876692c8bSGreg Roach	 * @param int      $block_id
4976692c8bSGreg Roach	 * @param bool     $template
50727f238cSGreg Roach	 * @param string[] $cfg
5176692c8bSGreg Roach	 *
5276692c8bSGreg Roach	 * @return string
5376692c8bSGreg Roach	 */
54a9430be8SGreg Roach	public function getBlock($block_id, $template = true, $cfg = []): string {
558c2e8227SGreg Roach		global $ctype, $WT_TREE;
568c2e8227SGreg Roach
57c02d9576SGreg Roach		$title          = $this->getBlockSetting($block_id, 'title', '');
58c02d9576SGreg Roach		$content        = $this->getBlockSetting($block_id, 'html', '');
59e2a378d3SGreg Roach		$gedcom         = $this->getBlockSetting($block_id, 'gedcom');
60e2a378d3SGreg Roach		$show_timestamp = $this->getBlockSetting($block_id, 'show_timestamp', '0');
61e2a378d3SGreg Roach		$languages      = $this->getBlockSetting($block_id, 'languages');
628c2e8227SGreg Roach
638c2e8227SGreg Roach		// Only show this block for certain languages
648c2e8227SGreg Roach		if ($languages && !in_array(WT_LOCALE, explode(',', $languages))) {
658c2e8227SGreg Roach			return '';
668c2e8227SGreg Roach		}
678c2e8227SGreg Roach
688c2e8227SGreg Roach		/*
698c2e8227SGreg Roach		 * Select GEDCOM
708c2e8227SGreg Roach		 */
718c2e8227SGreg Roach		switch ($gedcom) {
728c2e8227SGreg Roach			case '__current__':
738c2e8227SGreg Roach				$stats = new Stats($WT_TREE);
748c2e8227SGreg Roach				break;
758c2e8227SGreg Roach			case '__default__':
76ef2fd529SGreg Roach				$tree = Tree::findByName(Site::getPreference('DEFAULT_GEDCOM'));
77ef2fd529SGreg Roach				if ($tree) {
78ef2fd529SGreg Roach					$stats = new Stats($tree);
798c2e8227SGreg Roach				} else {
808c2e8227SGreg Roach					$stats = new Stats($WT_TREE);
818c2e8227SGreg Roach				}
828c2e8227SGreg Roach				break;
838c2e8227SGreg Roach			default:
84ef2fd529SGreg Roach				$tree = Tree::findByName($gedcom);
85ef2fd529SGreg Roach				if ($tree) {
86ef2fd529SGreg Roach					$stats = new Stats($tree);
878c2e8227SGreg Roach				} else {
888c2e8227SGreg Roach					$stats = new Stats($WT_TREE);
898c2e8227SGreg Roach				}
908c2e8227SGreg Roach				break;
918c2e8227SGreg Roach		}
928c2e8227SGreg Roach
938c2e8227SGreg Roach		/*
948c2e8227SGreg Roach		* Retrieve text, process embedded variables
958c2e8227SGreg Roach		*/
968c2e8227SGreg Roach		$title   = $stats->embedTags($title);
979c6524dcSGreg Roach		$content = $stats->embedTags($content);
988c2e8227SGreg Roach
99c02d9576SGreg Roach		if ($show_timestamp === '1') {
1003d7a8a4cSGreg Roach			$content .= '<br>' . FunctionsDate::formatTimestamp($this->getBlockSetting($block_id, 'timestamp', WT_TIMESTAMP) + WT_TIMESTAMP_OFFSET);
1018c2e8227SGreg Roach		}
1028c2e8227SGreg Roach
1038c2e8227SGreg Roach		if ($template) {
104*397e599aSGreg Roach			if ($ctype === 'gedcom' && Auth::isManager($WT_TREE)) {
105*397e599aSGreg Roach				$config_url = route('tree-page-block-edit', ['block_id' => $block_id, 'ged' => $WT_TREE->getName()]);
106*397e599aSGreg Roach			} elseif ($ctype === 'user' && Auth::check()) {
107*397e599aSGreg Roach				$config_url = route('user-page-block-edit', ['block_id' => $block_id, 'ged' => $WT_TREE->getName()]);
1089c6524dcSGreg Roach			} else {
1099c6524dcSGreg Roach				$config_url = '';
1109c6524dcSGreg Roach			}
1119c6524dcSGreg Roach
112225e381fSGreg Roach			return view('blocks/template', [
1139c6524dcSGreg Roach				'block'      => str_replace('_', '-', $this->getName()),
1149c6524dcSGreg Roach				'id'         => $block_id,
1159c6524dcSGreg Roach				'config_url' => $config_url,
1169c6524dcSGreg Roach				'title'      => $title,
1179c6524dcSGreg Roach				'content'    => $content,
1189c6524dcSGreg Roach			]);
1198c2e8227SGreg Roach		} else {
1208c2e8227SGreg Roach			return $content;
1218c2e8227SGreg Roach		}
1228c2e8227SGreg Roach	}
1238c2e8227SGreg Roach
1248c2e8227SGreg Roach	/** {@inheritdoc} */
125a9430be8SGreg Roach	public function loadAjax(): bool {
1268c2e8227SGreg Roach		return false;
1278c2e8227SGreg Roach	}
1288c2e8227SGreg Roach
1298c2e8227SGreg Roach	/** {@inheritdoc} */
130a9430be8SGreg Roach	public function isUserBlock(): bool {
1318c2e8227SGreg Roach		return true;
1328c2e8227SGreg Roach	}
1338c2e8227SGreg Roach
1348c2e8227SGreg Roach	/** {@inheritdoc} */
135a9430be8SGreg Roach	public function isGedcomBlock(): bool {
1368c2e8227SGreg Roach		return true;
1378c2e8227SGreg Roach	}
1388c2e8227SGreg Roach
13976692c8bSGreg Roach	/**
14076692c8bSGreg Roach	 * An HTML form to edit block settings
14176692c8bSGreg Roach	 *
14276692c8bSGreg Roach	 * @param int $block_id
143a9430be8SGreg Roach	 *
144a9430be8SGreg Roach	 * @return void
14576692c8bSGreg Roach	 */
146be9a728cSGreg Roach	public function configureBlock($block_id) {
1474b9ff166SGreg Roach		global $WT_TREE;
1484b9ff166SGreg Roach
1498c2e8227SGreg Roach		if (Filter::postBool('save') && Filter::checkCsrf()) {
150c999a340SGreg Roach			$languages = Filter::postArray('lang');
151e2a378d3SGreg Roach			$this->setBlockSetting($block_id, 'gedcom', Filter::post('gedcom'));
152e2a378d3SGreg Roach			$this->setBlockSetting($block_id, 'title', Filter::post('title'));
153e2a378d3SGreg Roach			$this->setBlockSetting($block_id, 'html', Filter::post('html'));
154e2a378d3SGreg Roach			$this->setBlockSetting($block_id, 'show_timestamp', Filter::postBool('show_timestamp'));
155e2a378d3SGreg Roach			$this->setBlockSetting($block_id, 'timestamp', Filter::post('timestamp'));
156e2a378d3SGreg Roach			$this->setBlockSetting($block_id, 'languages', implode(',', $languages));
1578c2e8227SGreg Roach		}
1588c2e8227SGreg Roach
15913abd6f3SGreg Roach		$templates = [
1600fd39724SGreg Roach			I18N::translate('Keyword examples') => '#getAllTagsTable#',
1618c2e8227SGreg Roach
1620fd39724SGreg Roach			I18N::translate('Narrative description') => /* 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#.'),
1638c2e8227SGreg Roach
1640fd39724SGreg Roach			I18N::translate('Statistics') => '<div class="gedcom_stats">
1658c2e8227SGreg Roach				<span style="font-weight: bold;"><a href="index.php?command=gedcom">#gedcomTitle#</a></span><br>
1668c2e8227SGreg Roach				' . I18N::translate('This family tree was last updated on %s.', '#gedcomUpdated#') . '
167e0486a06SGreg Roach					<div class="row">
168e0486a06SGreg Roach						<div class="col col-sm-4">
169e0486a06SGreg Roach							<table class="table wt-facts-table">
1708c2e8227SGreg Roach								<tr>
171e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Individuals') . '</th>
172e0486a06SGreg Roach									<td>#totalIndividuals#</td>
1738c2e8227SGreg Roach								</tr>
1748c2e8227SGreg Roach								<tr>
175e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Males') . '</th>
176e0486a06SGreg Roach									<td>#totalSexMales#<br>#totalSexMalesPercentage#</td>
1778c2e8227SGreg Roach								</tr>
1788c2e8227SGreg Roach								<tr>
179e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Females') . '</th>
180e0486a06SGreg Roach									<td>#totalSexFemales#<br>#totalSexFemalesPercentage#</td>
1818c2e8227SGreg Roach								</tr>
1828c2e8227SGreg Roach								<tr>
183e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Total surnames') . '</th>
1845bcf6074SGreg Roach									<td>#totalSurnames#</td>
1858c2e8227SGreg Roach								</tr>
1868c2e8227SGreg Roach								<tr>
187e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Families') . '</th>
188e0486a06SGreg Roach									<td>#totalFamilies#</td>
1898c2e8227SGreg Roach								</tr>
1908c2e8227SGreg Roach								<tr>
191e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Sources') . '</th>
192e0486a06SGreg Roach									<td>#totalSources#</td>
1938c2e8227SGreg Roach								</tr>
1948c2e8227SGreg Roach								<tr>
195e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Media objects') . '</th>
196e0486a06SGreg Roach									<td>#totalMedia#</td>
1978c2e8227SGreg Roach								</tr>
1988c2e8227SGreg Roach								<tr>
199e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Repositories') . '</th>
200e0486a06SGreg Roach									<td>#totalRepositories#</td>
2018c2e8227SGreg Roach								</tr>
2028c2e8227SGreg Roach								<tr>
203e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Events') . '</th>
204e0486a06SGreg Roach									<td>#totalEvents#</td>
2058c2e8227SGreg Roach								</tr>
2068c2e8227SGreg Roach								<tr>
207e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Users') . '</th>
208e0486a06SGreg Roach									<td>#totalUsers#</td>
2098c2e8227SGreg Roach								</tr>
2108c2e8227SGreg Roach							</table>
211e0486a06SGreg Roach						</div>
212e0486a06SGreg Roach
213e0486a06SGreg Roach						<div class="col col-sm-8">
214e0486a06SGreg Roach							<table class="table wt-facts-table">
2158c2e8227SGreg Roach								<tr>
216e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Earliest birth') . '</th>
217e0486a06SGreg Roach									<td>#firstBirth#</td>
2188c2e8227SGreg Roach								</tr>
2198c2e8227SGreg Roach								<tr>
220e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Latest birth') . '</th>
221e0486a06SGreg Roach									<td>#lastBirth#</td>
2228c2e8227SGreg Roach								</tr>
2238c2e8227SGreg Roach								<tr>
224e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Earliest death') . '</th>
225e0486a06SGreg Roach									<td>#firstDeath#</td>
2268c2e8227SGreg Roach								</tr>
2278c2e8227SGreg Roach								<tr>
228e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Latest death') . '</th>
229e0486a06SGreg Roach									<td>#lastDeath#</td>
2308c2e8227SGreg Roach								</tr>
2318c2e8227SGreg Roach								<tr>
232e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Individual who lived the longest') . '</th>
233e0486a06SGreg Roach									<td>#longestLife#</td>
2348c2e8227SGreg Roach								</tr>
2358c2e8227SGreg Roach								<tr>
236e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Average age at death') . '</th>
237e0486a06SGreg Roach									<td>#averageLifespan#</td>
2388c2e8227SGreg Roach								</tr>
2398c2e8227SGreg Roach								<tr>
240e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Family with the most children') . '</th>
241e0486a06SGreg Roach									<td>#largestFamilySize#<br>#largestFamily#</td>
2428c2e8227SGreg Roach								</tr>
2438c2e8227SGreg Roach								<tr>
244e0486a06SGreg Roach									<th scope="row">' . I18N::translate('Average number of children per family') . '</th>
245e0486a06SGreg Roach									<td>#averageChildren#</td>
2468c2e8227SGreg Roach								</tr>
2478c2e8227SGreg Roach							</table>
248e0486a06SGreg Roach						</div>
249e0486a06SGreg Roach					</div>
250e0486a06SGreg Roach					<br>
251e0486a06SGreg Roach					<span style="font-weight: bold;">' . I18N::translate('Most common surnames') . '</span>
252e0486a06SGreg Roach					<br>
2538c2e8227SGreg Roach					#commonSurnames#
254cbc1590aSGreg Roach				</div>',
25513abd6f3SGreg Roach		];
2568c2e8227SGreg Roach
257abb263adSGreg Roach		$title          = $this->getBlockSetting($block_id, 'title', '');
258abb263adSGreg Roach		$html           = $this->getBlockSetting($block_id, 'html', '');
25915d603e7SGreg Roach		$gedcom         = $this->getBlockSetting($block_id, 'gedcom', '__current__');
260e2a378d3SGreg Roach		$show_timestamp = $this->getBlockSetting($block_id, 'show_timestamp', '0');
261e2a378d3SGreg Roach		$languages      = explode(',', $this->getBlockSetting($block_id, 'languages'));
2628c2e8227SGreg Roach
26315d603e7SGreg Roach		?>
26415d603e7SGreg Roach		<div class="row form-group">
26515d603e7SGreg Roach			<label class="col-sm-3 col-form-label" for="title">
26615d603e7SGreg Roach				<?= I18N::translate('Title') ?>
26715d603e7SGreg Roach			</label>
26815d603e7SGreg Roach			<div class="col-sm-9">
269d53324c9SGreg Roach				<input class="form-control" type="text" id="title" name="title" value="<?= e($title) ?>">
27015d603e7SGreg Roach			</div>
27115d603e7SGreg Roach		</div>
2728c2e8227SGreg Roach
27315d603e7SGreg Roach		<div class="row form-group">
27415d603e7SGreg Roach			<label class="col-sm-3 col-form-label" for="template">
27515d603e7SGreg Roach				<?= I18N::translate('Templates') ?>
27615d603e7SGreg Roach			</label>
27715d603e7SGreg Roach			<div class="col-sm-9">
278c87f84e3SGreg Roach				<?= Bootstrap4::select([$html => I18N::translate('Custom')] + array_flip($templates), '', ['onchange' => 'this.form.html.value=this.options[this.selectedIndex].value; CKEDITOR.instances.html.setData(document.block.html.value);', 'id' => 'template']) ?>
27915d603e7SGreg Roach				<p class="small text-muted">
28015d603e7SGreg Roach					<?= 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.') ?>
28115d603e7SGreg Roach				</p>
28215d603e7SGreg Roach			</div>
28315d603e7SGreg Roach		</div>
2848c2e8227SGreg Roach
28515d603e7SGreg Roach		<div class="row form-group">
28615d603e7SGreg Roach			<label class="col-sm-3 col-form-label" for="gedcom">
28715d603e7SGreg Roach				<?= I18N::translate('Family tree') ?>
28815d603e7SGreg Roach			</label>
28915d603e7SGreg Roach			<div class="col-sm-9">
29015d603e7SGreg Roach				<?= Bootstrap4::select(['__current__' => I18N::translate('Current'), '__default__' => I18N::translate('Default')] + Tree::getNameList(), $gedcom, ['id' => 'gedcom', 'name' => 'gedcom']) ?>
29115d603e7SGreg Roach			</div>
29215d603e7SGreg Roach		</div>
2938c2e8227SGreg Roach
29415d603e7SGreg Roach		<div class="row form-group">
29515d603e7SGreg Roach			<label class="col-sm-3 col-form-label" for="html">
29615d603e7SGreg Roach				<?= I18N::translate('Content') ?>
29715d603e7SGreg Roach			</label>
29815d603e7SGreg Roach			<div class="col-sm-9">
29915d603e7SGreg Roach				<p>
30015d603e7SGreg Roach					<?= 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.') ?>
30115d603e7SGreg Roach				</p>
30215d603e7SGreg Roach			</div>
30315d603e7SGreg Roach		</div>
3048c2e8227SGreg Roach
30515d603e7SGreg Roach		<div class="row form-group">
306d53324c9SGreg Roach			<textarea name="html" id="html" class="html-edit" rows="10"><?= e($html) ?></textarea>
30715d603e7SGreg Roach		</div>
3088c2e8227SGreg Roach
30915d603e7SGreg Roach		<fieldset class="form-group">
31015d603e7SGreg Roach			<div class="row">
31115d603e7SGreg Roach				<legend class="form-control-legend col-sm-3">
31215d603e7SGreg Roach					<?= I18N::translate('Show the date and time of update') ?>
31315d603e7SGreg Roach				</legend>
31415d603e7SGreg Roach				<div class="col-sm-9">
3159c6524dcSGreg Roach					<?= Bootstrap4::radioButtons('show_timestamp', FunctionsEdit::optionsNoYes(), $show_timestamp, true) ?>
31615d603e7SGreg Roach				</div>
31715d603e7SGreg Roach			</div>
31815d603e7SGreg Roach		</fieldset>
31915d603e7SGreg Roach
32015d603e7SGreg Roach		<fieldset class="form-group">
32115d603e7SGreg Roach			<div class="row">
32215d603e7SGreg Roach				<legend class="form-control-legend col-sm-3">
32315d603e7SGreg Roach					<?= I18N::translate('Show this block for which languages') ?>
32415d603e7SGreg Roach				</legend>
32515d603e7SGreg Roach				<div class="col-sm-9">
32615d603e7SGreg Roach					<?= FunctionsEdit::editLanguageCheckboxes('lang', $languages) ?>
32715d603e7SGreg Roach				</div>
32815d603e7SGreg Roach			</div>
32915d603e7SGreg Roach		</fieldset>
33015d603e7SGreg Roach
33115d603e7SGreg Roach		<?php
3328c2e8227SGreg Roach	}
3338c2e8227SGreg Roach}
334