xref: /template/strap/ComboStrap/Brand.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
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
1304fd306cSNickeau
144cadd4f8SNickeau    /**
154cadd4f8SNickeau     * The brand of the current application/website
164cadd4f8SNickeau     */
174cadd4f8SNickeau    public const CURRENT_BRAND = "current";
1804fd306cSNickeau    const CANONICAL = "brand";
1904fd306cSNickeau    const ABBR_PROPERTY = 'abbr';
2004fd306cSNickeau    /**
2104fd306cSNickeau     * @var array an array of brand abbreviation as key and their name as value
2204fd306cSNickeau     */
2304fd306cSNickeau    private static array $BRAND_ABBR;
244cadd4f8SNickeau
254cadd4f8SNickeau
264cadd4f8SNickeau    private $secondaryColor;
274cadd4f8SNickeau    private $brandUrl;
284cadd4f8SNickeau
294cadd4f8SNickeau    /**
304cadd4f8SNickeau     * @var array
314cadd4f8SNickeau     */
3204fd306cSNickeau    public static array $brandDictionary;
334cadd4f8SNickeau    /**
344cadd4f8SNickeau     * @var bool
354cadd4f8SNickeau     */
3604fd306cSNickeau    private bool $unknown = false;
374cadd4f8SNickeau    /**
384cadd4f8SNickeau     * @var mixed
394cadd4f8SNickeau     */
404cadd4f8SNickeau    private $brandDict;
414cadd4f8SNickeau
4204fd306cSNickeau
434cadd4f8SNickeau    /**
444cadd4f8SNickeau     * Brand constructor.
454cadd4f8SNickeau     * @param string $name
464cadd4f8SNickeau     */
4704fd306cSNickeau    private function __construct(string $name)
484cadd4f8SNickeau    {
4904fd306cSNickeau
5004fd306cSNickeau        $this->name = $name;
514cadd4f8SNickeau
524cadd4f8SNickeau        /**
534cadd4f8SNickeau         * Get the brands
544cadd4f8SNickeau         */
5504fd306cSNickeau        $brandDictionary = Brand::getBrandDictionary();
564cadd4f8SNickeau
574cadd4f8SNickeau
584cadd4f8SNickeau        /**
594cadd4f8SNickeau         * Build the data for the brand
604cadd4f8SNickeau         */
61*70bbd7f1Sgerardnico        $this->brandDict = $brandDictionary[$this->name] ?? null;
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) {
73*70bbd7f1Sgerardnico                    $colors = $this->brandDict["colors"] ?? null;
74*70bbd7f1Sgerardnico                    if ($colors !== null) {
75*70bbd7f1Sgerardnico                        $this->secondaryColor = $colors["secondary"];
76*70bbd7f1Sgerardnico                    } else {
77*70bbd7f1Sgerardnico                        $this->secondaryColor = null;
78*70bbd7f1Sgerardnico                    }
79*70bbd7f1Sgerardnico                    $this->brandUrl = $this->brandDict["url"] ?? null;
804cadd4f8SNickeau                    return;
814cadd4f8SNickeau                }
824cadd4f8SNickeau                $this->unknown = true;
834cadd4f8SNickeau                break;
844cadd4f8SNickeau        }
854cadd4f8SNickeau
864cadd4f8SNickeau    }
874cadd4f8SNickeau
884cadd4f8SNickeau    /**
894cadd4f8SNickeau     * @return string[]
904cadd4f8SNickeau     */
914cadd4f8SNickeau    public static function getAllKnownBrandNames(): array
924cadd4f8SNickeau    {
934cadd4f8SNickeau
9404fd306cSNickeau        $brands = self::getAllBrands();
9504fd306cSNickeau        $brandNames = [self::CURRENT_BRAND];
9604fd306cSNickeau        foreach ($brands as $brand) {
9704fd306cSNickeau            $brandNames[] = $brand->getName();
9804fd306cSNickeau            try {
9904fd306cSNickeau                $brandNames[] = $brand->getAbbr();
10004fd306cSNickeau            } catch (ExceptionNotFound $e) {
10104fd306cSNickeau                // ok
10204fd306cSNickeau            }
10304fd306cSNickeau        }
10404fd306cSNickeau        return $brandNames;
10504fd306cSNickeau
1064cadd4f8SNickeau    }
1074cadd4f8SNickeau
10804fd306cSNickeau
1094cadd4f8SNickeau    /**
11004fd306cSNickeau     * @return Brand[]
1114cadd4f8SNickeau     */
11204fd306cSNickeau    public static function getAllBrands(): array
1134cadd4f8SNickeau    {
1144cadd4f8SNickeau        $brandDictionary = self::getBrandDictionary();
11504fd306cSNickeau        $brands = [];
11604fd306cSNickeau        foreach (array_keys($brandDictionary) as $brandName) {
11704fd306cSNickeau            $brands[] = self::create($brandName);
11804fd306cSNickeau        }
11904fd306cSNickeau        return $brands;
1204cadd4f8SNickeau    }
1214cadd4f8SNickeau
1224cadd4f8SNickeau    /**
12304fd306cSNickeau     * @param $type - the button type (ie one of {@link BrandButton::TYPE_BUTTONS}
12404fd306cSNickeau     * @return array - the brand names that can be used as type in the brand button
12504fd306cSNickeau     */
12604fd306cSNickeau    public static function getBrandNamesForButtonType($type): array
12704fd306cSNickeau    {
12804fd306cSNickeau        $brands = self::getAllBrands();
12904fd306cSNickeau        $brandNamesForType = [];
13004fd306cSNickeau        foreach ($brands as $brand) {
13104fd306cSNickeau            if ($brand->supportButtonType($type)) {
13204fd306cSNickeau                $brandNamesForType[] = $brand->getName();
13304fd306cSNickeau                try {
13404fd306cSNickeau                    $brandNamesForType[] = $brand->getAbbr();
13504fd306cSNickeau                } catch (ExceptionNotFound $e) {
13604fd306cSNickeau                    // ok
13704fd306cSNickeau                }
13804fd306cSNickeau            }
13904fd306cSNickeau        }
14004fd306cSNickeau        return $brandNamesForType;
14104fd306cSNickeau    }
14204fd306cSNickeau
14304fd306cSNickeau    /**
14404fd306cSNickeau     *
1454cadd4f8SNickeau     */
1464cadd4f8SNickeau    public static function getBrandDictionary(): array
1474cadd4f8SNickeau    {
14804fd306cSNickeau        if (!isset(Brand::$brandDictionary)) {
14904fd306cSNickeau            try {
1504cadd4f8SNickeau                Brand::$brandDictionary = Dictionary::getFrom("brands");
15104fd306cSNickeau            } catch (ExceptionCompile $e) {
15204fd306cSNickeau                // Should never happens
15304fd306cSNickeau                Brand::$brandDictionary = [];
15404fd306cSNickeau                LogUtility::error("We can't load the brands dictionary. Error: " . $e->getMessage(), self::CANONICAL, $e);
15504fd306cSNickeau            }
1564cadd4f8SNickeau        }
1574cadd4f8SNickeau        return Brand::$brandDictionary;
1584cadd4f8SNickeau    }
1594cadd4f8SNickeau
1604cadd4f8SNickeau
1614cadd4f8SNickeau    /**
1624cadd4f8SNickeau     * @var string
1634cadd4f8SNickeau     * The name of the brand,
1644cadd4f8SNickeau     * for company, we follow the naming of
1654cadd4f8SNickeau     * https://github.com/ellisonleao/sharer.js
1664cadd4f8SNickeau     */
1674cadd4f8SNickeau    private $name;
1684cadd4f8SNickeau
16904fd306cSNickeau
1704cadd4f8SNickeau    public static function create(string $brandName): Brand
1714cadd4f8SNickeau    {
17204fd306cSNickeau
17304fd306cSNickeau        $brandNameQualified = strtolower($brandName);
17404fd306cSNickeau        $brandNameQualified = Brand::getBrandNameFromAbbr($brandNameQualified);
17504fd306cSNickeau        $objectIdentifier = self::CANONICAL . "-" . $brandNameQualified;
17604fd306cSNickeau        $executionContext = ExecutionContext::getActualOrCreateFromEnv();
17704fd306cSNickeau        try {
17804fd306cSNickeau            return $executionContext->getRuntimeObject($objectIdentifier);
17904fd306cSNickeau        } catch (ExceptionNotFound $e) {
18004fd306cSNickeau            $brandObject = new Brand($brandNameQualified);
18104fd306cSNickeau            $executionContext->setRuntimeObject($objectIdentifier, $brandObject);
18204fd306cSNickeau            return $brandObject;
1834cadd4f8SNickeau        }
1844cadd4f8SNickeau
18504fd306cSNickeau    }
18604fd306cSNickeau
18704fd306cSNickeau    private static function getBrandNameFromAbbr(string $name)
18804fd306cSNickeau    {
18904fd306cSNickeau        if (!isset(self::$BRAND_ABBR)) {
19004fd306cSNickeau            $brandDictionary = self::getBrandDictionary();
19104fd306cSNickeau            foreach ($brandDictionary as $brandName => $brandProperties) {
192*70bbd7f1Sgerardnico                $abbr = $brandProperties[self::ABBR_PROPERTY] ?? null;
19304fd306cSNickeau                if (empty($abbr)) {
19404fd306cSNickeau                    continue;
19504fd306cSNickeau                }
19604fd306cSNickeau                self::$BRAND_ABBR[$abbr] = $brandName;
19704fd306cSNickeau            }
19804fd306cSNickeau        }
19904fd306cSNickeau        if (isset(self::$BRAND_ABBR[$name])) {
20004fd306cSNickeau            return self::$BRAND_ABBR[$name];
20104fd306cSNickeau        }
20204fd306cSNickeau        return $name;
20304fd306cSNickeau
20404fd306cSNickeau    }
20504fd306cSNickeau
20604fd306cSNickeau
2074cadd4f8SNickeau    /**
2084cadd4f8SNickeau     * If the brand name is unknown (ie custom)
2094cadd4f8SNickeau     * @return bool
2104cadd4f8SNickeau     */
2114cadd4f8SNickeau    public function isUnknown(): bool
2124cadd4f8SNickeau    {
2134cadd4f8SNickeau        return $this->unknown;
2144cadd4f8SNickeau
2154cadd4f8SNickeau    }
2164cadd4f8SNickeau
2174cadd4f8SNickeau    public function getName(): string
2184cadd4f8SNickeau    {
2194cadd4f8SNickeau        return $this->name;
2204cadd4f8SNickeau    }
2214cadd4f8SNickeau
2224cadd4f8SNickeau    public function __toString()
2234cadd4f8SNickeau    {
2244cadd4f8SNickeau        if ($this->name === Brand::CURRENT_BRAND) {
2254cadd4f8SNickeau            return $this->name . " (" . Site::getTitle() . ")";
2264cadd4f8SNickeau        }
2274cadd4f8SNickeau        return $this->name;
2284cadd4f8SNickeau    }
2294cadd4f8SNickeau
2304cadd4f8SNickeau    /**
2314cadd4f8SNickeau     * Shared/Follow Url template
2324cadd4f8SNickeau     * the endpoint template url (for sharing and following)
2334cadd4f8SNickeau     * @var string $type - the type of button
2344cadd4f8SNickeau     */
2354cadd4f8SNickeau    public function getWebUrlTemplate(string $type): ?string
2364cadd4f8SNickeau    {
2374cadd4f8SNickeau        if (isset($this->brandDict[$type])) {
2384cadd4f8SNickeau            return $this->brandDict[$type]["web"];
2394cadd4f8SNickeau        }
2404cadd4f8SNickeau        return null;
2414cadd4f8SNickeau    }
2424cadd4f8SNickeau
2434cadd4f8SNickeau    /**
2444cadd4f8SNickeau     * Brand button title
2454cadd4f8SNickeau     * @return string
24604fd306cSNickeau     * @var ?string $type - the button type
2474cadd4f8SNickeau     */
24804fd306cSNickeau    public function getTitle(string $type = null): ?string
2494cadd4f8SNickeau    {
2504cadd4f8SNickeau        if ($this->name === self::CURRENT_BRAND) {
2514cadd4f8SNickeau            return Site::getTitle();
2524cadd4f8SNickeau        }
25304fd306cSNickeau        if ($this->brandDict !== null && $type !== null) {
2544cadd4f8SNickeau            if (isset($this->brandDict[$type])) {
2554cadd4f8SNickeau                return $this->brandDict[$type]["popup"];
2564cadd4f8SNickeau            }
2574cadd4f8SNickeau        }
2584cadd4f8SNickeau        return null;
2594cadd4f8SNickeau
2604cadd4f8SNickeau    }
2614cadd4f8SNickeau
2624cadd4f8SNickeau    public function getPrimaryColor(): ?string
2634cadd4f8SNickeau    {
2644cadd4f8SNickeau
2654cadd4f8SNickeau        if ($this->brandDict !== null) {
2664cadd4f8SNickeau            $primaryColor = $this->brandDict["colors"]["primary"];
2674cadd4f8SNickeau            if ($primaryColor !== null) {
2684cadd4f8SNickeau                return $primaryColor;
2694cadd4f8SNickeau            }
2704cadd4f8SNickeau        }
2714cadd4f8SNickeau
2724cadd4f8SNickeau        // Unknown or current brand / unknown color
27304fd306cSNickeau        try {
27404fd306cSNickeau            return ExecutionContext::getExecutionContext()
27504fd306cSNickeau                ->getConfig()
27604fd306cSNickeau                ->getPrimaryColor();
27704fd306cSNickeau        } catch (ExceptionNotFound $e) {
2784cadd4f8SNickeau            return null;
27904fd306cSNickeau        }
2804cadd4f8SNickeau
2814cadd4f8SNickeau    }
2824cadd4f8SNickeau
2834cadd4f8SNickeau    public function getSecondaryColor(): ?string
2844cadd4f8SNickeau    {
2854cadd4f8SNickeau        return $this->secondaryColor;
2864cadd4f8SNickeau    }
2874cadd4f8SNickeau
2884cadd4f8SNickeau    /**
28904fd306cSNickeau     * @param string|null $type - the button type
2904cadd4f8SNickeau     * @return string|null
2914cadd4f8SNickeau     */
29204fd306cSNickeau    public function getIconName(?string $type): ?string
2934cadd4f8SNickeau    {
2944cadd4f8SNickeau
2954cadd4f8SNickeau        switch ($this->name) {
2964cadd4f8SNickeau            case self::CURRENT_BRAND:
29704fd306cSNickeau                try {
29804fd306cSNickeau                    return Site::getLogoAsSvgImage()
29904fd306cSNickeau                        ->getWikiId();
30004fd306cSNickeau                } catch (ExceptionNotFound $e) {
30104fd306cSNickeau                    // no logo installed
3024cadd4f8SNickeau                }
3034cadd4f8SNickeau                break;
3044cadd4f8SNickeau            default:
3054cadd4f8SNickeau                if (isset($this->brandDict["icons"])) {
3064cadd4f8SNickeau                    return $this->brandDict["icons"][$type];
3074cadd4f8SNickeau                }
3084cadd4f8SNickeau                break;
3094cadd4f8SNickeau        }
3104cadd4f8SNickeau
3114cadd4f8SNickeau        return null;
3124cadd4f8SNickeau    }
3134cadd4f8SNickeau
3144cadd4f8SNickeau    public function getBrandUrl(): ?string
3154cadd4f8SNickeau    {
3164cadd4f8SNickeau        return $this->brandUrl;
3174cadd4f8SNickeau    }
3184cadd4f8SNickeau
3194cadd4f8SNickeau    /**
3204cadd4f8SNickeau     */
3214cadd4f8SNickeau    public function supportButtonType(string $type): bool
3224cadd4f8SNickeau    {
3234cadd4f8SNickeau        switch ($type) {
3244cadd4f8SNickeau            case BrandButton::TYPE_BUTTON_SHARE:
3254cadd4f8SNickeau            case BrandButton::TYPE_BUTTON_FOLLOW:
3264cadd4f8SNickeau                if ($this->getWebUrlTemplate($type) !== null) {
3274cadd4f8SNickeau                    return true;
3284cadd4f8SNickeau                }
3294cadd4f8SNickeau                return false;
3304cadd4f8SNickeau            default:
3314cadd4f8SNickeau            case BrandButton::TYPE_BUTTON_BRAND:
3324cadd4f8SNickeau                return true;
3334cadd4f8SNickeau        }
3344cadd4f8SNickeau    }
3354cadd4f8SNickeau
33604fd306cSNickeau    /**
33704fd306cSNickeau     * @throws ExceptionNotFound
33804fd306cSNickeau     */
33904fd306cSNickeau    private function getAbbr()
34004fd306cSNickeau    {
341*70bbd7f1Sgerardnico        $value = $this->brandDict['abbr'] ?? null;
34204fd306cSNickeau        if (empty($value)) {
34304fd306cSNickeau            throw new ExceptionNotFound("No abbreviations");
34404fd306cSNickeau        }
34504fd306cSNickeau        return $value;
34604fd306cSNickeau    }
34704fd306cSNickeau
3484cadd4f8SNickeau
3494cadd4f8SNickeau}
350