.
*/
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') { ?>
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') { ?>
= I18N::translate('Family tree clippings cart') ?>
= I18N::translate('Record') ?> |
= I18N::translate('Remove') ?> |
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 .= '