104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeaunamespace ComboStrap\Meta\Field; 404fd306cSNickeau 504fd306cSNickeauuse ComboStrap\ExceptionNotFound; 6*e3d00612Sgerardnicouse ComboStrap\FeaturedIcon; 79a0ab880Sgerardnicouse ComboStrap\FirstImage; 804fd306cSNickeauuse ComboStrap\MarkupPath; 904fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 1004fd306cSNickeauuse ComboStrap\Meta\Api\MetadataImage; 1104fd306cSNickeauuse ComboStrap\PageImageTag; 1204fd306cSNickeauuse ComboStrap\WikiPath; 1304fd306cSNickeau 1404fd306cSNickeau/** 1504fd306cSNickeau * Retrieve the featured image of the ancestor 1604fd306cSNickeau * 1704fd306cSNickeau * Can be used in a {@link PageImageTag} 1804fd306cSNickeau */ 1904fd306cSNickeauclass AncestorImage extends MetadataImage 2004fd306cSNickeau{ 2104fd306cSNickeau 2204fd306cSNickeau 2304fd306cSNickeau const PROPERTY_NAME = "ancestor-image"; 2404fd306cSNickeau 2504fd306cSNickeau public static function createFromResourcePage(MarkupPath $page): AncestorImage 2604fd306cSNickeau { 2704fd306cSNickeau return (new AncestorImage())->setResource($page); 2804fd306cSNickeau } 2904fd306cSNickeau 3004fd306cSNickeau static public function getDescription(): string 3104fd306cSNickeau { 3204fd306cSNickeau return "The featured image from the closest ancestor page"; 3304fd306cSNickeau } 3404fd306cSNickeau 3504fd306cSNickeau static public function getLabel(): string 3604fd306cSNickeau { 3704fd306cSNickeau return "Ancestor Image"; 3804fd306cSNickeau } 3904fd306cSNickeau 4004fd306cSNickeau public static function getName(): string 4104fd306cSNickeau { 4204fd306cSNickeau return self::PROPERTY_NAME; 4304fd306cSNickeau } 4404fd306cSNickeau 4504fd306cSNickeau static public function getPersistenceType(): string 4604fd306cSNickeau { 4704fd306cSNickeau return Metadata::DERIVED_METADATA; 4804fd306cSNickeau } 4904fd306cSNickeau 5004fd306cSNickeau 5104fd306cSNickeau static public function isMutable(): bool 5204fd306cSNickeau { 5304fd306cSNickeau return false; 5404fd306cSNickeau } 5504fd306cSNickeau 56*e3d00612Sgerardnico /** 57*e3d00612Sgerardnico * Determination of the ancestore 58*e3d00612Sgerardnico * is really a question of taste. 59*e3d00612Sgerardnico * 60*e3d00612Sgerardnico * The algorithm goal is to find a relevant image. 61*e3d00612Sgerardnico * 62*e3d00612Sgerardnico * @return WikiPath 63*e3d00612Sgerardnico * @throws ExceptionNotFound 64*e3d00612Sgerardnico */ 6504fd306cSNickeau public function getValue(): WikiPath 6604fd306cSNickeau { 6704fd306cSNickeau 6804fd306cSNickeau $contextPage = $this->getResource(); 6904fd306cSNickeau $actual = $contextPage; 7004fd306cSNickeau while (true) { 7104fd306cSNickeau try { 7204fd306cSNickeau $actual = $actual->getParent(); 7304fd306cSNickeau } catch (ExceptionNotFound $e) { 7404fd306cSNickeau break; 7504fd306cSNickeau } 7604fd306cSNickeau try { 7704fd306cSNickeau return FeaturedImage::createFromResourcePage($actual)->getValue(); 7804fd306cSNickeau } catch (ExceptionNotFound $e) { 7904fd306cSNickeau // ok 8004fd306cSNickeau } 819a0ab880Sgerardnico try { 829a0ab880Sgerardnico /** 839a0ab880Sgerardnico * If this is a index page, 849a0ab880Sgerardnico * the first image is generally a prominent image 859a0ab880Sgerardnico */ 869a0ab880Sgerardnico return FirstImage::createForPage($actual)->getValue(); 879a0ab880Sgerardnico } catch (ExceptionNotFound $e) { 889a0ab880Sgerardnico // ok 899a0ab880Sgerardnico } 90*e3d00612Sgerardnico try { 91*e3d00612Sgerardnico /** 92*e3d00612Sgerardnico * The featured icon or the first icon parsed 93*e3d00612Sgerardnico */ 94*e3d00612Sgerardnico return FeaturedIcon::createForPage($actual)->getValueOrDefault(); 95*e3d00612Sgerardnico } catch (ExceptionNotFound $e) { 96*e3d00612Sgerardnico // ok 97*e3d00612Sgerardnico } 9804fd306cSNickeau } 9904fd306cSNickeau throw new ExceptionNotFound(); 10004fd306cSNickeau 10104fd306cSNickeau } 10204fd306cSNickeau 10304fd306cSNickeau 10404fd306cSNickeau static public function getDrive(): string 10504fd306cSNickeau { 10604fd306cSNickeau return WikiPath::MEDIA_DRIVE; 10704fd306cSNickeau } 10804fd306cSNickeau 10904fd306cSNickeau 11004fd306cSNickeau static public function isOnForm(): bool 11104fd306cSNickeau { 11204fd306cSNickeau return true; 11304fd306cSNickeau } 11404fd306cSNickeau} 115