. */ /** * Class SlideShowModule */ class SlideShowModule extends AbstractModule implements ModuleBlockInterface { /** {@inheritdoc} */ public function getTitle() { return /* I18N: Name of a module */ I18N::translate('Slide show'); } /** {@inheritdoc} */ public function getDescription() { return /* I18N: Description of the “Slide show” module */ I18N::translate('Random images from the current family tree.'); } /** {@inheritdoc} */ public function getBlock($block_id, $template = true, $cfg = null) { global $ctype, $WT_TREE; $filter = $this->getBlockSetting($block_id, 'filter', 'all'); $controls = $this->getBlockSetting($block_id, 'controls', '1'); $start = $this->getBlockSetting($block_id, 'start', '0') || Filter::getBool('start'); // We can apply the filters using SQL // Do not use "ORDER BY RAND()" - it is very slow on large tables. Use PHP::array_rand() instead. $all_media = Database::prepare( "SELECT m_id FROM `##media`" . " WHERE m_file = ?" . " AND m_ext IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '')" . " AND m_type IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '')" )->execute(array( $WT_TREE->getTreeId(), $this->getBlockSetting($block_id, 'filter_avi', '0') ? 'avi' : null, $this->getBlockSetting($block_id, 'filter_bmp', '1') ? 'bmp' : null, $this->getBlockSetting($block_id, 'filter_gif', '1') ? 'gif' : null, $this->getBlockSetting($block_id, 'filter_jpeg', '1') ? 'jpg' : null, $this->getBlockSetting($block_id, 'filter_jpeg', '1') ? 'jpeg' : null, $this->getBlockSetting($block_id, 'filter_mp3', '0') ? 'mp3' : null, $this->getBlockSetting($block_id, 'filter_ole', '1') ? 'ole' : null, $this->getBlockSetting($block_id, 'filter_pcx', '1') ? 'pcx' : null, $this->getBlockSetting($block_id, 'filter_pdf', '0') ? 'pdf' : null, $this->getBlockSetting($block_id, 'filter_png', '1') ? 'png' : null, $this->getBlockSetting($block_id, 'filter_tiff', '1') ? 'tiff' : null, $this->getBlockSetting($block_id, 'filter_wav', '0') ? 'wav' : null, $this->getBlockSetting($block_id, 'filter_audio', '0') ? 'audio' : null, $this->getBlockSetting($block_id, 'filter_book', '1') ? 'book' : null, $this->getBlockSetting($block_id, 'filter_card', '1') ? 'card' : null, $this->getBlockSetting($block_id, 'filter_certificate', '1') ? 'certificate' : null, $this->getBlockSetting($block_id, 'filter_coat', '1') ? 'coat' : null, $this->getBlockSetting($block_id, 'filter_document', '1') ? 'document' : null, $this->getBlockSetting($block_id, 'filter_electronic', '1') ? 'electronic' : null, $this->getBlockSetting($block_id, 'filter_fiche', '1') ? 'fiche' : null, $this->getBlockSetting($block_id, 'filter_film', '1') ? 'film' : null, $this->getBlockSetting($block_id, 'filter_magazine', '1') ? 'magazine' : null, $this->getBlockSetting($block_id, 'filter_manuscript', '1') ? 'manuscript' : null, $this->getBlockSetting($block_id, 'filter_map', '1') ? 'map' : null, $this->getBlockSetting($block_id, 'filter_newspaper', '1') ? 'newspaper' : null, $this->getBlockSetting($block_id, 'filter_other', '1') ? 'other' : null, $this->getBlockSetting($block_id, 'filter_painting', '1') ? 'painting' : null, $this->getBlockSetting($block_id, 'filter_photo', '1') ? 'photo' : null, $this->getBlockSetting($block_id, 'filter_tombstone', '1') ? 'tombstone' : null, $this->getBlockSetting($block_id, 'filter_video', '0') ? 'video' : null, ))->fetchOneColumn(); // Keep looking through the media until a suitable one is found. $random_media = null; while ($all_media) { $n = array_rand($all_media); $media = Media::getInstance($all_media[$n], $WT_TREE); if ($media->canShow() && !$media->isExternal()) { // Check if it is linked to a suitable individual foreach ($media->linkedIndividuals('OBJE') as $indi) { if ( $filter === 'all' || $filter === 'indi' && strpos($indi->getGedcom(), "\n1 OBJE @" . $media->getXref() . '@') !== false || $filter === 'event' && strpos($indi->getGedcom(), "\n2 OBJE @" . $media->getXref() . '@') !== false ) { // Found one :-) $random_media = $media; break 2; } } } unset($all_media[$n]); }; $id = $this->getName() . $block_id; $class = $this->getName() . '_block'; if ($ctype === 'gedcom' && Auth::isManager($WT_TREE) || $ctype === 'user' && Auth::check()) { $title = ''; } else { $title = ''; } $title .= $this->getTitle(); if ($random_media) { $content = "
"; if ($controls) { if ($start) { $icon_class = 'icon-media-stop'; } else { $icon_class = 'icon-media-play'; } $content .= '

'; $content .= "'; $content .= ''; $content .= '
'; } if ($start) { $content .= ''; } $content .= '
'; $content .= '
'; $content .= $random_media->displayImage(); $content .= '
'; $content .= '' . $random_media->getFullName() . '
'; foreach ($random_media->linkedIndividuals('OBJE') as $individual) { $content .= '' . I18N::translate('View individual') . ' — ' . $individual->getFullname() . '
'; } foreach ($random_media->linkedFamilies('OBJE') as $family) { $content .= '' . I18N::translate('View family') . ' — ' . $family->getFullname() . '
'; } foreach ($random_media->linkedSources('OBJE') as $source) { $content .= '' . I18N::translate('View source') . ' — ' . $source->getFullname() . '
'; } $content .= '
'; $content .= print_fact_notes($random_media->getGedcom(), "1", false); $content .= '
'; $content .= '
'; $content .= '
'; // random_picture_content $content .= '
'; // random_picture_container } else { $content = I18N::translate('This family tree has no images to display.'); } if ($template) { echo Theme::theme()->formatBlock($id, $title, $class, $content); } else { return $content; } } /** {@inheritdoc} */ public function loadAjax() { return true; } /** {@inheritdoc} */ public function isUserBlock() { return true; } /** {@inheritdoc} */ public function isGedcomBlock() { return true; } /** {@inheritdoc} */ public function configureBlock($block_id) { if (Filter::postBool('save') && Filter::checkCsrf()) { $this->setBlockSetting($block_id, 'filter', Filter::post('filter', 'indi|event|all', 'all')); $this->setBlockSetting($block_id, 'controls', Filter::postBool('controls')); $this->setBlockSetting($block_id, 'start', Filter::postBool('start')); $this->setBlockSetting($block_id, 'filter_avi', Filter::postBool('filter_avi')); $this->setBlockSetting($block_id, 'filter_bmp', Filter::postBool('filter_bmp')); $this->setBlockSetting($block_id, 'filter_gif', Filter::postBool('filter_gif')); $this->setBlockSetting($block_id, 'filter_jpeg', Filter::postBool('filter_jpeg')); $this->setBlockSetting($block_id, 'filter_mp3', Filter::postBool('filter_mp3')); $this->setBlockSetting($block_id, 'filter_ole', Filter::postBool('filter_ole')); $this->setBlockSetting($block_id, 'filter_pcx', Filter::postBool('filter_pcx')); $this->setBlockSetting($block_id, 'filter_pdf', Filter::postBool('filter_pdf')); $this->setBlockSetting($block_id, 'filter_png', Filter::postBool('filter_png')); $this->setBlockSetting($block_id, 'filter_tiff', Filter::postBool('filter_tiff')); $this->setBlockSetting($block_id, 'filter_wav', Filter::postBool('filter_wav')); $this->setBlockSetting($block_id, 'filter_audio', Filter::postBool('filter_audio')); $this->setBlockSetting($block_id, 'filter_book', Filter::postBool('filter_book')); $this->setBlockSetting($block_id, 'filter_card', Filter::postBool('filter_card')); $this->setBlockSetting($block_id, 'filter_certificate', Filter::postBool('filter_certificate')); $this->setBlockSetting($block_id, 'filter_coat', Filter::postBool('filter_coat')); $this->setBlockSetting($block_id, 'filter_document', Filter::postBool('filter_document')); $this->setBlockSetting($block_id, 'filter_electronic', Filter::postBool('filter_electronic')); $this->setBlockSetting($block_id, 'filter_fiche', Filter::postBool('filter_fiche')); $this->setBlockSetting($block_id, 'filter_film', Filter::postBool('filter_film')); $this->setBlockSetting($block_id, 'filter_magazine', Filter::postBool('filter_magazine')); $this->setBlockSetting($block_id, 'filter_manuscript', Filter::postBool('filter_manuscript')); $this->setBlockSetting($block_id, 'filter_map', Filter::postBool('filter_map')); $this->setBlockSetting($block_id, 'filter_newspaper', Filter::postBool('filter_newspaper')); $this->setBlockSetting($block_id, 'filter_other', Filter::postBool('filter_other')); $this->setBlockSetting($block_id, 'filter_painting', Filter::postBool('filter_painting')); $this->setBlockSetting($block_id, 'filter_photo', Filter::postBool('filter_photo')); $this->setBlockSetting($block_id, 'filter_tombstone', Filter::postBool('filter_tombstone')); $this->setBlockSetting($block_id, 'filter_video', Filter::postBool('filter_video')); } $filter = $this->getBlockSetting($block_id, 'filter', 'all'); $controls = $this->getBlockSetting($block_id, 'controls', '1'); $start = $this->getBlockSetting($block_id, 'start', '0') || Filter::getBool('start'); echo ''; echo I18N::translate('Show only individuals, events, or all?'); echo ''; echo select_edit_control('filter', array('indi'=> I18N::translate('Individuals'), 'event'=> I18N::translate('Facts and events'), 'all'=> I18N::translate('All')), null, $filter, ''); echo ''; $filters = array( 'avi' =>$this->getBlockSetting($block_id, 'filter_avi', '0'), 'bmp' =>$this->getBlockSetting($block_id, 'filter_bmp', '1'), 'gif' =>$this->getBlockSetting($block_id, 'filter_gif', '1'), 'jpeg' =>$this->getBlockSetting($block_id, 'filter_jpeg', '1'), 'mp3' =>$this->getBlockSetting($block_id, 'filter_mp3', '0'), 'ole' =>$this->getBlockSetting($block_id, 'filter_ole', '1'), 'pcx' =>$this->getBlockSetting($block_id, 'filter_pcx', '1'), 'pdf' =>$this->getBlockSetting($block_id, 'filter_pdf', '0'), 'png' =>$this->getBlockSetting($block_id, 'filter_png', '1'), 'tiff' =>$this->getBlockSetting($block_id, 'filter_tiff', '1'), 'wav' =>$this->getBlockSetting($block_id, 'filter_wav', '0'), 'audio' =>$this->getBlockSetting($block_id, 'filter_audio', '0'), 'book' =>$this->getBlockSetting($block_id, 'filter_book', '1'), 'card' =>$this->getBlockSetting($block_id, 'filter_card', '1'), 'certificate'=>$this->getBlockSetting($block_id, 'filter_certificate', '1'), 'coat' =>$this->getBlockSetting($block_id, 'filter_coat', '1'), 'document' =>$this->getBlockSetting($block_id, 'filter_document', '1'), 'electronic' =>$this->getBlockSetting($block_id, 'filter_electronic', '1'), 'fiche' =>$this->getBlockSetting($block_id, 'filter_fiche', '1'), 'film' =>$this->getBlockSetting($block_id, 'filter_film', '1'), 'magazine' =>$this->getBlockSetting($block_id, 'filter_magazine', '1'), 'manuscript' =>$this->getBlockSetting($block_id, 'filter_manuscript', '1'), 'map' =>$this->getBlockSetting($block_id, 'filter_map', '1'), 'newspaper' =>$this->getBlockSetting($block_id, 'filter_newspaper', '1'), 'other' =>$this->getBlockSetting($block_id, 'filter_other', '1'), 'painting' =>$this->getBlockSetting($block_id, 'filter_painting', '1'), 'photo' =>$this->getBlockSetting($block_id, 'filter_photo', '1'), 'tombstone' =>$this->getBlockSetting($block_id, 'filter_tombstone', '1'), 'video' =>$this->getBlockSetting($block_id, 'filter_video', '0'), ); echo ''; echo I18N::translate('Filter'); ?>

$typeValue) { $i++; if ($i > 3) { $i = 1; echo ''; } echo ''; } ?>
'; echo I18N::translate('Show slide show controls?'); echo ''; echo edit_field_yes_no('controls', $controls); echo ''; echo ''; echo I18N::translate('Start slide show on page load?'); echo ''; echo edit_field_yes_no('start', $start); echo ''; } }