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