xref: /template/strap/ComboStrap/Meta/Field/AncestorImage.php (revision 9a0ab88082d82e55a733ad8d4d4d5950467071db)
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