186 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace WapplerSystems\Meilisearch\System\Util;
 | 
						|
 | 
						|
/***************************************************************
 | 
						|
 *  Copyright notice
 | 
						|
 *
 | 
						|
 *  (c) 2019 Timo Hund <timo.hund@dkd.de>
 | 
						|
 *  All rights reserved
 | 
						|
 *
 | 
						|
 *  This script is part of the TYPO3 project. The TYPO3 project is
 | 
						|
 *  free software; you can redistribute it and/or modify
 | 
						|
 *  it under the terms of the GNU General Public License as published by
 | 
						|
 *  the Free Software Foundation; either version 3 of the License, or
 | 
						|
 *  (at your option) any later version.
 | 
						|
 *
 | 
						|
 *  The GNU General Public License can be found at
 | 
						|
 *  http://www.gnu.org/copyleft/gpl.html.
 | 
						|
 *
 | 
						|
 *  This script is distributed in the hope that it will be useful,
 | 
						|
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 *  GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 *  This copyright notice MUST APPEAR in all copies of the script!
 | 
						|
 ***************************************************************/
 | 
						|
 | 
						|
 | 
						|
use TYPO3\CMS\Core\Exception\SiteNotFoundException;
 | 
						|
use TYPO3\CMS\Core\Site\Entity\Site;
 | 
						|
use TYPO3\CMS\Core\Site\SiteFinder;
 | 
						|
use TYPO3\CMS\Core\Utility\GeneralUtility;
 | 
						|
 | 
						|
/**
 | 
						|
 * This class contains related functions for the new site management that was introduced with TYPO3 9.
 | 
						|
 */
 | 
						|
