1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap\Meta\Field; 4*04fd306cSNickeau 5*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 6*04fd306cSNickeauuse ComboStrap\MarkupPath; 7*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 8*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataImage; 9*04fd306cSNickeauuse ComboStrap\PageImageTag; 10*04fd306cSNickeauuse ComboStrap\WikiPath; 11*04fd306cSNickeau 12*04fd306cSNickeau/** 13*04fd306cSNickeau * Retrieve the featured image of the ancestor 14*04fd306cSNickeau * 15*04fd306cSNickeau * Can be used in a {@link PageImageTag} 16*04fd306cSNickeau */ 17*04fd306cSNickeauclass AncestorImage extends MetadataImage 18*04fd306cSNickeau{ 19*04fd306cSNickeau 20*04fd306cSNickeau 21*04fd306cSNickeau const PROPERTY_NAME = "ancestor-image"; 22*04fd306cSNickeau 23*04fd306cSNickeau public static function createFromResourcePage(MarkupPath $page): AncestorImage 24*04fd306cSNickeau { 25*04fd306cSNickeau return (new AncestorImage())->setResource($page); 26*04fd306cSNickeau } 27*04fd306cSNickeau 28*04fd306cSNickeau static public function getDescription(): string 29*04fd306cSNickeau { 30*04fd306cSNickeau return "The featured image from the closest ancestor page"; 31*04fd306cSNickeau } 32*04fd306cSNickeau 33*04fd306cSNickeau static public function getLabel(): string 34*04fd306cSNickeau { 35*04fd306cSNickeau return "Ancestor Image"; 36*04fd306cSNickeau } 37*04fd306cSNickeau 38*04fd306cSNickeau public static function getName(): string 39*04fd306cSNickeau { 40*04fd306cSNickeau return self::PROPERTY_NAME; 41*04fd306cSNickeau } 42*04fd306cSNickeau 43*04fd306cSNickeau static public function getPersistenceType(): string 44*04fd306cSNickeau { 45*04fd306cSNickeau return Metadata::DERIVED_METADATA; 46*04fd306cSNickeau } 47*04fd306cSNickeau 48*04fd306cSNickeau 49*04fd306cSNickeau static public function isMutable(): bool 50*04fd306cSNickeau { 51*04fd306cSNickeau return false; 52*04fd306cSNickeau } 53*04fd306cSNickeau 54*04fd306cSNickeau public function getValue(): WikiPath 55*04fd306cSNickeau { 56*04fd306cSNickeau 57*04fd306cSNickeau $contextPage = $this->getResource(); 58*04fd306cSNickeau $actual = $contextPage; 59*04fd306cSNickeau while (true) { 60*04fd306cSNickeau try { 61*04fd306cSNickeau $actual = $actual->getParent(); 62*04fd306cSNickeau } catch (ExceptionNotFound $e) { 63*04fd306cSNickeau break; 64*04fd306cSNickeau } 65*04fd306cSNickeau try { 66*04fd306cSNickeau return FeaturedImage::createFromResourcePage($actual)->getValue(); 67*04fd306cSNickeau } catch (ExceptionNotFound $e) { 68*04fd306cSNickeau // ok 69*04fd306cSNickeau } 70*04fd306cSNickeau } 71*04fd306cSNickeau throw new ExceptionNotFound(); 72*04fd306cSNickeau 73*04fd306cSNickeau } 74*04fd306cSNickeau 75*04fd306cSNickeau 76*04fd306cSNickeau static public function getDrive(): string 77*04fd306cSNickeau { 78*04fd306cSNickeau return WikiPath::MEDIA_DRIVE; 79*04fd306cSNickeau } 80*04fd306cSNickeau 81*04fd306cSNickeau 82*04fd306cSNickeau static public function isOnForm(): bool 83*04fd306cSNickeau { 84*04fd306cSNickeau return true; 85*04fd306cSNickeau } 86*04fd306cSNickeau} 87