.
*/
namespace Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Database;
use Fisharebest\Webtrees\Filter;
use Fisharebest\Webtrees\Functions\FunctionsEdit;
use Fisharebest\Webtrees\Functions\FunctionsPrint;
use Fisharebest\Webtrees\GedcomTag;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Media;
use Fisharebest\Webtrees\Theme;
/**
* 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.');
}
/**
* Generate the HTML content of this block.
*
* @param int $block_id
* @param bool $template
* @param string[] $cfg
*
* @return string
*/
public function getBlock($block_id, $template = true, $cfg = []) {
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([
$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_picture_content
$content .= '
'; // random_picture_container
} else {
$content = I18N::translate('This family tree has no images to display.');
}
if ($template) {
return 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;
}
/**
* An HTML form to edit block settings
*
* @param int $block_id
*/
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: Label for a configuration option */ I18N::translate('Show only individuals, events, or all');
echo ' | ';
echo FunctionsEdit::selectEditControl('filter', ['indi' => I18N::translate('Individuals'), 'event' => I18N::translate('Facts and events'), 'all' => I18N::translate('All')], null, $filter, '');
echo ' |
';
$filters = [
'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 /* I18N: Label for a configuration option */ I18N::translate('Show slide show controls');
echo ' | ';
echo FunctionsEdit::editFieldYesNo('controls', $controls);
echo ' | ';
echo '';
echo /* I18N: Label for a configuration option */ I18N::translate('Start slide show on page load');
echo ' | ';
echo FunctionsEdit::editFieldYesNo('start', $start);
echo ' |
';
}
}