. */ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Controller\PageController; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\Filter; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Html; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Module\ClippingsCart\ClippingsCartController; use Fisharebest\Webtrees\Session; /** * Class ClippingsCartModule */ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface, ModuleSidebarInterface { /** {@inheritdoc} */ public function getTitle() { return /* I18N: Name of a module */ I18N::translate('Clippings cart'); } /** {@inheritdoc} */ public function getDescription() { return /* I18N: Description of the “Clippings cart” module */ I18N::translate('Select records from your family tree and save them as a GEDCOM file.'); } /** * What is the default access level for this module? * * Some modules are aimed at admins or managers, and are not generally shown to users. * * @return int */ public function defaultAccessLevel() { return Auth::PRIV_USER; } /** * This is a general purpose hook, allowing modules to respond to routes * of the form module.php?mod=FOO&mod_action=BAR * * @param string $mod_action */ public function modAction($mod_action) { switch ($mod_action) { case 'ajax': $html = $this->getSidebarAjaxContent(); header('Content-Type: text/html; charset=UTF-8'); echo $html; break; case 'index': global $controller, $WT_TREE; $MAX_PEDIGREE_GENERATIONS = $WT_TREE->getPreference('MAX_PEDIGREE_GENERATIONS'); $clip_ctrl = new ClippingsCartController; $cart = Session::get('cart'); $controller = new PageController; $controller ->setPageTitle($this->getTitle()) ->pageHeader(); echo ''; echo '
'; if (!$cart[$WT_TREE->getTreeId()]) { echo '

', I18N::translate('Family tree clippings cart'), '

'; } if ($clip_ctrl->action == 'add') { $record = GedcomRecord::getInstance($clip_ctrl->id, $WT_TREE); if ($clip_ctrl->type === 'FAM') { ?>
getFullName() ?>
getFullName()) ?>
getFullName()) ?>
type === 'INDI') { ?>



type === 'SOUR') { ?>
getTreeId()]) { if ($clip_ctrl->action != 'add') { echo '
'; echo I18N::translate('The clippings cart allows you to take extracts from this family tree and download them as a GEDCOM file.'); echo '
'; ?>
'; // -- end new lines echo I18N::translate('Your clippings cart is empty.'); echo ''; } else { // Keep track of the INDI from the parent page, otherwise it will // get lost after ajax updates $pid = Filter::get('pid', WT_REGEX_XREF); if ($clip_ctrl->action !== 'download' && $clip_ctrl->action !== 'add') { ?>






getTreeId()]) as $xref) { $record = GedcomRecord::getInstance($xref, $WT_TREE); if ($record) { switch ($record::RECORD_TYPE) { case 'INDI': $icon = 'icon-indis'; break; case 'FAM': $icon = 'icon-sfamily'; break; case 'SOUR': $icon = 'icon-source'; break; case 'REPO': $icon = 'icon-repository'; break; case 'NOTE': $icon = 'icon-note'; break; case 'OBJE': $icon = 'icon-media'; break; default: $icon = 'icon-clippings'; break; } ?>
url()), '">', $record->getFullName(), ''; ?>
record)) { $submenus[] = new Menu($this->getTitle(), 'module.php?mod=clippings&mod_action=index&ged=' . $WT_TREE->getNameUrl(), 'menu-clippings-cart', ['rel' => 'nofollow']); } if (!empty($controller->record) && $controller->record->canShow()) { $submenus[] = new Menu(I18N::translate('Add to the clippings cart'), 'module.php?mod=clippings&mod_action=index&action=add&id=' . $controller->record->getXref(), 'menu-clippings-add', ['rel' => 'nofollow']); } if ($submenus) { return new Menu($this->getTitle(), '#', 'menu-clippings', ['rel' => 'nofollow'], $submenus); } else { return new Menu($this->getTitle(), 'module.php?mod=clippings&mod_action=index&ged=' . $WT_TREE->getNameUrl(), 'menu-clippings', ['rel' => 'nofollow']); } } /** {@inheritdoc} */ public function defaultSidebarOrder() { return 60; } /** {@inheritdoc} */ public function hasSidebarContent(Individual $individual) { // Creating a controller has the side effect of initialising the cart new ClippingsCartController; return true; } /** * Load this sidebar synchronously. * * @param Individual $individual * * @return string */ public function getSidebarContent(Individual $individual) { global $controller; $controller->addInlineJavascript(' $("#sb_clippings_content").on("click", ".add_cart, .remove_cart", function() { $("#sb_clippings_content").load(this.href); return false; }); '); return '
' . $this->getCartList() . '
'; } /** {@inheritdoc} */ public function getSidebarAjaxContent() { global $WT_TREE; $cart = Session::get('cart'); $clip_ctrl = new ClippingsCartController; $add = Filter::get('add', WT_REGEX_XREF); $add1 = Filter::get('add1', WT_REGEX_XREF); $remove = Filter::get('remove', WT_REGEX_XREF); $others = Filter::get('others'); $clip_ctrl->level1 = Filter::getInteger('level1'); $clip_ctrl->level2 = Filter::getInteger('level2'); $clip_ctrl->level3 = Filter::getInteger('level3'); if ($add) { $record = GedcomRecord::getInstance($add, $WT_TREE); if ($record) { $clip_ctrl->id = $record->getXref(); $clip_ctrl->type = $record::RECORD_TYPE; $clip_ctrl->addClipping($record); } } elseif ($add1) { $record = Individual::getInstance($add1, $WT_TREE); if ($record) { $clip_ctrl->id = $record->getXref(); $clip_ctrl->type = $record::RECORD_TYPE; if ($others == 'parents') { foreach ($record->getChildFamilies() as $family) { $clip_ctrl->addClipping($family); $clip_ctrl->addFamilyMembers($family); } } elseif ($others == 'ancestors') { $clip_ctrl->addAncestorsToCart($record, $clip_ctrl->level1); } elseif ($others == 'ancestorsfamilies') { $clip_ctrl->addAncestorsToCartFamilies($record, $clip_ctrl->level2); } elseif ($others == 'members') { foreach ($record->getSpouseFamilies() as $family) { $clip_ctrl->addClipping($family); $clip_ctrl->addFamilyMembers($family); } } elseif ($others == 'descendants') { foreach ($record->getSpouseFamilies() as $family) { $clip_ctrl->addClipping($family); $clip_ctrl->addFamilyDescendancy($family, $clip_ctrl->level3); } } } } elseif ($remove) { unset($cart[$WT_TREE->getTreeId()][$remove]); Session::put('cart', $cart); } elseif (isset($_REQUEST['empty'])) { $cart[$WT_TREE->getTreeId()] = []; Session::put('cart', $cart); } elseif (isset($_REQUEST['download'])) { return $this->downloadForm(); } return $this->getCartList(); } /** * A list for the side bar. * * @return string */ public function getCartList() { global $WT_TREE; $cart = Session::get('cart', []); if (!array_key_exists($WT_TREE->getTreeId(), $cart)) { $cart[$WT_TREE->getTreeId()] = []; } $pid = Filter::get('pid', WT_REGEX_XREF); if (!$cart[$WT_TREE->getTreeId()]) { $out = I18N::translate('Your clippings cart is empty.'); } else { $out = ''; if (!empty($cart[$WT_TREE->getTreeId()])) { $out .= '' . I18N::translate('Empty the clippings cart') . '' . '
' . '' . I18N::translate('Download') . '

'; } $out .= ''; } $record = Individual::getInstance($pid, $WT_TREE); if ($record && !array_key_exists($record->getXref(), $cart[$WT_TREE->getTreeId()])) { $out .= '
' . I18N::translate('Add %s to the clippings cart', $record->getFullName()) . ''; } return $out; } /** * A form to choose the download options. * * @return string */ public function downloadForm() { global $WT_TREE; $pid = Filter::get('pid', WT_REGEX_XREF); $out = ''; $out .= '
'; if (Auth::isManager($WT_TREE)) { $out .= '' . ''; } elseif (Auth::isMember($WT_TREE)) { $out .= '' . ''; } $out .= '

' . I18N::translate('Download') . '

' . I18N::translate('Apply privacy settings') . '' . ' ' . I18N::translate('None') . '
' . ' ' . I18N::translate('Manager') . '
' . ' ' . I18N::translate('Member') . '
' . ' ' . I18N::translate('Visitor') . '
' . I18N::translate('Apply privacy settings') . '' . ' ' . I18N::translate('Member') . '
' . ' ' . I18N::translate('Visitor') . '
' . I18N::translate('Convert from UTF-8 to ISO-8859-1') . '
'; return $out; } }