18c2e8227SGreg Roach<?php 20e62c4b8SGreg Roachnamespace Fisharebest\Webtrees\Module; 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 */ 180e62c4b8SGreg Roachuse Fisharebest\Webtrees\Auth; 190e62c4b8SGreg Roachuse Fisharebest\Webtrees\Family; 20*3d7a8a4cSGreg Roachuse Fisharebest\Webtrees\Functions\Functions; 210e62c4b8SGreg Roachuse Fisharebest\Webtrees\I18N; 220e62c4b8SGreg Roachuse Fisharebest\Webtrees\Individual; 230e62c4b8SGreg Roachuse Fisharebest\Webtrees\Menu; 248c2e8227SGreg Roach 258c2e8227SGreg Roach/** 268c2e8227SGreg Roach * Class FamilyNavigatorModule 278c2e8227SGreg Roach */ 28e2a378d3SGreg Roachclass FamilyNavigatorModule extends AbstractModule implements ModuleSidebarInterface { 298c2e8227SGreg Roach const TTL = "<div class='flyout2'>%s</div>"; 308c2e8227SGreg Roach const LNK = "<div class='flyout3' data-href='%s'>%s</div>"; 318c2e8227SGreg Roach const MSG = "<div class='flyout4'>(%s)</div>"; // class flyout4 not used in standard themes 328c2e8227SGreg Roach 338c2e8227SGreg Roach /** {@inheritdoc} */ 348c2e8227SGreg Roach public function getTitle() { 358c2e8227SGreg Roach return /* I18N: Name of a module/sidebar */ I18N::translate('Family navigator'); 368c2e8227SGreg Roach } 378c2e8227SGreg Roach 388c2e8227SGreg Roach /** {@inheritdoc} */ 398c2e8227SGreg Roach public function getDescription() { 408c2e8227SGreg Roach return /* I18N: Description of the “Family navigator” module */ I18N::translate('A sidebar showing an individual’s close families and relatives.'); 418c2e8227SGreg Roach } 428c2e8227SGreg Roach 438c2e8227SGreg Roach /** {@inheritdoc} */ 448c2e8227SGreg Roach public function defaultSidebarOrder() { 458c2e8227SGreg Roach return 20; 468c2e8227SGreg Roach } 478c2e8227SGreg Roach 488c2e8227SGreg Roach /** {@inheritdoc} */ 498c2e8227SGreg Roach public function hasSidebarContent() { 508c2e8227SGreg Roach return !Auth::isSearchEngine(); 518c2e8227SGreg Roach } 528c2e8227SGreg Roach 538c2e8227SGreg Roach /** {@inheritdoc} */ 548c2e8227SGreg Roach public function getSidebarAjaxContent() { 558c2e8227SGreg Roach return ''; 568c2e8227SGreg Roach } 578c2e8227SGreg Roach 588c2e8227SGreg Roach /** {@inheritdoc} */ 598c2e8227SGreg Roach public function getSidebarContent() { 608c2e8227SGreg Roach global $controller; 618c2e8227SGreg Roach 628c2e8227SGreg Roach $controller->addInlineJavascript(' 638c2e8227SGreg Roach jQuery("#sb_family_nav_content") 648c2e8227SGreg Roach .on("click", ".flyout a", function() { 658c2e8227SGreg Roach return false; 668c2e8227SGreg Roach }) 678c2e8227SGreg Roach .on("click", ".flyout3", function() { 688c2e8227SGreg Roach window.location.href = jQuery(this).data("href"); 698c2e8227SGreg Roach return false; 708c2e8227SGreg Roach }); 718c2e8227SGreg Roach '); 728c2e8227SGreg Roach 738c2e8227SGreg Roach ob_start(); 748c2e8227SGreg Roach 758c2e8227SGreg Roach ?> 768c2e8227SGreg Roach <div id="sb_family_nav_content"> 778c2e8227SGreg Roach <table class="nav_content"> 788c2e8227SGreg Roach 798c2e8227SGreg Roach <?php 808c2e8227SGreg Roach //-- parent families ------------------------------------------------------------- 818c2e8227SGreg Roach foreach ($controller->record->getChildFamilies() as $family) { 828c2e8227SGreg Roach $this->drawFamily($family, $controller->record->getChildFamilyLabel($family)); 838c2e8227SGreg Roach } 848c2e8227SGreg Roach //-- step parents ---------------------------------------------------------------- 858c2e8227SGreg Roach foreach ($controller->record->getChildStepFamilies() as $family) { 868c2e8227SGreg Roach $this->drawFamily($family, $controller->record->getStepFamilyLabel($family)); 878c2e8227SGreg Roach } 888c2e8227SGreg Roach //-- spouse and children -------------------------------------------------- 898c2e8227SGreg Roach foreach ($controller->record->getSpouseFamilies() as $family) { 90268bcb45SGreg Roach $this->drawFamily($family, $controller->getSpouseFamilyLabel($family, $controller->record)); 918c2e8227SGreg Roach } 928c2e8227SGreg Roach //-- step children ---------------------------------------------------------------- 938c2e8227SGreg Roach foreach ($controller->record->getSpouseStepFamilies() as $family) { 948c2e8227SGreg Roach $this->drawFamily($family, $family->getFullName()); 958c2e8227SGreg Roach } 968c2e8227SGreg Roach ?> 978c2e8227SGreg Roach </table> 988c2e8227SGreg Roach </div> 998c2e8227SGreg Roach <?php 1008c2e8227SGreg Roach 1018c2e8227SGreg Roach return ob_get_clean(); 1028c2e8227SGreg Roach } 1038c2e8227SGreg Roach 1048c2e8227SGreg Roach /** 1058c2e8227SGreg Roach * @param Family $family 1068c2e8227SGreg Roach * @param string $title 1078c2e8227SGreg Roach */ 1088c2e8227SGreg Roach private function drawFamily(Family $family, $title) { 1093bb191c1SGreg Roach global $controller; 1108c2e8227SGreg Roach 1118c2e8227SGreg Roach ?> 1128c2e8227SGreg Roach <tr> 1138c2e8227SGreg Roach <td class="center" colspan="2"> 1148c2e8227SGreg Roach <a class="famnav_title" href="<?php echo $family->getHtmlUrl(); ?>"> 1158c2e8227SGreg Roach <?php echo $title; ?> 1168c2e8227SGreg Roach </a> 1178c2e8227SGreg Roach </td> 1188c2e8227SGreg Roach </tr> 1198c2e8227SGreg Roach <?php 1203bb191c1SGreg Roach foreach ($family->getSpouses() as $spouse) { 121*3d7a8a4cSGreg Roach $menu = new Menu(Functions::getCloseRelationshipName($controller->record, $spouse)); 1228c2e8227SGreg Roach $menu->addClass('', 'submenu flyout'); 1238c2e8227SGreg Roach $menu->addSubmenu(new Menu($this->getParents($spouse))); 1248c2e8227SGreg Roach ?> 1258c2e8227SGreg Roach <tr> 1268c2e8227SGreg Roach <td class="facts_label"> 1278c2e8227SGreg Roach <?php echo $menu->getMenu(); ?> 1288c2e8227SGreg Roach </td> 1298c2e8227SGreg Roach <td class="center <?php echo $controller->getPersonStyle($spouse); ?> nam"> 1308c2e8227SGreg Roach <a class="famnav_link" href="<?php echo $spouse->getHtmlUrl(); ?>"> 1318c2e8227SGreg Roach <?php echo $spouse->getFullName(); ?> 1328c2e8227SGreg Roach </a> 1338c2e8227SGreg Roach <div class="font9"> 1348c2e8227SGreg Roach <?php echo $spouse->getLifeSpan(); ?> 1358c2e8227SGreg Roach </div> 1368c2e8227SGreg Roach </td> 1378c2e8227SGreg Roach </tr> 1388c2e8227SGreg Roach <?php 1398c2e8227SGreg Roach } 1408c2e8227SGreg Roach 1413bb191c1SGreg Roach foreach ($family->getChildren() as $child) { 142*3d7a8a4cSGreg Roach $menu = new Menu(Functions::getCloseRelationshipName($controller->record, $child)); 1438c2e8227SGreg Roach $menu->addClass('', 'submenu flyout'); 1448c2e8227SGreg Roach $menu->addSubmenu(new Menu($this->getFamily($child))); 1458c2e8227SGreg Roach ?> 1468c2e8227SGreg Roach <tr> 1478c2e8227SGreg Roach <td class="facts_label"> 1488c2e8227SGreg Roach <?php echo $menu->getMenu(); ?> 1498c2e8227SGreg Roach </td> 1508c2e8227SGreg Roach <td class="center <?php echo $controller->getPersonStyle($child); ?> nam"> 1518c2e8227SGreg Roach <a class="famnav_link" href="<?php echo $child->getHtmlUrl(); ?>"> 1528c2e8227SGreg Roach <?php echo $child->getFullName(); ?> 1538c2e8227SGreg Roach </a> 1548c2e8227SGreg Roach <div class="font9"> 1558c2e8227SGreg Roach <?php echo $child->getLifeSpan(); ?> 1568c2e8227SGreg Roach </div> 1578c2e8227SGreg Roach </td> 1588c2e8227SGreg Roach </tr> 1598c2e8227SGreg Roach <?php 1608c2e8227SGreg Roach } 1618c2e8227SGreg Roach } 1628c2e8227SGreg Roach 1638c2e8227SGreg Roach /** 1648c2e8227SGreg Roach * @param $person 165cbc1590aSGreg Roach * @param bool $showUnknown 1668c2e8227SGreg Roach * 1678c2e8227SGreg Roach * @return string 1688c2e8227SGreg Roach */ 1698c2e8227SGreg Roach private function getHTML($person, $showUnknown = false) { 1708c2e8227SGreg Roach if ($person instanceof Individual) { 1718c2e8227SGreg Roach return sprintf(self::LNK, $person->getHtmlUrl(), $person->getFullName()); 1728c2e8227SGreg Roach } elseif ($showUnknown) { 1738c2e8227SGreg Roach return sprintf(self::MSG, I18N::translate('unknown')); 1748c2e8227SGreg Roach } else { 1758c2e8227SGreg Roach return ''; 1768c2e8227SGreg Roach } 1778c2e8227SGreg Roach } 1788c2e8227SGreg Roach 1798c2e8227SGreg Roach /** 1808c2e8227SGreg Roach * @param Individual $person 1818c2e8227SGreg Roach * 1828c2e8227SGreg Roach * @return string 1838c2e8227SGreg Roach */ 1848c2e8227SGreg Roach private function getParents(Individual $person) { 1858c2e8227SGreg Roach $father = null; 1868c2e8227SGreg Roach $mother = null; 1878c2e8227SGreg Roach $html = sprintf(self::TTL, I18N::translate('Parents')); 1888c2e8227SGreg Roach $family = $person->getPrimaryChildFamily(); 1898c2e8227SGreg Roach if (!Auth::isSearchEngine() && $person->canShowName() && $family !== null) { 1908c2e8227SGreg Roach $father = $family->getHusband(); 1918c2e8227SGreg Roach $mother = $family->getWife(); 1928c2e8227SGreg Roach $html .= $this->getHTML($father) . 1938c2e8227SGreg Roach $this->getHTML($mother); 1948c2e8227SGreg Roach 1958c2e8227SGreg Roach // Can only have a step parent if one & only one parent found at this point 1968c2e8227SGreg Roach if ($father instanceof Individual xor $mother instanceof Individual) { 1978c2e8227SGreg Roach $stepParents = ''; 1988c2e8227SGreg Roach foreach ($person->getChildStepFamilies() as $family) { 1998c2e8227SGreg Roach if (!$father instanceof Individual) { 2008c2e8227SGreg Roach $stepParents .= $this->getHTML($family->getHusband()); 2018c2e8227SGreg Roach } else { 2028c2e8227SGreg Roach $stepParents .= $this->getHTML($family->getWife()); 2038c2e8227SGreg Roach } 2048c2e8227SGreg Roach } 2058c2e8227SGreg Roach if ($stepParents) { 2068c2e8227SGreg Roach $relationship = $father instanceof Individual ? 207764a01d9SGreg Roach I18N::translateContext("father’s wife", "step-mother") : I18N::translateContext("mother’s husband", "step-father"); 2088c2e8227SGreg Roach $html .= sprintf(self::TTL, $relationship) . $stepParents; 2098c2e8227SGreg Roach } 2108c2e8227SGreg Roach } 2118c2e8227SGreg Roach } 2128c2e8227SGreg Roach if (!($father instanceof Individual || $mother instanceof Individual)) { 213764a01d9SGreg Roach $html .= sprintf(self::MSG, I18N::translateContext('unknown family', 'unknown')); 2148c2e8227SGreg Roach } 215cbc1590aSGreg Roach 2168c2e8227SGreg Roach return $html; 2178c2e8227SGreg Roach } 2188c2e8227SGreg Roach 2198c2e8227SGreg Roach /** 2208c2e8227SGreg Roach * @param Individual $person 2218c2e8227SGreg Roach * 2228c2e8227SGreg Roach * @return string 2238c2e8227SGreg Roach */ 2248c2e8227SGreg Roach private function getFamily(Individual $person) { 2258c2e8227SGreg Roach $html = ''; 2268c2e8227SGreg Roach if ($person->canShowName() && !Auth::isSearchEngine()) { 2278c2e8227SGreg Roach foreach ($person->getSpouseFamilies() as $family) { 2288c2e8227SGreg Roach $spouse = $family->getSpouse($person); 2298c2e8227SGreg Roach $html .= $this->getHTML($spouse, true); 2308c2e8227SGreg Roach $children = $family->getChildren(); 2318c2e8227SGreg Roach if (count($children) > 0) { 2328c2e8227SGreg Roach $html .= "<ul class='clist'>"; 2338c2e8227SGreg Roach foreach ($children as $child) { 2348c2e8227SGreg Roach $html .= '<li>' . $this->getHTML($child) . '</li>'; 2358c2e8227SGreg Roach } 2368c2e8227SGreg Roach $html .= '</ul>'; 2378c2e8227SGreg Roach } 2388c2e8227SGreg Roach } 2398c2e8227SGreg Roach } 2408c2e8227SGreg Roach if (!$html) { 2418c2e8227SGreg Roach $html = sprintf(self::MSG, I18N::translate('none')); 2428c2e8227SGreg Roach } 243cbc1590aSGreg Roach 2448c2e8227SGreg Roach return sprintf(self::TTL, I18N::translate('Family')) . $html; 2458c2e8227SGreg Roach } 2468c2e8227SGreg Roach 2478c2e8227SGreg Roach} 248