class SiteUtility
 | 
						|
{
 | 
						|
 | 
						|
    /**
 | 
						|
     * Determines if the site where the page belongs to is managed with the TYPO3 site management.
 | 
						|
     *
 | 
						|
     * @param int $pageId
 | 
						|
     * @return boolean
 | 
						|
     */
 | 
						|
    public static function getIsSiteManagedSite(int $pageId): bool
 | 
						|
    {
 | 
						|
 | 
						|
        $siteFinder = GeneralUtility::makeInstance(SiteFinder::class);
 | 
						|
        try {
 | 
						|
            /* @var SiteFinder $siteFinder */
 | 
						|
            $site = $siteFinder->getSiteByPageId($pageId);
 | 
						|
        } catch (SiteNotFoundException $e) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        return $site instanceof Site;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method is used to retrieve the connection configuration from the TYPO3 site configuration.
 | 
						|
     *
 | 
						|
     * Note: Language context properties have precedence over global settings.
 | 
						|
     *
 | 
						|
     * The configuration is done in the globals configuration of a site, and be extended in the language specific configuration
 | 
						|
     * of a site.
 | 
						|
     *
 | 
						|
     * Typically everything except the core name is configured on the global level and the core name differs for each language.
 | 
						|
     *
 | 
						|
     * In addition every property can be defined for the ```read``` and ```write``` scope.
 | 
						|
     *
 | 
						|
     * The convention for property keys is "meilisearch_{propertyName}_{scope}". With the configuration "meilisearch_host_read" you define the host
 | 
						|
     * for the meilisearch read connection.
 | 
						|
     *
 | 
						|
     * @param Site $typo3Site
 | 
						|
     * @param string $property
 | 
						|
     * @param int $languageId
 | 
						|
     * @param string $scope
 | 
						|
     * @param string $defaultValue
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public static function getConnectionProperty(Site $typo3Site, string $property, int $languageId, string $scope, string $defaultValue = null): string
 | 
						|
    {
 | 
						|
        $value = self::getConnectionPropertyOrFallback($typo3Site, $property, $languageId, $scope);
 | 
						|
        if ($value === null) {
 | 
						|
            return $defaultValue;
 | 
						|
        }
 | 
						|
        return $value;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Resolves site configuration properties.
 | 
						|
     * Language context properties have precedence over global settings.
 | 
						|
     *
 | 
						|
     * @param Site $typo3Site
 | 
						|
     * @param string $property
 | 
						|
     * @param int $languageId
 | 
						|
     * @param string $scope
 | 
						|
     * @return mixed
 | 
						|
     */
 | 
						|
    protected static function getConnectionPropertyOrFallback(Site $typo3Site, string $property, int $languageId, string $scope)
 | 
						|
    {
 | 
						|
        if ($scope === 'write' && !self::writeConnectionIsEnabled($typo3Site, $languageId)) {
 | 
						|
            $scope = 'read';
 | 
						|
        }
 | 
						|
 | 
						|
        // convention key meilisearch_$property_$scope
 | 
						|
        $keyToCheck = 'meilisearch_' . $property . '_' . $scope;
 | 
						|
 | 
						|
        // convention fallback key meilisearch_$property_read
 | 
						|
        $fallbackKey = 'meilisearch_' . $property . '_read';
 | 
						|
 | 
						|
        // try to find language specific setting if found return it
 | 
						|
        $languageSpecificConfiguration = $typo3Site->getLanguageById($languageId)->toArray();
 | 
						|
        $value = self::getValueOrFallback($languageSpecificConfiguration, $keyToCheck, $fallbackKey);
 | 
						|
        if ($value !== null) {
 | 
						|
            return $value;
 | 
						|
        }
 | 
						|
 | 
						|
        // if not found check global configuration
 | 
						|
        $siteBaseConfiguration = $typo3Site->getConfiguration();
 | 
						|
        return self::getValueOrFallback($siteBaseConfiguration, $keyToCheck, $fallbackKey);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Checks whether write connection is enabled.
 | 
						|
     * Language context properties have precedence over global settings.
 | 
						|
     *
 | 
						|
     * @param Site $typo3Site
 | 
						|
     * @param int $languageId
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    protected static function writeConnectionIsEnabled(Site $typo3Site, int $languageId): bool
 | 
						|
    {
 | 
						|
        $languageSpecificConfiguration = $typo3Site->getLanguageById($languageId)->toArray();
 | 
						|
        $value = self::getValueOrFallback($languageSpecificConfiguration, 'meilisearch_use_write_connection', 'meilisearch_use_write_connection');
 | 
						|
        if ($value !== null) {
 | 
						|
            return $value;
 | 
						|
        }
 | 
						|
 | 
						|
        $siteBaseConfiguration = $typo3Site->getConfiguration();
 | 
						|
        $value = self::getValueOrFallback($siteBaseConfiguration, 'meilisearch_use_write_connection', 'meilisearch_use_write_connection');
 | 
						|
        if ($value !== null) {
 | 
						|
            return $value;
 | 
						|
        }
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param array $data
 | 
						|
     * @param string $keyToCheck
 | 
						|
     * @param string $fallbackKey
 | 
						|
     * @return string|bool|null
 | 
						|
     */
 | 
						|
    protected static function getValueOrFallback(array $data, string $keyToCheck, string $fallbackKey)
 | 
						|
    {
 | 
						|
        $value = $data[$keyToCheck] ?? null;
 | 
						|
        if ($value === '0' || $value === 0 || !empty($value)) {
 | 
						|
            return self::evaluateConfigurationData($value);
 | 
						|
        }
 | 
						|
 | 
						|
        return self::evaluateConfigurationData($data[$fallbackKey] ?? null);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Evaluate configuration data
 | 
						|
     *
 | 
						|
     * Setting boolean values via environment variables
 | 
						|
     * results in strings like 'false' that may be misinterpreted
 | 
						|
     * thus we check for boolean values in strings.
 | 
						|
     *
 | 
						|
     * @param string|bool|null $value
 | 
						|
     * @return string|bool|null
 | 
						|
     */
 | 
						|
    protected static function evaluateConfigurationData($value)
 | 
						|
    {
 | 
						|
        if ($value === 'true') {
 | 
						|
            return true;
 | 
						|
        } elseif ($value === 'false') {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        return $value;
 | 
						|
    }
 | 
						|
}
 |