. */ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Controller\PageController; use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\Filter; use Fisharebest\Webtrees\Functions\FunctionsPrint; use Fisharebest\Webtrees\GedcomRecord; 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() ->addExternalJavascript(WT_AUTOCOMPLETE_JS_URL) ->addInlineJavascript('autocomplete();'); 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 I18N::translate('The clippings cart allows you to take extracts (“clippings”) from this family tree and bundle them up into a single file for downloading and subsequent importing into your own genealogy program. The downloadable file is recorded in GEDCOM format.
'); ?>
action != 'download' && $clip_ctrl->action != 'add') { ?>





getPreference('GEDCOM_MEDIA_PATH')); ?>


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; } ?>
getHtmlUrl(), '">', $record->getFullName(), ''; ?>
record)) { $submenus[] = new Menu($this->getTitle(), 'module.php?mod=clippings&mod_action=index&ged=' . $WT_TREE->getNameUrl(), 'menu-clippingscart', array('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-clippingsadd', array('rel' => 'nofollow')); } if ($submenus) { return new Menu($this->getTitle(), '#', 'menu-clippings', array('rel' => 'nofollow'), $submenus); } else { return new Menu($this->getTitle(), 'module.php?mod=clippings&mod_action=index&ged=' . $WT_TREE->getNameUrl(), 'menu-clippings', array('rel' => 'nofollow')); } } /** {@inheritdoc} */ public function defaultSidebarOrder() { return 60; } /** {@inheritdoc} */ public function hasSidebarContent() { // Creating a controller has the side effect of initialising the cart new ClippingsCartController; return true; } /** * Load this sidebar synchronously. * * @return string */ public function getSidebarContent() { global $controller; $controller->addInlineJavascript(' jQuery("#sb_clippings_content").on("click", ".add_cart, .remove_cart", function() { jQuery("#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()] = array(); Session::put('cart', $cart); } elseif (isset($_REQUEST['download'])) { return $this->downloadForm($clip_ctrl); } return $this->getCartList(); } /** * A list for the side bar. * * @return string */ public function getCartList() { global $WT_TREE; $cart = Session::get('cart', array()); if (!array_key_exists($WT_TREE->getTreeId(), $cart)) { $cart[$WT_TREE->getTreeId()] = array(); } $pid = Filter::get('pid', WT_REGEX_XREF); if (!$cart[$WT_TREE->getTreeId()]) { $out = I18N::translate('Your clippings cart is empty.'); } else { $out = ''; } if ($cart[$WT_TREE->getTreeId()]) { $out .= '
' . I18N::translate('Empty the clippings cart') . '' . '
' . '' . I18N::translate('Download') . ''; } $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. * * @param ClippingsCartController $clip_ctrl * * @return string */ public function downloadForm(ClippingsCartController $clip_ctrl) { 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('Zip file(s)') . '
' . I18N::translate('Include media (automatically zips files)') . '
' . 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') . '
' . I18N::translate('Add the GEDCOM media path to filenames') . ' ' . Filter::escapeHtml($WT_TREE->getPreference('GEDCOM_MEDIA_PATH')) . '
'; return $out; } }