xref: /template/strap/ComboStrap/Brand.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
14cadd4f8SNickeau<?php
24cadd4f8SNickeau
34cadd4f8SNickeau
44cadd4f8SNickeaunamespace ComboStrap;
54cadd4f8SNickeau
64cadd4f8SNickeau
74cadd4f8SNickeauclass Brand
84cadd4f8SNickeau{
94cadd4f8SNickeau
104cadd4f8SNickeau    const NEWSLETTER_BRAND_NAME = "newsletter";
114cadd4f8SNickeau    const EMAIL_BRAND_NAME = "email";
124cadd4f8SNickeau
13*04fd306cSNickeau
144cadd4f8SNickeau    /**
154cadd4f8SNickeau     * The brand of the current application/website
164cadd4f8SNickeau     */
174cadd4f8SNickeau    public const CURRENT_BRAND = "current";
18*04fd306cSNickeau    const CANONICAL = "brand";
19*04fd306cSNickeau    const ABBR_PROPERTY = 'abbr';
20*04fd306cSNickeau    /**
21*04fd306cSNickeau     * @var array an array of brand abbreviation as key and their name as value
22*04fd306cSNickeau     */
23*04fd306cSNickeau    private static array $BRAND_ABBR;
244cadd4f8SNickeau
254cadd4f8SNickeau
264cadd4f8SNickeau    private $secondaryColor;
274cadd4f8SNickeau    private $brandUrl;
284cadd4f8SNickeau
294cadd4f8SNickeau    /**
304cadd4f8SNickeau     * @var array
314cadd4f8SNickeau     */
32*04fd306cSNickeau    public static array $brandDictionary;
334cadd4f8SNickeau    /**
344cadd4f8SNickeau     * @var bool
354cadd4f8SNickeau     */
36*04fd306cSNickeau    private bool $unknown = false;
374cadd4f8SNickeau    /**
384cadd4f8SNickeau     * @var mixed
394cadd4f8SNickeau     */
404cadd4f8SNickeau    private $brandDict;
414cadd4f8SNickeau
42*04fd306cSNickeau
434cadd4f8SNickeau    /**
444cadd4f8SNickeau     * Brand constructor.
454cadd4f8SNickeau     * @param string $name
464cadd4f8SNickeau     */
47*04fd306cSNickeau    private function __construct(string $name)
484cadd4f8SNickeau    {
49*04fd306cSNickeau
50*04fd306cSNickeau        $this->name = $name;
514cadd4f8SNickeau
524cadd4f8SNickeau        /**
534cadd4f8SNickeau         * Get the brands
544cadd4f8SNickeau         */
55*04fd306cSNickeau        $brandDictionary = Brand::getBrandDictionary();
564cadd4f8SNickeau
574cadd4f8SNickeau
584cadd4f8SNickeau        /**
594cadd4f8SNickeau         * Build the data for the brand
604cadd4f8SNickeau         */
61*04fd306cSNickeau        $this->brandDict = $brandDictionary[$this->name];
624cadd4f8SNickeau        switch ($this->name) {
634cadd4f8SNickeau            case self::CURRENT_BRAND:
644cadd4f8SNickeau                $this->brandUrl = Site::getBaseUrl();
654cadd4f8SNickeau                $secondaryColor = Site::getSecondaryColor();
664cadd4f8SNickeau                if ($secondaryColor !== null) {
674cadd4f8SNickeau                    // the predicates on the secondary value is to avoid a loop with the the function below
684cadd4f8SNickeau                    $this->secondaryColor = $secondaryColor->toCssValue();
694cadd4f8SNickeau                }
704cadd4f8SNickeau                break;
714cadd4f8SNickeau            default:
724cadd4f8SNickeau                if ($this->brandDict !== null) {
734cadd4f8SNickeau                    $this->secondaryColor = $this->brandDict["colors"]["secondary"];
744cadd4f8SNickeau                    $this->brandUrl = $this->brandDict["url"];
754cadd4f8SNickeau                    return;
764cadd4f8SNickeau                }
774cadd4f8SNickeau                $this->unknown = true;
784cadd4f8SNickeau                break;
794cadd4f8SNickeau        }
804cadd4f8SNickeau
814cadd4f8SNickeau    }
824cadd4f8SNickeau
834cadd4f8SNickeau    /**
844cadd4f8SNickeau     * @return string[]
854cadd4f8SNickeau     */
864cadd4f8SNickeau    public static function getAllKnownBrandNames(): array
874cadd4f8SNickeau    {
884cadd4f8SNickeau
89*04fd306cSNickeau        $brands = self::getAllBrands();
90*04fd306cSNickeau        $brandNames = [self::CURRENT_BRAND];
91*04fd306cSNickeau        foreach ($brands as $brand) {
92*04fd306cSNickeau            $brandNames[] = $brand->getName();
93*04fd306cSNickeau            try {
94*04fd306cSNickeau                $brandNames[] = $brand->getAbbr();
95*04fd306cSNickeau            } catch (ExceptionNotFound $e) {
96*04fd306cSNickeau                // ok
97*04fd306cSNickeau            }
98*04fd306cSNickeau        }
99*04fd306cSNickeau        return $brandNames;
100*04fd306cSNickeau
1014cadd4f8SNickeau    }
1024cadd4f8SNickeau
103*04fd306cSNickeau
1044cadd4f8SNickeau    /**
105*04fd306cSNickeau     * @return Brand[]
1064cadd4f8SNickeau     */
107*04fd306cSNickeau    public static function getAllBrands(): array
1084cadd4f8SNickeau    {
1094cadd4f8SNickeau        $brandDictionary = self::getBrandDictionary();
110*04fd306cSNickeau        $brands = [];
111*04fd306cSNickeau        foreach (array_keys($brandDictionary) as $brandName) {
112*04fd306cSNickeau            $brands[] = self::create($brandName);
113*04fd306cSNickeau        }
114*04fd306cSNickeau        return $brands;
1154cadd4f8SNickeau    }
1164cadd4f8SNickeau
1174cadd4f8SNickeau    /**
118*04fd306cSNickeau     * @param $type - the button type (ie one of {@link BrandButton::TYPE_BUTTONS}
119*04fd306cSNickeau     * @return array - the brand names that can be used as type in the brand button
120*04fd306cSNickeau     */
121*04fd306cSNickeau    public static function getBrandNamesForButtonType($type): array
122*04fd306cSNickeau    {
123*04fd306cSNickeau        $brands = self::getAllBrands();
124*04fd306cSNickeau        $brandNamesForType = [];
125*04fd306cSNickeau        foreach ($brands as $brand) {
126*04fd306cSNickeau            if ($brand->supportButtonType($type)) {
127*04fd306cSNickeau                $brandNamesForType[] = $brand->getName();
128*04fd306cSNickeau                try {
129*04fd306cSNickeau                    $brandNamesForType[] = $brand->getAbbr();
130*04fd306cSNickeau                } catch (ExceptionNotFound $e) {
131*04fd306cSNickeau                    // ok
132*04fd306cSNickeau                }
133*04fd306cSNickeau            }
134*04fd306cSNickeau        }
135*04fd306cSNickeau        return $brandNamesForType;
136*04fd306cSNickeau    }
137*04fd306cSNickeau
138*04fd306cSNickeau    /**
139*04fd306cSNickeau     *
1404cadd4f8SNickeau     */
1414cadd4f8SNickeau    public static function getBrandDictionary(): array
1424cadd4f8SNickeau    {
143*04fd306cSNickeau        if (!isset(Brand::$brandDictionary)) {
144*04fd306cSNickeau            try {
1454cadd4f8SNickeau                Brand::$brandDictionary = Dictionary::getFrom("brands");
146*04fd306cSNickeau            } catch (ExceptionCompile $e) {
147*04fd306cSNickeau                // Should never happens
148*04fd306cSNickeau                Brand::$brandDictionary = [];
149*04fd306cSNickeau                LogUtility::error("We can't load the brands dictionary. Error: " . $e->getMessage(), self::CANONICAL, $e);
150*04fd306cSNickeau            }
1514cadd4f8SNickeau        }
1524cadd4f8SNickeau        return Brand::$brandDictionary;
1534cadd4f8SNickeau    }
1544cadd4f8SNickeau
1554cadd4f8SNickeau
1564cadd4f8SNickeau    /**
1574cadd4f8SNickeau     * @var string
1584cadd4f8SNickeau     * The name of the brand,
1594cadd4f8SNickeau     * for company, we follow the naming of
1604cadd4f8SNickeau     * https://github.com/ellisonleao/sharer.js
1614cadd4f8SNickeau     */
1624cadd4f8SNickeau    private $name;
1634cadd4f8SNickeau
164*04fd306cSNickeau
1654cadd4f8SNickeau    public static function create(string $brandName): Brand
1664cadd4f8SNickeau    {
167*04fd306cSNickeau
168*04fd306cSNickeau        $brandNameQualified = strtolower($brandName);
169*04fd306cSNickeau        $brandNameQualified = Brand::getBrandNameFromAbbr($brandNameQualified);
170*04fd306cSNickeau        $objectIdentifier = self::CANONICAL . "-" . $brandNameQualified;
171*04fd306cSNickeau        $executionContext = ExecutionContext::getActualOrCreateFromEnv();
172*04fd306cSNickeau        try {
173*04fd306cSNickeau            return $executionContext->getRuntimeObject($objectIdentifier);
174*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
175*04fd306cSNickeau            $brandObject = new Brand($brandNameQualified);
176*04fd306cSNickeau            $executionContext->setRuntimeObject($objectIdentifier, $brandObject);
177*04fd306cSNickeau            return $brandObject;
1784cadd4f8SNickeau        }
1794cadd4f8SNickeau
180*04fd306cSNickeau    }
181*04fd306cSNickeau
182*04fd306cSNickeau    private static function getBrandNameFromAbbr(string $name)
183*04fd306cSNickeau    {
184*04fd306cSNickeau        if (!isset(self::$BRAND_ABBR)) {
185*04fd306cSNickeau            $brandDictionary = self::getBrandDictionary();
186*04fd306cSNickeau            foreach ($brandDictionary as $brandName => $brandProperties) {
187*04fd306cSNickeau                $abbr = $brandProperties[self::ABBR_PROPERTY];
188*04fd306cSNickeau                if (empty($abbr)) {
189*04fd306cSNickeau                    continue;
190*04fd306cSNickeau                }
191*04fd306cSNickeau                self::$BRAND_ABBR[$abbr] = $brandName;
192*04fd306cSNickeau            }
193*04fd306cSNickeau        }
194*04fd306cSNickeau        if (isset(self::$BRAND_ABBR[$name])) {
195*04fd306cSNickeau            return self::$BRAND_ABBR[$name];
196*04fd306cSNickeau        }
197*04fd306cSNickeau        return $name;
198*04fd306cSNickeau
199*04fd306cSNickeau    }
200*04fd306cSNickeau
201*04fd306cSNickeau
2024cadd4f8SNickeau    /**
2034cadd4f8SNickeau     * If the brand name is unknown (ie custom)
2044cadd4f8SNickeau     * @return bool
2054cadd4f8SNickeau     */
2064cadd4f8SNickeau    public function isUnknown(): bool
2074cadd4f8SNickeau    {
2084cadd4f8SNickeau        return $this->unknown;
2094cadd4f8SNickeau
2104cadd4f8SNickeau    }
2114cadd4f8SNickeau
2124cadd4f8SNickeau    public function getName(): string
2134cadd4f8SNickeau    {
2144cadd4f8SNickeau        return $this->name;
2154cadd4f8SNickeau    }
2164cadd4f8SNickeau
2174cadd4f8SNickeau    public function __toString()
2184cadd4f8SNickeau    {
2194cadd4f8SNickeau        if ($this->name === Brand::CURRENT_BRAND) {
2204cadd4f8SNickeau            return $this->name . " (" . Site::getTitle() . ")";
2214cadd4f8SNickeau        }
2224cadd4f8SNickeau        return $this->name;
2234cadd4f8SNickeau    }
2244cadd4f8SNickeau
2254cadd4f8SNickeau    /**
2264cadd4f8SNickeau     * Shared/Follow Url template
2274cadd4f8SNickeau     * the endpoint template url (for sharing and following)
2284cadd4f8SNickeau     * @var string $type - the type of button
2294cadd4f8SNickeau     */
2304cadd4f8SNickeau    public function getWebUrlTemplate(string $type): ?string
2314cadd4f8SNickeau    {
2324cadd4f8SNickeau        if (isset($this->brandDict[$type])) {
2334cadd4f8SNickeau            return $this->brandDict[$type]["web"];
2344cadd4f8SNickeau        }
2354cadd4f8SNickeau        return null;
2364cadd4f8SNickeau    }
2374cadd4f8SNickeau
2384cadd4f8SNickeau    /**
2394cadd4f8SNickeau     * Brand button title
2404cadd4f8SNickeau     * @return string
241*04fd306cSNickeau     * @var ?string $type - the button type
2424cadd4f8SNickeau     */
243*04fd306cSNickeau    public function getTitle(string $type = null): ?string
2444cadd4f8SNickeau    {
2454cadd4f8SNickeau        if ($this->name === self::CURRENT_BRAND) {
2464cadd4f8SNickeau            return Site::getTitle();
2474cadd4f8SNickeau        }
248*04fd306cSNickeau        if ($this->brandDict !== null && $type !== null) {
2494cadd4f8SNickeau            if (isset($this->brandDict[$type])) {
2504cadd4f8SNickeau                return $this->brandDict[$type]["popup"];
2514cadd4f8SNickeau            }
2524cadd4f8SNickeau        }
2534cadd4f8SNickeau        return null;
2544cadd4f8SNickeau
2554cadd4f8SNickeau    }
2564cadd4f8SNickeau
2574cadd4f8SNickeau    public function getPrimaryColor(): ?string
2584cadd4f8SNickeau    {
2594cadd4f8SNickeau
2604cadd4f8SNickeau        if ($this->brandDict !== null) {
2614cadd4f8SNickeau            $primaryColor = $this->brandDict["colors"]["primary"];
2624cadd4f8SNickeau            if ($primaryColor !== null) {
2634cadd4f8SNickeau                return $primaryColor;
2644cadd4f8SNickeau            }
2654cadd4f8SNickeau        }
2664cadd4f8SNickeau
2674cadd4f8SNickeau        // Unknown or current brand / unknown color
268*04fd306cSNickeau        try {
269*04fd306cSNickeau            return ExecutionContext::getExecutionContext()
270*04fd306cSNickeau                ->getConfig()
271*04fd306cSNickeau                ->getPrimaryColor();
272*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
2734cadd4f8SNickeau            return null;
274*04fd306cSNickeau        }
2754cadd4f8SNickeau
2764cadd4f8SNickeau    }
2774cadd4f8SNickeau
2784cadd4f8SNickeau    public function getSecondaryColor(): ?string
2794cadd4f8SNickeau    {
2804cadd4f8SNickeau        return $this->secondaryColor;
2814cadd4f8SNickeau    }
2824cadd4f8SNickeau
2834cadd4f8SNickeau    /**
284*04fd306cSNickeau     * @param string|null $type - the button type
2854cadd4f8SNickeau     * @return string|null
2864cadd4f8SNickeau     */
287*04fd306cSNickeau    public function getIconName(?string $type): ?string
2884cadd4f8SNickeau    {
2894cadd4f8SNickeau
2904cadd4f8SNickeau        switch ($this->name) {
2914cadd4f8SNickeau            case self::CURRENT_BRAND:
292*04fd306cSNickeau                try {
293*04fd306cSNickeau                    return Site::getLogoAsSvgImage()
294*04fd306cSNickeau                        ->getWikiId();
295*04fd306cSNickeau                } catch (ExceptionNotFound $e) {
296*04fd306cSNickeau                    // no logo installed
2974cadd4f8SNickeau                }
2984cadd4f8SNickeau                break;
2994cadd4f8SNickeau            default:
3004cadd4f8SNickeau                if (isset($this->brandDict["icons"])) {
3014cadd4f8SNickeau                    return $this->brandDict["icons"][$type];
3024cadd4f8SNickeau                }
3034cadd4f8SNickeau                break;
3044cadd4f8SNickeau        }
3054cadd4f8SNickeau
3064cadd4f8SNickeau        return null;
3074cadd4f8SNickeau    }
3084cadd4f8SNickeau
3094cadd4f8SNickeau    public function getBrandUrl(): ?string
3104cadd4f8SNickeau    {
3114cadd4f8SNickeau        return $this->brandUrl;
3124cadd4f8SNickeau    }
3134cadd4f8SNickeau
3144cadd4f8SNickeau    /**
3154cadd4f8SNickeau     */
3164cadd4f8SNickeau    public function supportButtonType(string $type): bool
3174cadd4f8SNickeau    {
3184cadd4f8SNickeau        switch ($type) {
3194cadd4f8SNickeau            case BrandButton::TYPE_BUTTON_SHARE:
3204cadd4f8SNickeau            case BrandButton::TYPE_BUTTON_FOLLOW:
3214cadd4f8SNickeau                if ($this->getWebUrlTemplate($type) !== null) {
3224cadd4f8SNickeau                    return true;
3234cadd4f8SNickeau                }
3244cadd4f8SNickeau                return false;
3254cadd4f8SNickeau            default:
3264cadd4f8SNickeau            case BrandButton::TYPE_BUTTON_BRAND:
3274cadd4f8SNickeau                return true;
3284cadd4f8SNickeau        }
3294cadd4f8SNickeau    }
3304cadd4f8SNickeau
331*04fd306cSNickeau    /**
332*04fd306cSNickeau     * @throws ExceptionNotFound
333*04fd306cSNickeau     */
334*04fd306cSNickeau    private function getAbbr()
335*04fd306cSNickeau    {
336*04fd306cSNickeau        $value = $this->brandDict['abbr'];
337*04fd306cSNickeau        if (empty($value)) {
338*04fd306cSNickeau            throw new ExceptionNotFound("No abbreviations");
339*04fd306cSNickeau        }
340*04fd306cSNickeau        return $value;
341*04fd306cSNickeau    }
342*04fd306cSNickeau
3434cadd4f8SNickeau
3444cadd4f8SNickeau}
345