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