.
*/
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Filter;
use Fisharebest\Webtrees\Functions\FunctionsPrint;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Media;
use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Theme;
/**
* Class AlbumModule
*/
class AlbumModule extends AbstractModule implements ModuleTabInterface {
private $media_list;
/** {@inheritdoc} */
public function getTitle() {
return /* I18N: Name of a module */ I18N::translate('Album');
}
/** {@inheritdoc} */
public function getDescription() {
return /* I18N: Description of the “Album” module */ I18N::translate('An alternative to the “media” tab, and an enhanced image viewer.');
}
/** {@inheritdoc} */
public function defaultTabOrder() {
return 60;
}
/** {@inheritdoc} */
public function hasTabContent() {
global $WT_TREE;
return Auth::isEditor($WT_TREE) || $this->getMedia();
}
/** {@inheritdoc} */
public function isGrayedOut() {
return !$this->getMedia();
}
/** {@inheritdoc} */
public function getTabContent() {
global $WT_TREE, $controller;
$html = '
';
//Show Lightbox-Album header Links
if (Auth::isEditor($WT_TREE)) {
$html .= '
';
}
// Used when sorting media on album tab page
$html .= '
'; // one-cell table - for presentation only
$html .= '';
foreach ($this->getMedia() as $media) {
//View Edit Menu ----------------------------------
//Get media item Notes
$haystack = $media->getGedcom();
$needle = '1 NOTE';
$before = substr($haystack, 0, strpos($haystack, $needle));
$after = substr(strstr($haystack, $needle), strlen($needle));
$notes = FunctionsPrint::printFactNotes($before . $needle . $after, 1, true);
// Prepare Below Thumbnail menu ----------------------------------------------------
$menu = new Menu('' . $media->getFullName() . ' ');
$menu->addClass('', 'submenu');
// View Notes
if (strpos($media->getGedcom(), "\n1 NOTE")) {
$submenu = new Menu(I18N::translate('View notes'), '#', '', "modalNotes('" . Filter::escapeJs($notes) . "','" . I18N::translate('View notes') . "'); return false;");
$submenu->addClass("submenuitem");
$menu->addSubmenu($submenu);
}
//View Details
$submenu = new Menu(I18N::translate('View details'), $media->getHtmlUrl());
$submenu->addClass("submenuitem");
$menu->addSubmenu($submenu);
//View Sources
foreach ($media->getFacts('SOUR') as $source_fact) {
$source = $source_fact->getTarget();
if ($source && $source->canShow()) {
$submenu = new Menu(I18N::translate('Source') . ' – ' . $source->getFullName(), $source->getHtmlUrl());
$submenu->addClass('submenuitem');
$menu->addSubmenu($submenu);
}
}
if (Auth::isEditor($media->getTree())) {
// Edit Media
$submenu = new Menu(I18N::translate('Edit media'), '#', '', "return window.open('addmedia.php?action=editmedia&pid=" . $media->getXref() . "', '_blank', edit_window_specs);");
$submenu->addClass("submenuitem");
$menu->addSubmenu($submenu);
if (Auth::isAdmin()) {
if (Module::getModuleByName('GEDFact_assistant')) {
$submenu = new Menu(I18N::translate('Manage links'), '#', '', "return window.open('inverselink.php?mediaid=" . $media->getXref() . "&linkto=manage', '_blank', find_window_specs);");
$submenu->addClass("submenuitem");
$menu->addSubmenu($submenu);
} else {
$submenu = new Menu(I18N::translate('Link this media object to an individual'), '#', 'menu-obje-link-indi', "return ilinkitem('" . $media->getXref() . "','person');");
$submenu->addClass('submenuitem');
$menu->addSubmenu($submenu);
$submenu = new Menu(I18N::translate('Link this media object to a family'), '#', 'menu-obje-link-fam', "return ilinkitem('" . $media->getXref() . "','family');");
$submenu->addClass('submenuitem');
$menu->addSubmenu($submenu);
$submenu = new Menu(I18N::translate('Link this media object to a source'), '#', 'menu-obje-link-sour', "return ilinkitem('" . $media->getXref() . "','source');");
$submenu->addClass('submenuitem');
$menu->addSubmenu($submenu);
}
$submenu = new Menu(I18N::translate('Unlink media'), '#', '', "return unlink_media('" . I18N::translate('Are you sure you want to remove links to this media object?') . "', '" . $controller->record->getXref() . "', '" . $media->getXref() . "');");
$submenu->addClass("submenuitem");
$menu->addSubmenu($submenu);
}
}
$html .= '- ';
$html .= '
' . $media->displayImage() . ' ';
$html .= '' . $menu->getMenu() . ' ';
$html .= ' ';
}
$html .= ' ';
$html .= ' |
';
return $html;
}
/**
* Get all facts containing media links for this person and their spouse-family records
*
* @return Media[]
*/
private function getMedia() {
global $controller;
if ($this->media_list === null) {
// Use facts from this individual and all their spouses
$facts = $controller->record->getFacts();
foreach ($controller->record->getSpouseFamilies() as $family) {
foreach ($family->getFacts() as $fact) {
$facts[] = $fact;
}
}
// Use all media from each fact
$this->media_list = array();
foreach ($facts as $fact) {
// Don't show pending edits, as the user just sees duplicates
if (!$fact->isPendingDeletion()) {
preg_match_all('/(?:^1|\n\d) OBJE @(' . WT_REGEX_XREF . ')@/', $fact->getGedcom(), $matches);
foreach ($matches[1] as $match) {
$media = Media::getInstance($match, $controller->record->getTree());
if ($media && $media->canShow()) {
$this->media_list[] = $media;
}
}
}
}
// If a media object is linked twice, only show it once
$this->media_list = array_unique($this->media_list);
// Sort these using _WT_OBJE_SORT
$wt_obje_sort = array();
foreach ($controller->record->getFacts('_WT_OBJE_SORT') as $fact) {
$wt_obje_sort[] = trim($fact->getValue(), '@');
}
usort($this->media_list, function (Media $x, Media $y) use ($wt_obje_sort) {
return array_search($x->getXref(), $wt_obje_sort) - array_search($y->getXref(), $wt_obje_sort);
});
}
return $this->media_list;
}
/** {@inheritdoc} */
public function canLoadAjax() {
return !Auth::isSearchEngine(); // Search engines cannot use AJAX
}
/** {@inheritdoc} */
public function getPreLoadContent() {
return '';
}
}