18c2e8227SGreg Roach<?php 23976b470SGreg Roach 38c2e8227SGreg Roach/** 48c2e8227SGreg Roach * webtrees: online genealogy 58fcd0d32SGreg Roach * Copyright (C) 2019 webtrees development team 68c2e8227SGreg Roach * This program is free software: you can redistribute it and/or modify 78c2e8227SGreg Roach * it under the terms of the GNU General Public License as published by 88c2e8227SGreg Roach * the Free Software Foundation, either version 3 of the License, or 98c2e8227SGreg Roach * (at your option) any later version. 108c2e8227SGreg Roach * This program is distributed in the hope that it will be useful, 118c2e8227SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 128c2e8227SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 138c2e8227SGreg Roach * GNU General Public License for more details. 148c2e8227SGreg Roach * You should have received a copy of the GNU General Public License 158c2e8227SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>. 168c2e8227SGreg Roach */ 17fcfa147eSGreg Roach 18e7f56f2aSGreg Roachdeclare(strict_types=1); 19e7f56f2aSGreg Roach 2076692c8bSGreg Roachnamespace Fisharebest\Webtrees\Module; 2176692c8bSGreg Roach 221d1f373cSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ControlPanel; 230e62c4b8SGreg Roachuse Fisharebest\Webtrees\I18N; 240e62c4b8SGreg Roachuse Fisharebest\Webtrees\Menu; 2550d6f48cSGreg Roachuse Fisharebest\Webtrees\Services\HtmlService; 261d1f373cSGreg Roachuse Fisharebest\Webtrees\Services\TreeService; 270e62c4b8SGreg Roachuse Fisharebest\Webtrees\Tree; 2877654037SGreg Roachuse Illuminate\Database\Capsule\Manager as DB; 2977654037SGreg Roachuse Illuminate\Database\Query\Builder; 3077654037SGreg Roachuse Illuminate\Support\Collection; 316ccdf4f0SGreg Roachuse Psr\Http\Message\ResponseInterface; 326ccdf4f0SGreg Roachuse Psr\Http\Message\ServerRequestInterface; 338de50a4eSGreg Roachuse stdClass; 34f3874e19SGreg Roach 355229eadeSGreg Roachuse function assert; 361d1f373cSGreg Roachuse function redirect; 371d1f373cSGreg Roachuse function route; 388c2e8227SGreg Roach 398c2e8227SGreg Roach/** 408c2e8227SGreg Roach * Class FrequentlyAskedQuestionsModule 418c2e8227SGreg Roach */ 4237eb8894SGreg Roachclass FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleConfigInterface, ModuleMenuInterface 43c1010edaSGreg Roach{ 4449a243cbSGreg Roach use ModuleConfigTrait; 4549a243cbSGreg Roach use ModuleMenuTrait; 4649a243cbSGreg Roach 4750d6f48cSGreg Roach /** @var HtmlService */ 4850d6f48cSGreg Roach private $html_service; 4950d6f48cSGreg Roach 501d1f373cSGreg Roach /** @var TreeService */ 511d1f373cSGreg Roach private $tree_service; 521d1f373cSGreg Roach 5350d6f48cSGreg Roach /** 541d1f373cSGreg Roach * BatchUpdateModule constructor. 5550d6f48cSGreg Roach * 5650d6f48cSGreg Roach * @param HtmlService $html_service 571d1f373cSGreg Roach * @param TreeService $tree_service 5850d6f48cSGreg Roach */ 591d1f373cSGreg Roach public function __construct(HtmlService $html_service, TreeService $tree_service) 6050d6f48cSGreg Roach { 6150d6f48cSGreg Roach $this->html_service = $html_service; 621d1f373cSGreg Roach $this->tree_service = $tree_service; 6350d6f48cSGreg Roach } 6450d6f48cSGreg Roach 65961ec755SGreg Roach /** 660cfd6963SGreg Roach * How should this module be identified in the control panel, etc.? 67961ec755SGreg Roach * 68961ec755SGreg Roach * @return string 69961ec755SGreg Roach */ 7049a243cbSGreg Roach public function title(): string 71c1010edaSGreg Roach { 72bbb76c12SGreg Roach /* I18N: Name of a module. Abbreviation for “Frequently Asked Questions” */ 73bbb76c12SGreg Roach return I18N::translate('FAQ'); 748c2e8227SGreg Roach } 758c2e8227SGreg Roach 76961ec755SGreg Roach /** 77961ec755SGreg Roach * A sentence describing what this module does. 78961ec755SGreg Roach * 79961ec755SGreg Roach * @return string 80961ec755SGreg Roach */ 8149a243cbSGreg Roach public function description(): string 82c1010edaSGreg Roach { 83bbb76c12SGreg Roach /* I18N: Description of the “FAQ” module */ 84bbb76c12SGreg Roach return I18N::translate('A list of frequently asked questions and answers.'); 858c2e8227SGreg Roach } 868c2e8227SGreg Roach 8776692c8bSGreg Roach /** 8849a243cbSGreg Roach * The default position for this menu. It can be changed in the control panel. 890ee13198SGreg Roach * 900ee13198SGreg Roach * @return int 910ee13198SGreg Roach */ 928f53f488SRico Sonntag public function defaultMenuOrder(): int 93c1010edaSGreg Roach { 94353b36abSGreg Roach return 8; 958c2e8227SGreg Roach } 968c2e8227SGreg Roach 970ee13198SGreg Roach /** 980ee13198SGreg Roach * A menu, to be added to the main application menu. 990ee13198SGreg Roach * 100aee13b6dSGreg Roach * @param Tree $tree 101aee13b6dSGreg Roach * 1020ee13198SGreg Roach * @return Menu|null 1030ee13198SGreg Roach */ 10446295629SGreg Roach public function getMenu(Tree $tree): ?Menu 105c1010edaSGreg Roach { 10665cf5706SGreg Roach if ($this->faqsExist($tree, I18N::languageTag())) { 10749a243cbSGreg Roach return new Menu($this->title(), route('module', [ 10826684e68SGreg Roach 'module' => $this->name(), 109c1010edaSGreg Roach 'action' => 'Show', 1109022ab66SGreg Roach 'tree' => $tree->name(), 11108362db4SGreg Roach ]), 'menu-faq'); 1128c2e8227SGreg Roach } 113b2ce94c6SRico Sonntag 114b2ce94c6SRico Sonntag return null; 1158c2e8227SGreg Roach } 116aee13b6dSGreg Roach 117aee13b6dSGreg Roach /** 11857ab2231SGreg Roach * @param ServerRequestInterface $request 119aee13b6dSGreg Roach * 1206ccdf4f0SGreg Roach * @return ResponseInterface 121aee13b6dSGreg Roach */ 12257ab2231SGreg Roach public function getAdminAction(ServerRequestInterface $request): ResponseInterface 123c1010edaSGreg Roach { 124aee13b6dSGreg Roach $this->layout = 'layouts/administration'; 125aee13b6dSGreg Roach 1261d1f373cSGreg Roach // This module can't run without a tree 127e218f363SGreg Roach $tree = $request->getAttribute('tree'); 128e218f363SGreg Roach 1291d1f373cSGreg Roach if (!$tree instanceof Tree) { 130e218f363SGreg Roach $tree = $this->tree_service->all()->first(); 131e218f363SGreg Roach if ($tree instanceof Tree) { 132e218f363SGreg Roach return redirect(route('module', ['module' => $this->name(), 'action' => 'Admin', 'tree' => $tree->name()])); 133e218f363SGreg Roach } 134e218f363SGreg Roach 1351d1f373cSGreg Roach return redirect(route(ControlPanel::class)); 1361d1f373cSGreg Roach } 1375229eadeSGreg Roach 13826348dcdSGreg Roach $faqs = $this->faqsForTree($tree); 139aee13b6dSGreg Roach 14077654037SGreg Roach $min_block_order = DB::table('block') 14126684e68SGreg Roach ->where('module_name', '=', $this->name()) 1420b5fd0a6SGreg Roach ->where(static function (Builder $query) use ($tree): void { 14377654037SGreg Roach $query 14477654037SGreg Roach ->whereNull('gedcom_id') 14577654037SGreg Roach ->orWhere('gedcom_id', '=', $tree->id()); 14677654037SGreg Roach }) 14777654037SGreg Roach ->min('block_order'); 148aee13b6dSGreg Roach 14977654037SGreg Roach $max_block_order = DB::table('block') 15026684e68SGreg Roach ->where('module_name', '=', $this->name()) 1510b5fd0a6SGreg Roach ->where(static function (Builder $query) use ($tree): void { 15277654037SGreg Roach $query 15377654037SGreg Roach ->whereNull('gedcom_id') 15477654037SGreg Roach ->orWhere('gedcom_id', '=', $tree->id()); 15577654037SGreg Roach }) 15677654037SGreg Roach ->max('block_order'); 157aee13b6dSGreg Roach 158cc13d6d8SGreg Roach $title = I18N::translate('Frequently asked questions') . ' — ' . $tree->title(); 159aee13b6dSGreg Roach 160aee13b6dSGreg Roach return $this->viewResponse('modules/faq/config', [ 16183615acfSGreg Roach 'action' => route('module', ['module' => $this->name(), 'action' => 'Admin']), 162aee13b6dSGreg Roach 'faqs' => $faqs, 163aee13b6dSGreg Roach 'max_block_order' => $max_block_order, 164aee13b6dSGreg Roach 'min_block_order' => $min_block_order, 16571378461SGreg Roach 'module' => $this->name(), 166aee13b6dSGreg Roach 'title' => $title, 167aee13b6dSGreg Roach 'tree' => $tree, 1681e653452SGreg Roach 'tree_names' => $this->tree_service->titles(), 169aee13b6dSGreg Roach ]); 170aee13b6dSGreg Roach } 171aee13b6dSGreg Roach 172aee13b6dSGreg Roach /** 1736ccdf4f0SGreg Roach * @param ServerRequestInterface $request 174aee13b6dSGreg Roach * 1756ccdf4f0SGreg Roach * @return ResponseInterface 176aee13b6dSGreg Roach */ 177e218f363SGreg Roach public function postAdminAction(ServerRequestInterface $request): ResponseInterface 178e218f363SGreg Roach { 179e218f363SGreg Roach return redirect(route('module', [ 180e218f363SGreg Roach 'module' => $this->name(), 181e218f363SGreg Roach 'action' => 'Admin', 182e218f363SGreg Roach 'tree' => $request->getParsedBody()['tree'] ?? '', 183e218f363SGreg Roach ])); 184e218f363SGreg Roach } 185e218f363SGreg Roach 186e218f363SGreg Roach /** 187e218f363SGreg Roach * @param ServerRequestInterface $request 188e218f363SGreg Roach * 189e218f363SGreg Roach * @return ResponseInterface 190e218f363SGreg Roach */ 19157ab2231SGreg Roach public function postAdminDeleteAction(ServerRequestInterface $request): ResponseInterface 192c1010edaSGreg Roach { 193eb235819SGreg Roach $block_id = (int) $request->getQueryParams()['block_id']; 194aee13b6dSGreg Roach 19577654037SGreg Roach DB::table('block_setting')->where('block_id', '=', $block_id)->delete(); 196aee13b6dSGreg Roach 19777654037SGreg Roach DB::table('block')->where('block_id', '=', $block_id)->delete(); 198aee13b6dSGreg Roach 199c1010edaSGreg Roach $url = route('module', [ 20026684e68SGreg Roach 'module' => $this->name(), 201c1010edaSGreg Roach 'action' => 'Admin', 202c1010edaSGreg Roach ]); 203aee13b6dSGreg Roach 2046ccdf4f0SGreg Roach return redirect($url); 205aee13b6dSGreg Roach } 206aee13b6dSGreg Roach 207aee13b6dSGreg Roach /** 2086ccdf4f0SGreg Roach * @param ServerRequestInterface $request 209aee13b6dSGreg Roach * 2106ccdf4f0SGreg Roach * @return ResponseInterface 211aee13b6dSGreg Roach */ 21257ab2231SGreg Roach public function postAdminMoveDownAction(ServerRequestInterface $request): ResponseInterface 213c1010edaSGreg Roach { 214eb235819SGreg Roach $block_id = (int) $request->getQueryParams()['block_id']; 215aee13b6dSGreg Roach 21677654037SGreg Roach $block_order = DB::table('block') 21777654037SGreg Roach ->where('block_id', '=', $block_id) 21877654037SGreg Roach ->value('block_order'); 219aee13b6dSGreg Roach 22077654037SGreg Roach $swap_block = DB::table('block') 22126684e68SGreg Roach ->where('module_name', '=', $this->name()) 22277654037SGreg Roach ->where('block_order', '>', $block_order) 2231d1f373cSGreg Roach ->orderBy('block_order', 'asc') 22477654037SGreg Roach ->first(); 225aee13b6dSGreg Roach 2261d1f373cSGreg Roach if ($block_order !== null && $swap_block !== null) { 22777654037SGreg Roach DB::table('block') 22877654037SGreg Roach ->where('block_id', '=', $block_id) 22977654037SGreg Roach ->update([ 230aee13b6dSGreg Roach 'block_order' => $swap_block->block_order, 231aee13b6dSGreg Roach ]); 23277654037SGreg Roach 23377654037SGreg Roach DB::table('block') 23477654037SGreg Roach ->where('block_id', '=', $swap_block->block_id) 23577654037SGreg Roach ->update([ 236aee13b6dSGreg Roach 'block_order' => $block_order, 237aee13b6dSGreg Roach ]); 238aee13b6dSGreg Roach } 239aee13b6dSGreg Roach 2401d1f373cSGreg Roach return response(); 241aee13b6dSGreg Roach } 242aee13b6dSGreg Roach 243aee13b6dSGreg Roach /** 2446ccdf4f0SGreg Roach * @param ServerRequestInterface $request 245aee13b6dSGreg Roach * 2466ccdf4f0SGreg Roach * @return ResponseInterface 247aee13b6dSGreg Roach */ 24857ab2231SGreg Roach public function postAdminMoveUpAction(ServerRequestInterface $request): ResponseInterface 249c1010edaSGreg Roach { 250eb235819SGreg Roach $block_id = (int) $request->getQueryParams()['block_id']; 251aee13b6dSGreg Roach 25277654037SGreg Roach $block_order = DB::table('block') 25377654037SGreg Roach ->where('block_id', '=', $block_id) 25477654037SGreg Roach ->value('block_order'); 255aee13b6dSGreg Roach 25677654037SGreg Roach $swap_block = DB::table('block') 25726684e68SGreg Roach ->where('module_name', '=', $this->name()) 25877654037SGreg Roach ->where('block_order', '<', $block_order) 2591d1f373cSGreg Roach ->orderBy('block_order', 'desc') 26077654037SGreg Roach ->first(); 261aee13b6dSGreg Roach 2621d1f373cSGreg Roach if ($block_order !== null && $swap_block !== null) { 26377654037SGreg Roach DB::table('block') 26477654037SGreg Roach ->where('block_id', '=', $block_id) 26577654037SGreg Roach ->update([ 266aee13b6dSGreg Roach 'block_order' => $swap_block->block_order, 267aee13b6dSGreg Roach ]); 26877654037SGreg Roach 26977654037SGreg Roach DB::table('block') 27077654037SGreg Roach ->where('block_id', '=', $swap_block->block_id) 27177654037SGreg Roach ->update([ 272aee13b6dSGreg Roach 'block_order' => $block_order, 273aee13b6dSGreg Roach ]); 274aee13b6dSGreg Roach } 275aee13b6dSGreg Roach 2761d1f373cSGreg Roach return response(); 277aee13b6dSGreg Roach } 278aee13b6dSGreg Roach 279aee13b6dSGreg Roach /** 2806ccdf4f0SGreg Roach * @param ServerRequestInterface $request 281aee13b6dSGreg Roach * 2826ccdf4f0SGreg Roach * @return ResponseInterface 283aee13b6dSGreg Roach */ 28457ab2231SGreg Roach public function getAdminEditAction(ServerRequestInterface $request): ResponseInterface 285c1010edaSGreg Roach { 286aee13b6dSGreg Roach $this->layout = 'layouts/administration'; 287aee13b6dSGreg Roach 288eb235819SGreg Roach $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); 289aee13b6dSGreg Roach 290aee13b6dSGreg Roach if ($block_id === 0) { 291aee13b6dSGreg Roach // Creating a new faq 292aee13b6dSGreg Roach $header = ''; 2931e653452SGreg Roach $body = ''; 2941e653452SGreg Roach $gedcom_id = null; 2951e653452SGreg Roach $block_order = 1 + (int) DB::table('block')->where('module_name', '=', $this->name())->max('block_order'); 29677654037SGreg Roach 297aee13b6dSGreg Roach $languages = []; 298aee13b6dSGreg Roach 299aee13b6dSGreg Roach $title = I18N::translate('Add an FAQ'); 300aee13b6dSGreg Roach } else { 301aee13b6dSGreg Roach // Editing an existing faq 302aee13b6dSGreg Roach $header = $this->getBlockSetting($block_id, 'header'); 3031e653452SGreg Roach $body = $this->getBlockSetting($block_id, 'faqbody'); 3041e653452SGreg Roach $gedcom_id = DB::table('block')->where('block_id', '=', $block_id)->value('gedcom_id'); 3051e653452SGreg Roach $block_order = DB::table('block')->where('block_id', '=', $block_id)->value('block_order'); 30677654037SGreg Roach 307aee13b6dSGreg Roach $languages = explode(',', $this->getBlockSetting($block_id, 'languages')); 308aee13b6dSGreg Roach 309aee13b6dSGreg Roach $title = I18N::translate('Edit the FAQ'); 310aee13b6dSGreg Roach } 311aee13b6dSGreg Roach 3121e653452SGreg Roach $gedcom_ids = $this->tree_service->all() 3131e653452SGreg Roach ->mapWithKeys(static function (Tree $tree): array { 3141e653452SGreg Roach return [$tree->id() => $tree->title()]; 3151e653452SGreg Roach }) 3161e653452SGreg Roach ->all(); 3171e653452SGreg Roach 3181e653452SGreg Roach $gedcom_ids = ['' => I18N::translate('All')] + $gedcom_ids; 319b6c326d8SGreg Roach 320aee13b6dSGreg Roach return $this->viewResponse('modules/faq/edit', [ 321aee13b6dSGreg Roach 'block_id' => $block_id, 322aee13b6dSGreg Roach 'block_order' => $block_order, 323aee13b6dSGreg Roach 'header' => $header, 3241e653452SGreg Roach 'body' => $body, 325aee13b6dSGreg Roach 'languages' => $languages, 326aee13b6dSGreg Roach 'title' => $title, 3271e653452SGreg Roach 'gedcom_id' => $gedcom_id, 3281e653452SGreg Roach 'gedcom_ids' => $gedcom_ids, 329aee13b6dSGreg Roach ]); 330aee13b6dSGreg Roach } 331aee13b6dSGreg Roach 332aee13b6dSGreg Roach /** 3336ccdf4f0SGreg Roach * @param ServerRequestInterface $request 334aee13b6dSGreg Roach * 3356ccdf4f0SGreg Roach * @return ResponseInterface 336aee13b6dSGreg Roach */ 33757ab2231SGreg Roach public function postAdminEditAction(ServerRequestInterface $request): ResponseInterface 338c1010edaSGreg Roach { 339eb235819SGreg Roach $block_id = (int) ($request->getQueryParams()['block_id'] ?? 0); 340eb235819SGreg Roach 341eb235819SGreg Roach $params = $request->getParsedBody(); 342eb235819SGreg Roach 3431e653452SGreg Roach $body = $params['body']; 344eb235819SGreg Roach $header = $params['header']; 345eb235819SGreg Roach $languages = $params['languages'] ?? []; 3461e653452SGreg Roach $gedcom_id = $params['gedcom_id']; 3471e653452SGreg Roach $block_order = $params['block_order']; 348aee13b6dSGreg Roach 3491e653452SGreg Roach if ($gedcom_id === '') { 3501e653452SGreg Roach $gedcom_id = null; 3511e653452SGreg Roach } 3521e653452SGreg Roach 3531e653452SGreg Roach $body = $this->html_service->sanitize($body); 35450d6f48cSGreg Roach $header = $this->html_service->sanitize($header); 35550d6f48cSGreg Roach 356aee13b6dSGreg Roach if ($block_id !== 0) { 35777654037SGreg Roach DB::table('block') 35877654037SGreg Roach ->where('block_id', '=', $block_id) 35977654037SGreg Roach ->update([ 36077654037SGreg Roach 'gedcom_id' => $gedcom_id, 36177654037SGreg Roach 'block_order' => $block_order, 362aee13b6dSGreg Roach ]); 363aee13b6dSGreg Roach } else { 36477654037SGreg Roach DB::table('block')->insert([ 36577654037SGreg Roach 'gedcom_id' => $gedcom_id, 36626684e68SGreg Roach 'module_name' => $this->name(), 36777654037SGreg Roach 'block_order' => $block_order, 368aee13b6dSGreg Roach ]); 369aee13b6dSGreg Roach 37077654037SGreg Roach $block_id = (int) DB::connection()->getPdo()->lastInsertId(); 371aee13b6dSGreg Roach } 372aee13b6dSGreg Roach 3731e653452SGreg Roach $this->setBlockSetting($block_id, 'faqbody', $body); 374aee13b6dSGreg Roach $this->setBlockSetting($block_id, 'header', $header); 375aee13b6dSGreg Roach $this->setBlockSetting($block_id, 'languages', implode(',', $languages)); 376aee13b6dSGreg Roach 377c1010edaSGreg Roach $url = route('module', [ 37826684e68SGreg Roach 'module' => $this->name(), 379c1010edaSGreg Roach 'action' => 'Admin', 380c1010edaSGreg Roach ]); 381aee13b6dSGreg Roach 3826ccdf4f0SGreg Roach return redirect($url); 383aee13b6dSGreg Roach } 384aee13b6dSGreg Roach 385b998dbceSGreg Roach /** 38657ab2231SGreg Roach * @param ServerRequestInterface $request 387b998dbceSGreg Roach * 3886ccdf4f0SGreg Roach * @return ResponseInterface 389b998dbceSGreg Roach */ 39057ab2231SGreg Roach public function getShowAction(ServerRequestInterface $request): ResponseInterface 391c1010edaSGreg Roach { 39257ab2231SGreg Roach $tree = $request->getAttribute('tree'); 39375964c75SGreg Roach assert($tree instanceof Tree); 39457ab2231SGreg Roach 3958de50a4eSGreg Roach // Filter foreign languages. 39677654037SGreg Roach $faqs = $this->faqsForTree($tree) 39765cf5706SGreg Roach ->filter(static function (stdClass $faq): bool { 39865cf5706SGreg Roach return $faq->languages === '' || in_array(I18N::languageTag(), explode(',', $faq->languages), true); 3998de50a4eSGreg Roach }); 400aee13b6dSGreg Roach 401aee13b6dSGreg Roach return $this->viewResponse('modules/faq/show', [ 4028de50a4eSGreg Roach 'faqs' => $faqs, 403aee13b6dSGreg Roach 'title' => I18N::translate('Frequently asked questions'), 4048de50a4eSGreg Roach 'tree' => $tree, 405aee13b6dSGreg Roach ]); 406aee13b6dSGreg Roach } 40777654037SGreg Roach 40877654037SGreg Roach /** 40977654037SGreg Roach * @param Tree $tree 41077654037SGreg Roach * 411*b5c8fd7eSGreg Roach * @return Collection<stdClass> 41277654037SGreg Roach */ 41377654037SGreg Roach private function faqsForTree(Tree $tree): Collection 41477654037SGreg Roach { 41577654037SGreg Roach return DB::table('block') 41677654037SGreg Roach ->join('block_setting AS bs1', 'bs1.block_id', '=', 'block.block_id') 41777654037SGreg Roach ->join('block_setting AS bs2', 'bs2.block_id', '=', 'block.block_id') 41877654037SGreg Roach ->join('block_setting AS bs3', 'bs3.block_id', '=', 'block.block_id') 41926684e68SGreg Roach ->where('module_name', '=', $this->name()) 42077654037SGreg Roach ->where('bs1.setting_name', '=', 'header') 42177654037SGreg Roach ->where('bs2.setting_name', '=', 'faqbody') 42277654037SGreg Roach ->where('bs3.setting_name', '=', 'languages') 4230b5fd0a6SGreg Roach ->where(static function (Builder $query) use ($tree): void { 42477654037SGreg Roach $query 42577654037SGreg Roach ->whereNull('gedcom_id') 42677654037SGreg Roach ->orWhere('gedcom_id', '=', $tree->id()); 42777654037SGreg Roach }) 42877654037SGreg Roach ->orderBy('block_order') 42977654037SGreg Roach ->select(['block.block_id', 'block_order', 'gedcom_id', 'bs1.setting_value AS header', 'bs2.setting_value AS faqbody', 'bs3.setting_value AS languages']) 43077654037SGreg Roach ->get(); 43177654037SGreg Roach } 43277654037SGreg Roach 43377654037SGreg Roach /** 43477654037SGreg Roach * @param Tree $tree 43577654037SGreg Roach * @param string $language 43677654037SGreg Roach * 43777654037SGreg Roach * @return bool 43877654037SGreg Roach */ 43977654037SGreg Roach private function faqsExist(Tree $tree, string $language): bool 44077654037SGreg Roach { 44177654037SGreg Roach return DB::table('block') 44277654037SGreg Roach ->join('block_setting', 'block_setting.block_id', '=', 'block.block_id') 44326684e68SGreg Roach ->where('module_name', '=', $this->name()) 44477654037SGreg Roach ->where('setting_name', '=', 'languages') 4450b5fd0a6SGreg Roach ->where(static function (Builder $query) use ($tree): void { 44677654037SGreg Roach $query 44777654037SGreg Roach ->whereNull('gedcom_id') 44877654037SGreg Roach ->orWhere('gedcom_id', '=', $tree->id()); 44977654037SGreg Roach }) 45077654037SGreg Roach ->select(['setting_value AS languages']) 45177654037SGreg Roach ->get() 4520b5fd0a6SGreg Roach ->filter(static function (stdClass $faq) use ($language): bool { 4530b5fd0a6SGreg Roach return $faq->languages === '' || in_array($language, explode(',', $faq->languages), true); 45477654037SGreg Roach }) 45577654037SGreg Roach ->isNotEmpty(); 45677654037SGreg Roach } 4578c2e8227SGreg Roach} 458