104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeaunamespace ComboStrap\Meta\Field; 404fd306cSNickeau 504fd306cSNickeauuse ComboStrap\ExceptionNotFound; 6*9a0ab880Sgerardnicouse ComboStrap\FirstImage; 704fd306cSNickeauuse ComboStrap\MarkupPath; 804fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 904fd306cSNickeauuse ComboStrap\Meta\Api\MetadataImage; 1004fd306cSNickeauuse ComboStrap\PageImageTag; 1104fd306cSNickeauuse ComboStrap\WikiPath; 1204fd306cSNickeau 1304fd306cSNickeau/** 1404fd306cSNickeau * Retrieve the featured image of the ancestor 1504fd306cSNickeau * 1604fd306cSNickeau * Can be used in a {@link PageImageTag} 1704fd306cSNickeau */ 1804fd306cSNickeauclass AncestorImage extends MetadataImage 1904fd306cSNickeau{ 2004fd306cSNickeau 2104fd306cSNickeau 2204fd306cSNickeau const PROPERTY_NAME = "ancestor-image"; 2304fd306cSNickeau 2404fd306cSNickeau public static function createFromResourcePage(MarkupPath $page): AncestorImage 2504fd306cSNickeau { 2604fd306cSNickeau return (new AncestorImage())->setResource($page); 2704fd306cSNickeau } 2804fd306cSNickeau 2904fd306cSNickeau static public function getDescription(): string 3004fd306cSNickeau { 3104fd306cSNickeau return "The featured image from the closest ancestor page"; 3204fd306cSNickeau } 3304fd306cSNickeau 3404fd306cSNickeau static public function getLabel(): string 3504fd306cSNickeau { 3604fd306cSNickeau return "Ancestor Image"; 3704fd306cSNickeau } 3804fd306cSNickeau 3904fd306cSNickeau public static function getName(): string 4004fd306cSNickeau { 4104fd306cSNickeau return self::PROPERTY_NAME; 4204fd306cSNickeau } 4304fd306cSNickeau 4404fd306cSNickeau static public function getPersistenceType(): string 4504fd306cSNickeau { 4604fd306cSNickeau return Metadata::DERIVED_METADATA; 4704fd306cSNickeau } 4804fd306cSNickeau 4904fd306cSNickeau 5004fd306cSNickeau static public function isMutable(): bool 5104fd306cSNickeau { 5204fd306cSNickeau return false; 5304fd306cSNickeau } 5404fd306cSNickeau 5504fd306cSNickeau public function getValue(): WikiPath 5604fd306cSNickeau { 5704fd306cSNickeau 5804fd306cSNickeau $contextPage = $this->getResource(); 5904fd306cSNickeau $actual = $contextPage; 6004fd306cSNickeau while (true) { 6104fd306cSNickeau try { 6204fd306cSNickeau $actual = $actual->getParent(); 6304fd306cSNickeau } catch (ExceptionNotFound $e) { 6404fd306cSNickeau break; 6504fd306cSNickeau } 6604fd306cSNickeau try { 6704fd306cSNickeau return FeaturedImage::createFromResourcePage($actual)->getValue(); 6804fd306cSNickeau } catch (ExceptionNotFound $e) { 6904fd306cSNickeau // ok 7004fd306cSNickeau } 71*9a0ab880Sgerardnico try { 72*9a0ab880Sgerardnico /** 73*9a0ab880Sgerardnico * If this is a index page, 74*9a0ab880Sgerardnico * the first image is generally a prominent image 75*9a0ab880Sgerardnico */ 76*9a0ab880Sgerardnico return FirstImage::createForPage($actual)->getValue(); 77*9a0ab880Sgerardnico } catch (ExceptionNotFound $e) { 78*9a0ab880Sgerardnico // ok 79*9a0ab880Sgerardnico } 8004fd306cSNickeau } 8104fd306cSNickeau throw new ExceptionNotFound(); 8204fd306cSNickeau 8304fd306cSNickeau } 8404fd306cSNickeau 8504fd306cSNickeau 8604fd306cSNickeau static public function getDrive(): string 8704fd306cSNickeau { 8804fd306cSNickeau return WikiPath::MEDIA_DRIVE; 8904fd306cSNickeau } 9004fd306cSNickeau 9104fd306cSNickeau 9204fd306cSNickeau static public function isOnForm(): bool 9304fd306cSNickeau { 9404fd306cSNickeau return true; 9504fd306cSNickeau } 9604fd306cSNickeau} 97