xref: /webtrees/app/Module/FrequentlyAskedQuestionsModule.php (revision f306ecacb6b59f67cf36e2b6ca61424eefcfb57b)
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 FrequentlyAskedQuestionsModule
218c2e8227SGreg Roach */
228c2e8227SGreg Roachclass FrequentlyAskedQuestionsModule extends Module implements ModuleMenuInterface, ModuleConfigInterface {
238c2e8227SGreg Roach	/** {@inheritdoc} */
248c2e8227SGreg Roach	public function getTitle() {
258c2e8227SGreg Roach		return /* I18N: Name of a module.  Abbreviation for “Frequently Asked Questions” */ I18N::translate('FAQ');
268c2e8227SGreg Roach	}
278c2e8227SGreg Roach
288c2e8227SGreg Roach	/** {@inheritdoc} */
298c2e8227SGreg Roach	public function getDescription() {
308c2e8227SGreg Roach		return /* I18N: Description of the “FAQ” module */ I18N::translate('A list of frequently asked questions and answers.');
318c2e8227SGreg Roach	}
328c2e8227SGreg Roach
338c2e8227SGreg Roach	/** {@inheritdoc} */
348c2e8227SGreg Roach	public function modAction($mod_action) {
358c2e8227SGreg Roach		switch ($mod_action) {
368c2e8227SGreg Roach		case 'admin_config':
378c2e8227SGreg Roach			$this->config();
388c2e8227SGreg Roach			break;
398c2e8227SGreg Roach		case 'admin_delete':
408c2e8227SGreg Roach			$this->delete();
418c2e8227SGreg Roach			$this->config();
428c2e8227SGreg Roach			break;
438c2e8227SGreg Roach		case 'admin_edit':
448c2e8227SGreg Roach			$this->edit();
458c2e8227SGreg Roach			break;
468c2e8227SGreg Roach		case 'admin_movedown':
478c2e8227SGreg Roach			$this->movedown();
488c2e8227SGreg Roach			$this->config();
498c2e8227SGreg Roach			break;
508c2e8227SGreg Roach		case 'admin_moveup':
518c2e8227SGreg Roach			$this->moveup();
528c2e8227SGreg Roach			$this->config();
538c2e8227SGreg Roach			break;
548c2e8227SGreg Roach		case 'show':
558c2e8227SGreg Roach			$this->show();
568c2e8227SGreg Roach			break;
578c2e8227SGreg Roach		default:
588c2e8227SGreg Roach			http_response_code(404);
598c2e8227SGreg Roach		}
608c2e8227SGreg Roach	}
618c2e8227SGreg Roach
628c2e8227SGreg Roach	/** {@inheritdoc} */
638c2e8227SGreg Roach	public function getConfigLink() {
648c2e8227SGreg Roach		return 'module.php?mod=' . $this->getName() . '&amp;mod_action=admin_config';
658c2e8227SGreg Roach	}
668c2e8227SGreg Roach
678c2e8227SGreg Roach	/**
688c2e8227SGreg Roach	 * Action from the configuration page
698c2e8227SGreg Roach	 */
708c2e8227SGreg Roach	private function edit() {
7124ec66ceSGreg Roach		global $WT_TREE;
7224ec66ceSGreg Roach
738c2e8227SGreg Roach		if (Filter::postBool('save') && Filter::checkCsrf()) {
748c2e8227SGreg Roach			$block_id = Filter::postInteger('block_id');
758c2e8227SGreg Roach			if ($block_id) {
768c2e8227SGreg Roach				Database::prepare(
778c2e8227SGreg Roach					"UPDATE `##block` SET gedcom_id = NULLIF(:tree_id, '0'), block_order = :block_order WHERE block_id = :block_id"
788c2e8227SGreg Roach				)->execute(array(
798c2e8227SGreg Roach					'tree_id'     => Filter::postInteger('gedcom_id'),
808c2e8227SGreg Roach					'block_order' => Filter::postInteger('block_order'),
818c2e8227SGreg Roach					'block_id'    => $block_id
828c2e8227SGreg Roach				));
838c2e8227SGreg Roach			} else {
848c2e8227SGreg Roach				Database::prepare(
858c2e8227SGreg Roach					"INSERT INTO `##block` (gedcom_id, module_name, block_order) VALUES (NULLIF(:tree_id, '0'), :module_name, :block_order)"
868c2e8227SGreg Roach				)->execute(array(
878c2e8227SGreg Roach					'tree_id'     => Filter::postInteger('gedcom_id'),
888c2e8227SGreg Roach					'module_name' => $this->getName(),
898c2e8227SGreg Roach					'block_order' => Filter::postInteger('block_order'),
908c2e8227SGreg Roach				));
918c2e8227SGreg Roach				$block_id = Database::getInstance()->lastInsertId();
928c2e8227SGreg Roach			}
938c2e8227SGreg Roach			set_block_setting($block_id, 'header', Filter::post('header'));
948c2e8227SGreg Roach			set_block_setting($block_id, 'faqbody', Filter::post('faqbody'));
958c2e8227SGreg Roach
96c999a340SGreg Roach			$languages = Filter::postArray('lang');
978c2e8227SGreg Roach			set_block_setting($block_id, 'languages', implode(',', $languages));
988c2e8227SGreg Roach			$this->config();
998c2e8227SGreg Roach		} else {
1008c2e8227SGreg Roach			$block_id   = Filter::getInteger('block_id');
1018c2e8227SGreg Roach			$controller = new PageController;
1028c2e8227SGreg Roach			if ($block_id) {
1038c2e8227SGreg Roach				$controller->setPageTitle(I18N::translate('Edit FAQ item'));
1048c2e8227SGreg Roach				$header      = get_block_setting($block_id, 'header');
1058c2e8227SGreg Roach				$faqbody     = get_block_setting($block_id, 'faqbody');
1068c2e8227SGreg Roach				$block_order = Database::prepare(
1078c2e8227SGreg Roach					"SELECT block_order FROM `##block` WHERE block_id = :block_id"
1088c2e8227SGreg Roach				)->execute(array('block_id' => $block_id))->fetchOne();
1098c2e8227SGreg Roach				$gedcom_id   = Database::prepare(
1108c2e8227SGreg Roach					"SELECT gedcom_id FROM `##block` WHERE block_id = :block_id"
1118c2e8227SGreg Roach				)->execute(array('block_id' => $block_id))->fetchOne();
1128c2e8227SGreg Roach			} else {
1138c2e8227SGreg Roach				$controller->setPageTitle(I18N::translate('Add an FAQ item'));
1148c2e8227SGreg Roach				$header      = '';
1158c2e8227SGreg Roach				$faqbody     = '';
1168c2e8227SGreg Roach				$block_order = Database::prepare(
1178c2e8227SGreg Roach					"SELECT IFNULL(MAX(block_order)+1, 0) FROM `##block` WHERE module_name = :module_name"
1188c2e8227SGreg Roach				)->execute(array('module_name' => $this->getName()))->fetchOne();
11924ec66ceSGreg Roach				$gedcom_id   = $WT_TREE->getTreeId();
1208c2e8227SGreg Roach			}
1218c2e8227SGreg Roach			$controller->pageHeader();
1228c2e8227SGreg Roach			if (Module::getModuleByName('ckeditor')) {
1238c2e8227SGreg Roach				CkeditorModule::enableEditor($controller);
1248c2e8227SGreg Roach			}
1258c2e8227SGreg Roach
1268c2e8227SGreg Roach			?>
1278c2e8227SGreg Roach			<ol class="breadcrumb small">
1288c2e8227SGreg Roach				<li><a href="admin.php"><?php echo I18N::translate('Control panel'); ?></a></li>
1298c2e8227SGreg Roach				<li><a href="admin_modules.php"><?php echo I18N::translate('Module administration'); ?></a></li>
1308c2e8227SGreg Roach				<li><a href="module.php?mod=<?php echo $this->getName(); ?>&mod_action=admin_config"><?php echo I18N::translate('Frequently asked questions'); ?></a></li>
1318c2e8227SGreg Roach				<li class="active"><?php echo $controller->getPageTitle(); ?></li>
1328c2e8227SGreg Roach			</ol>
1338c2e8227SGreg Roach			<h2><?php echo $controller->getPageTitle(); ?></h2>
1348c2e8227SGreg Roach			<?php
1358c2e8227SGreg Roach
1368c2e8227SGreg Roach			echo '<form name="faq" method="post" action="module.php?mod=', $this->getName(), '&amp;mod_action=admin_edit">';
1378c2e8227SGreg Roach			echo Filter::getCsrf();
1388c2e8227SGreg Roach			echo '<input type="hidden" name="save" value="1">';
1398c2e8227SGreg Roach			echo '<input type="hidden" name="block_id" value="', $block_id, '">';
1408c2e8227SGreg Roach			echo '<table id="faq_module">';
1418c2e8227SGreg Roach			echo '<tr><th>';
1428c2e8227SGreg Roach			echo I18N::translate('Question');
1438c2e8227SGreg Roach			echo '</th></tr><tr><td><input type="text" name="header" size="90" tabindex="1" value="' . Filter::escapeHtml($header) . '"></td></tr>';
1448c2e8227SGreg Roach			echo '<tr><th>';
1458c2e8227SGreg Roach			echo I18N::translate('Answer');
1468c2e8227SGreg Roach			echo '</th></tr><tr><td>';
1478c2e8227SGreg Roach			echo '<textarea name="faqbody" class="html-edit" rows="10" cols="90" tabindex="2">', Filter::escapeHtml($faqbody), '</textarea>';
1488c2e8227SGreg Roach			echo '</td></tr>';
1498c2e8227SGreg Roach			echo '</table><table id="faq_module2">';
1508c2e8227SGreg Roach			echo '<tr>';
1518c2e8227SGreg Roach			echo '<th>', I18N::translate('Show this block for which languages?'), '</th>';
1528c2e8227SGreg Roach			echo '<th>', I18N::translate('FAQ position'), '</th>';
1538c2e8227SGreg Roach			echo '<th>', I18N::translate('FAQ visibility'), '<br><small>', I18N::translate('A FAQ item can be displayed on just one of the family trees, or on all the family trees.'), '</small></th>';
1548c2e8227SGreg Roach			echo '</tr><tr>';
1558c2e8227SGreg Roach			echo '<td>';
1568c2e8227SGreg Roach			$languages = explode(',', get_block_setting($block_id, 'languages'));
1578c2e8227SGreg Roach			echo edit_language_checkboxes('lang', $languages);
1588c2e8227SGreg Roach			echo '</td><td>';
1598c2e8227SGreg Roach			echo '<input type="text" name="block_order" size="3" tabindex="3" value="', $block_order, '"></td>';
1608c2e8227SGreg Roach			echo '</td><td>';
1618c2e8227SGreg Roach			echo select_edit_control('gedcom_id', Tree::getIdList(), I18N::translate('All'), $gedcom_id, 'tabindex="4"');
1628c2e8227SGreg Roach			echo '</td></tr>';
1638c2e8227SGreg Roach			echo '</table>';
1648c2e8227SGreg Roach
1658c2e8227SGreg Roach			echo '<p><input type="submit" value="', I18N::translate('save'), '" tabindex="5">';
1668c2e8227SGreg Roach			echo '</form>';
1678c2e8227SGreg Roach		}
1688c2e8227SGreg Roach	}
1698c2e8227SGreg Roach
1708c2e8227SGreg Roach	/**
1718c2e8227SGreg Roach	 * Respond to a request to delete a FAQ.
1728c2e8227SGreg Roach	 */
1738c2e8227SGreg Roach	private function delete() {
1748c2e8227SGreg Roach		$block_id = Filter::getInteger('block_id');
1758c2e8227SGreg Roach
1768c2e8227SGreg Roach		Database::prepare(
1778c2e8227SGreg Roach			"DELETE FROM `##block_setting` WHERE block_id = :block_id"
1788c2e8227SGreg Roach		)->execute(array('block_id' => $block_id));
1798c2e8227SGreg Roach
1808c2e8227SGreg Roach		Database::prepare(
1818c2e8227SGreg Roach			"DELETE FROM `##block` WHERE block_id = :block_id"
1828c2e8227SGreg Roach		)->execute(array('block_id' => $block_id));
1838c2e8227SGreg Roach	}
1848c2e8227SGreg Roach
1858c2e8227SGreg Roach	/**
1868c2e8227SGreg Roach	 * Respond to a request to move a FAQ up the list.
1878c2e8227SGreg Roach	 */
1888c2e8227SGreg Roach	private function moveup() {
1898c2e8227SGreg Roach		$block_id = Filter::getInteger('block_id');
1908c2e8227SGreg Roach
1918c2e8227SGreg Roach		$block_order = Database::prepare(
1928c2e8227SGreg Roach			"SELECT block_order FROM `##block` WHERE block_id = :block_id"
1938c2e8227SGreg Roach		)->execute(array('block_id' => $block_id))->fetchOne();
1948c2e8227SGreg Roach
1958c2e8227SGreg Roach		$swap_block = Database::prepare(
1968c2e8227SGreg Roach			"SELECT block_order, block_id" .
1978c2e8227SGreg Roach			" FROM `##block`" .
1988c2e8227SGreg Roach			" WHERE block_order = (" .
1998c2e8227SGreg Roach			"  SELECT MAX(block_order) FROM `##block` WHERE block_order < :block_order AND module_name = :module_name_1" .
2008c2e8227SGreg Roach			" ) AND module_name = :module_name_2" .
2018c2e8227SGreg Roach			" LIMIT 1"
2028c2e8227SGreg Roach		)->execute(array(
2038c2e8227SGreg Roach			'block_order'   => $block_order,
2048c2e8227SGreg Roach			'module_name_1' => $this->getName(),
2058c2e8227SGreg Roach			'module_name_2' => $this->getName()
2068c2e8227SGreg Roach		))->fetchOneRow();
2078c2e8227SGreg Roach		if ($swap_block) {
2088c2e8227SGreg Roach			Database::prepare(
2098c2e8227SGreg Roach				"UPDATE `##block` SET block_order = :block_order WHERE block_id = :block_id"
2108c2e8227SGreg Roach			)->execute(array(
2118c2e8227SGreg Roach				'block_order' => $swap_block->block_order,
2128c2e8227SGreg Roach				'block_id'    => $block_id,
2138c2e8227SGreg Roach			));
2148c2e8227SGreg Roach			Database::prepare(
2158c2e8227SGreg Roach				"UPDATE `##block` SET block_order = :block_order WHERE block_id = :block_id"
2168c2e8227SGreg Roach			)->execute(array(
2178c2e8227SGreg Roach				'block_order' => $block_order,
2188c2e8227SGreg Roach				'block_id'    => $swap_block->block_id,
2198c2e8227SGreg Roach			));
2208c2e8227SGreg Roach		}
2218c2e8227SGreg Roach	}
2228c2e8227SGreg Roach
2238c2e8227SGreg Roach	/**
2248c2e8227SGreg Roach	 * Respond to a request to move a FAQ down the list.
2258c2e8227SGreg Roach	 */
2268c2e8227SGreg Roach	private function movedown() {
2278c2e8227SGreg Roach		$block_id = Filter::get('block_id');
2288c2e8227SGreg Roach
2298c2e8227SGreg Roach		$block_order = Database::prepare(
2308c2e8227SGreg Roach			"SELECT block_order FROM `##block` WHERE block_id = :block_id"
2318c2e8227SGreg Roach		)->execute(array(
2328c2e8227SGreg Roach			'block_id' => $block_id,
2338c2e8227SGreg Roach		))->fetchOne();
2348c2e8227SGreg Roach
2358c2e8227SGreg Roach		$swap_block = Database::prepare(
2368c2e8227SGreg Roach			"SELECT block_order, block_id" .
2378c2e8227SGreg Roach			" FROM `##block`" .
2388c2e8227SGreg Roach			" WHERE block_order=(" .
2398c2e8227SGreg Roach			"  SELECT MIN(block_order) FROM `##block` WHERE block_order > :block_order AND module_name = :module_name_1" .
2408c2e8227SGreg Roach			" ) AND module_name = :module_name_2" .
2418c2e8227SGreg Roach			" LIMIT 1"
2428c2e8227SGreg Roach		)->execute(array(
2438c2e8227SGreg Roach			'block_order'   => $block_order,
2448c2e8227SGreg Roach			'module_name_1' => $this->getName(),
2458c2e8227SGreg Roach			'module_name_2' => $this->getName(),
2468c2e8227SGreg Roach			))->fetchOneRow();
2478c2e8227SGreg Roach		if ($swap_block) {
2488c2e8227SGreg Roach			Database::prepare(
2498c2e8227SGreg Roach				"UPDATE `##block` SET block_order = :block_order WHERE block_id = :block_id"
2508c2e8227SGreg Roach			)->execute(array(
2518c2e8227SGreg Roach				'block_order' => $swap_block->block_order,
2528c2e8227SGreg Roach				'block_id'    => $block_id,
2538c2e8227SGreg Roach			));
2548c2e8227SGreg Roach			Database::prepare(
2558c2e8227SGreg Roach				"UPDATE `##block` SET block_order = :block_order WHERE block_id = :block_id"
2568c2e8227SGreg Roach			)->execute(array(
2578c2e8227SGreg Roach				'block_order' => $block_order,
2588c2e8227SGreg Roach				'block_id'    => $swap_block->block_id,
2598c2e8227SGreg Roach			));
2608c2e8227SGreg Roach		}
2618c2e8227SGreg Roach	}
2628c2e8227SGreg Roach
2638c2e8227SGreg Roach	/**
2648c2e8227SGreg Roach	 * Show a list of FAQs
2658c2e8227SGreg Roach	 */
2668c2e8227SGreg Roach	private function show() {
2674b9ff166SGreg Roach		global $controller, $WT_TREE;
2684b9ff166SGreg Roach
2698c2e8227SGreg Roach		$controller = new PageController;
2708c2e8227SGreg Roach		$controller
2718c2e8227SGreg Roach			->setPageTitle(I18N::translate('Frequently asked questions'))
2728c2e8227SGreg Roach			->pageHeader();
2738c2e8227SGreg Roach
2748c2e8227SGreg Roach		$faqs = Database::prepare(
2758c2e8227SGreg Roach			"SELECT block_id, bs1.setting_value AS header, bs2.setting_value AS body, bs3.setting_value AS languages" .
2768c2e8227SGreg Roach			" FROM `##block` b" .
2778c2e8227SGreg Roach			" JOIN `##block_setting` bs1 USING (block_id)" .
2788c2e8227SGreg Roach			" JOIN `##block_setting` bs2 USING (block_id)" .
2798c2e8227SGreg Roach			" JOIN `##block_setting` bs3 USING (block_id)" .
2808c2e8227SGreg Roach			" WHERE module_name = :module_name" .
2818c2e8227SGreg Roach			" AND bs1.setting_name = 'header'" .
2828c2e8227SGreg Roach			" AND bs2.setting_name = 'faqbody'" .
2838c2e8227SGreg Roach			" AND bs3.setting_name = 'languages'" .
2848c2e8227SGreg Roach			" AND IFNULL(gedcom_id, :tree_id_1) = :tree_id_2" .
2858c2e8227SGreg Roach			" ORDER BY block_order"
2868c2e8227SGreg Roach		)->execute(array(
2878c2e8227SGreg Roach			'module_name' => $this->getName(),
28824ec66ceSGreg Roach			'tree_id_1'   => $WT_TREE->getTreeId(),
28924ec66ceSGreg Roach			'tree_id_2'   => $WT_TREE->getTreeId(),
2908c2e8227SGreg Roach		))->fetchAll();
2918c2e8227SGreg Roach
2928c2e8227SGreg Roach		// Define your colors for the alternating rows
2938c2e8227SGreg Roach		echo '<h2 class="center">', I18N::translate('Frequently asked questions'), '</h2>';
2948c2e8227SGreg Roach		// Instructions
29577e70a22SGreg Roach		echo '<div class="faq_italic">', I18N::translate('Click on a title to go straight to it, or scroll down to read them all.');
2964b9ff166SGreg Roach		if (Auth::isManager($WT_TREE)) {
2978c2e8227SGreg Roach			echo '<div class="faq_edit"><a href="module.php?mod=', $this->getName(), '&amp;mod_action=admin_config">', I18N::translate('Click here to add, edit, or delete'), '</a></div>';
2988c2e8227SGreg Roach		}
2998c2e8227SGreg Roach		echo '</div>';
3008c2e8227SGreg Roach		$row_count = 0;
3018c2e8227SGreg Roach		echo '<table class="faq">';
3028c2e8227SGreg Roach		// List of titles
3038c2e8227SGreg Roach		foreach ($faqs as $id => $faq) {
3048c2e8227SGreg Roach			if (!$faq->languages || in_array(WT_LOCALE, explode(',', $faq->languages))) {
3058c2e8227SGreg Roach				$row_color = ($row_count % 2) ? 'odd' : 'even';
3068c2e8227SGreg Roach				// NOTE: Print the header of the current item
3078c2e8227SGreg Roach				echo '<tr class="', $row_color, '"><td style="padding: 5px;">';
3088c2e8227SGreg Roach				echo '<a href="#faq', $id, '">', $faq->header, '</a>';
3098c2e8227SGreg Roach				echo '</td></tr>';
3108c2e8227SGreg Roach				$row_count++;
3118c2e8227SGreg Roach			}
3128c2e8227SGreg Roach		}
3138c2e8227SGreg Roach		echo '</table><hr>';
3148c2e8227SGreg Roach		// Detailed entries
3158c2e8227SGreg Roach		foreach ($faqs as $id => $faq) {
3168c2e8227SGreg Roach			if (!$faq->languages || in_array(WT_LOCALE, explode(',', $faq->languages))) {
3178c2e8227SGreg Roach				echo '<div class="faq_title" id="faq', $id, '">', $faq->header;
3188c2e8227SGreg Roach				echo '<div class="faq_top faq_italic">';
3198c2e8227SGreg Roach				echo '<a href="#content">', I18N::translate('back to top'), '</a>';
3208c2e8227SGreg Roach				echo '</div>';
3218c2e8227SGreg Roach				echo '</div>';
3228c2e8227SGreg Roach				echo '<div class="faq_body">', substr($faq->body, 0, 1) == '<' ? $faq->body : nl2br($faq->body, false), '</div>';
3238c2e8227SGreg Roach				echo '<hr>';
3248c2e8227SGreg Roach			}
3258c2e8227SGreg Roach		}
3268c2e8227SGreg Roach	}
3278c2e8227SGreg Roach
3288c2e8227SGreg Roach	/**
3298c2e8227SGreg Roach	 * Provide a form to manage the FAQs.
3308c2e8227SGreg Roach	 */
3318c2e8227SGreg Roach	private function config() {
33224ec66ceSGreg Roach		global $WT_TREE;
33324ec66ceSGreg Roach
3348c2e8227SGreg Roach		$controller = new PageController;
3358c2e8227SGreg Roach		$controller
3368c2e8227SGreg Roach			->setPageTitle(I18N::translate('Frequently asked questions'))
3378c2e8227SGreg Roach			->pageHeader();
3388c2e8227SGreg Roach
3398c2e8227SGreg Roach		$faqs = Database::prepare(
3408c2e8227SGreg Roach			"SELECT block_id, block_order, gedcom_id, bs1.setting_value AS header, bs2.setting_value AS faqbody" .
3418c2e8227SGreg Roach			" FROM `##block` b" .
3428c2e8227SGreg Roach			" JOIN `##block_setting` bs1 USING (block_id)" .
3438c2e8227SGreg Roach			" JOIN `##block_setting` bs2 USING (block_id)" .
3448c2e8227SGreg Roach			" WHERE module_name = :module_name" .
3458c2e8227SGreg Roach			" AND bs1.setting_name = 'header'" .
3468c2e8227SGreg Roach			" AND bs2.setting_name = 'faqbody'" .
3478c2e8227SGreg Roach			" AND IFNULL(gedcom_id, :tree_id_1) = :tree_id_2" .
3488c2e8227SGreg Roach			" ORDER BY block_order"
3498c2e8227SGreg Roach		)->execute(array(
3508c2e8227SGreg Roach			'module_name' => $this->getName(),
35124ec66ceSGreg Roach			'tree_id_1'   => $WT_TREE->getTreeId(),
35224ec66ceSGreg Roach			'tree_id_2'   => $WT_TREE->getTreeId(),
3538c2e8227SGreg Roach			))->fetchAll();
3548c2e8227SGreg Roach
3558c2e8227SGreg Roach		$min_block_order = Database::prepare(
3568c2e8227SGreg Roach			"SELECT MIN(block_order) FROM `##block` WHERE module_name=?"
3578c2e8227SGreg Roach		)->execute(array($this->getName()))->fetchOne();
3588c2e8227SGreg Roach
3598c2e8227SGreg Roach		$max_block_order = Database::prepare(
3608c2e8227SGreg Roach			"SELECT MAX(block_order) FROM `##block` WHERE module_name=?"
3618c2e8227SGreg Roach		)->execute(array($this->getName()))->fetchOne();
3628c2e8227SGreg Roach
3638c2e8227SGreg Roach		?>
3648c2e8227SGreg Roach		<ol class="breadcrumb small">
3658c2e8227SGreg Roach			<li><a href="admin.php"><?php echo I18N::translate('Control panel'); ?></a></li>
3668c2e8227SGreg Roach			<li><a href="admin_modules.php"><?php echo I18N::translate('Module administration'); ?></a></li>
3678c2e8227SGreg Roach			<li class="active"><?php echo $controller->getPageTitle(); ?></li>
3688c2e8227SGreg Roach		</ol>
3698c2e8227SGreg Roach		<h2><?php echo $controller->getPageTitle(); ?></h2>
3708c2e8227SGreg Roach		<p>
3718c2e8227SGreg Roach			<?php echo I18N::translate('FAQs are lists of questions and answers, which allow you to explain the site’s rules, policies, and procedures to your visitors.  Questions are typically concerned with privacy, copyright, user-accounts, unsuitable content, requirement for source-citations, etc.'); ?>
3728c2e8227SGreg Roach			<?php echo I18N::translate('You may use HTML to format the answer and to add links to other websites.'); ?>
3738c2e8227SGreg Roach		</p>
3748c2e8227SGreg Roach		<?php
3758c2e8227SGreg Roach
3768c2e8227SGreg Roach		echo
3778c2e8227SGreg Roach			'<p><form>',
3788c2e8227SGreg Roach			I18N::translate('Family tree'), ' ',
3798c2e8227SGreg Roach			'<input type="hidden" name="mod", value="', $this->getName(), '">',
3808c2e8227SGreg Roach			'<input type="hidden" name="mod_action" value="admin_config">',
38124ec66ceSGreg Roach			select_edit_control('ged', Tree::getNameList(), null, $WT_TREE->getNameHtml()),
3828c2e8227SGreg Roach			'<input type="submit" value="', I18N::translate('show'), '">',
3838c2e8227SGreg Roach			'</form></p>';
3848c2e8227SGreg Roach
3858c2e8227SGreg Roach		echo '<a href="module.php?mod=', $this->getName(), '&amp;mod_action=admin_edit">', I18N::translate('Add an FAQ item'), '</a>';
3868c2e8227SGreg Roach
3878c2e8227SGreg Roach		echo '<table id="faq_edit">';
3888c2e8227SGreg Roach		if (empty($faqs)) {
3898c2e8227SGreg Roach			echo '<tr><td class="error center" colspan="5">', I18N::translate('The FAQ list is empty.'), '</td></tr></table>';
3908c2e8227SGreg Roach		} else {
3918c2e8227SGreg Roach			foreach ($faqs as $faq) {
3928c2e8227SGreg Roach				// NOTE: Print the position of the current item
3938c2e8227SGreg Roach				echo '<tr class="faq_edit_pos"><td>';
3948c2e8227SGreg Roach				echo I18N::translate('Position item'), ': ', ($faq->block_order + 1), ', ';
3958c2e8227SGreg Roach				if ($faq->gedcom_id == null) {
3968c2e8227SGreg Roach					echo I18N::translate('All');
3978c2e8227SGreg Roach				} else {
398*f306ecacSDavid Drury					echo $WT_TREE->getTitleHtml();
3998c2e8227SGreg Roach				}
4008c2e8227SGreg Roach				echo '</td>';
4018c2e8227SGreg Roach				// NOTE: Print the edit options of the current item
4028c2e8227SGreg Roach				echo '<td>';
4038c2e8227SGreg Roach				if ($faq->block_order == $min_block_order) {
4048c2e8227SGreg Roach					echo '&nbsp;';
4058c2e8227SGreg Roach				} else {
4068c2e8227SGreg Roach					echo '<a href="module.php?mod=', $this->getName(), '&amp;mod_action=admin_moveup&amp;block_id=', $faq->block_id, '" class="icon-uarrow"></a>';
4078c2e8227SGreg Roach				}
4088c2e8227SGreg Roach				echo '</td><td>';
4098c2e8227SGreg Roach				if ($faq->block_order == $max_block_order) {
4108c2e8227SGreg Roach					echo '&nbsp;';
4118c2e8227SGreg Roach				} else {
4128c2e8227SGreg Roach					echo '<a href="module.php?mod=', $this->getName(), '&amp;mod_action=admin_movedown&amp;block_id=', $faq->block_id, '" class="icon-darrow"></a>';
4138c2e8227SGreg Roach				}
4148c2e8227SGreg Roach				echo '</td><td>';
4158c2e8227SGreg Roach				echo '<a href="module.php?mod=', $this->getName(), '&amp;mod_action=admin_edit&amp;block_id=', $faq->block_id, '">', I18N::translate('Edit'), '</a>';
4168c2e8227SGreg Roach				echo '</td><td>';
4178c2e8227SGreg Roach				echo '<a href="module.php?mod=', $this->getName(), '&amp;mod_action=admin_delete&amp;block_id=', $faq->block_id, '" onclick="return confirm(\'', I18N::translate('Are you sure you want to delete this FAQ entry?'), '\');">', I18N::translate('Delete'), '</a>';
4188c2e8227SGreg Roach				echo '</td></tr>';
4198c2e8227SGreg Roach				// NOTE: Print the title text of the current item
4208c2e8227SGreg Roach				echo '<tr><td colspan="5">';
4218c2e8227SGreg Roach				echo '<div class="faq_edit_item">';
4228c2e8227SGreg Roach				echo '<div class="faq_edit_title">', $faq->header, '</div>';
4238c2e8227SGreg Roach				// NOTE: Print the body text of the current item
4248c2e8227SGreg Roach				echo '<div class="faq_edit_content">', substr($faq->faqbody, 0, 1) == '<' ? $faq->faqbody : nl2br($faq->faqbody, false), '</div></div></td></tr>';
4258c2e8227SGreg Roach			}
4268c2e8227SGreg Roach			echo '</table>';
4278c2e8227SGreg Roach		}
4288c2e8227SGreg Roach	}
4298c2e8227SGreg Roach
4308c2e8227SGreg Roach	/** {@inheritdoc} */
4318c2e8227SGreg Roach	public function defaultMenuOrder() {
4328c2e8227SGreg Roach		return 40;
4338c2e8227SGreg Roach	}
4348c2e8227SGreg Roach
4358c2e8227SGreg Roach	/** {@inheritdoc} */
4368c2e8227SGreg Roach	public function getMenu() {
43724ec66ceSGreg Roach		global $WT_TREE;
43824ec66ceSGreg Roach
4398c2e8227SGreg Roach		if (Auth::isSearchEngine()) {
4408c2e8227SGreg Roach			return null;
4418c2e8227SGreg Roach		}
4428c2e8227SGreg Roach
4438c2e8227SGreg Roach		$faqs = Database::prepare(
4448c2e8227SGreg Roach			"SELECT block_id FROM `##block` WHERE module_name = :module_name AND IFNULL(gedcom_id, :tree_id_1) = :tree_id_2"
4458c2e8227SGreg Roach		)->execute(array(
4468c2e8227SGreg Roach			'module_name' => $this->getName(),
44724ec66ceSGreg Roach			'tree_id_1'   => $WT_TREE->getTreeId(),
44824ec66ceSGreg Roach			'tree_id_2'   => $WT_TREE->getTreeId(),
4498c2e8227SGreg Roach		))->fetchAll();
4508c2e8227SGreg Roach
4518c2e8227SGreg Roach		if (!$faqs) {
4528c2e8227SGreg Roach			return null;
4538c2e8227SGreg Roach		}
4548c2e8227SGreg Roach
4558c2e8227SGreg Roach		$menu = new Menu(I18N::translate('FAQ'), 'module.php?mod=faq&amp;mod_action=show', 'menu-help');
4568c2e8227SGreg Roach
4578c2e8227SGreg Roach		return $menu;
4588c2e8227SGreg Roach	}
4598c2e8227SGreg Roach}
460