190 lines
6.1 KiB
PHP
190 lines
6.1 KiB
PHP
<?php
|
|
namespace WapplerSystems\Meilisearch\Domain\Search\ResultSet\Facets;
|
|
|
|
/*
|
|
* This file is part of the TYPO3 CMS project.
|
|
*
|
|
* It is free software; you can redistribute it and/or modify it under
|
|
* the terms of the GNU General Public License, either version 2
|
|
* of the License, or any later version.
|
|
*
|
|
* For the full copyright and license information, please read the
|
|
* LICENSE.txt file that was distributed with this source code.
|
|
*
|
|
* The TYPO3 project - inspiring people to share!
|
|
*/
|
|
|
|
use WapplerSystems\Meilisearch\Domain\Search\ResultSet\Facets\OptionBased\AbstractOptionsFacet;
|
|
use WapplerSystems\Meilisearch\Domain\Search\ResultSet\SearchResultSet;
|
|
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
|
use TYPO3\CMS\Extbase\Object\ObjectManagerInterface;
|
|
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
|
|
|
|
/**
|
|
* Class AbstractFacetParser
|
|
*
|
|
* @author Frans Saris <frans@beech.it>
|
|
* @author Timo Hund <timo.hund@dkd.de>
|
|
*/
|
|
abstract class AbstractFacetParser implements FacetParserInterface
|
|
{
|
|
/**
|
|
* @var ContentObjectRenderer
|
|
*/
|
|
protected static $reUseAbleContentObject;
|
|
|
|
/**
|
|
* @var ObjectManagerInterface
|
|
*/
|
|
protected $objectManager;
|
|
|
|
/**
|
|
* @param ObjectManagerInterface $objectManager
|
|
*/
|
|
public function injectObjectManager(ObjectManagerInterface $objectManager)
|
|
{
|
|
$this->objectManager = $objectManager;
|
|
}
|
|
|
|
/**
|
|
* @return ContentObjectRenderer
|
|
*/
|
|
protected function getReUseAbleContentObject()
|
|
{
|
|
/** @var $contentObject ContentObjectRenderer */
|
|
if (self::$reUseAbleContentObject !== null) {
|
|
return self::$reUseAbleContentObject;
|
|
}
|
|
|
|
self::$reUseAbleContentObject = GeneralUtility::makeInstance(ContentObjectRenderer::class);
|
|
return self::$reUseAbleContentObject;
|
|
}
|
|
|
|
/**
|
|
* @param array $configuration
|
|
* @return string
|
|
*/
|
|
protected function getPlainLabelOrApplyCObject($configuration)
|
|
{
|
|
// when no label is configured we return an empty string
|
|
if (!isset($configuration['label'])) {
|
|
return '';
|
|
}
|
|
|
|
// when no sub configuration is set, we use the string, configured as label
|
|
if (!isset($configuration['label.'])) {
|
|
return $configuration['label'];
|
|
}
|
|
|
|
// when label and label. was set, we apply the cObject
|
|
return $this->getReUseAbleContentObject()->cObjGetSingle($configuration['label'], $configuration['label.']);
|
|
}
|
|
|
|
/**
|
|
* @param mixed $value
|
|
* @param integer $count
|
|
* @param string $facetName
|
|
* @param array $facetConfiguration
|
|
* @return string
|
|
*/
|
|
protected function getLabelFromRenderingInstructions($value, $count, $facetName, $facetConfiguration)
|
|
{
|
|
$hasRenderingInstructions = isset($facetConfiguration['renderingInstruction']) && isset($facetConfiguration['renderingInstruction.']);
|
|
if (!$hasRenderingInstructions) {
|
|
return $value;
|
|
}
|
|
|
|
$this->getReUseAbleContentObject()->start(['optionValue' => $value, 'optionCount' => $count, 'facetName' => $facetName]);
|
|
return $this->getReUseAbleContentObject()->cObjGetSingle(
|
|
$facetConfiguration['renderingInstruction'],
|
|
$facetConfiguration['renderingInstruction.']
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
* Retrieves the active facetValue for a facet from the search request.
|
|
* @param SearchResultSet $resultSet
|
|
* @param string $facetName
|
|
* @return array
|
|
*/
|
|
protected function getActiveFacetValuesFromRequest(SearchResultSet $resultSet, $facetName)
|
|
{
|
|
$activeFacetValues = $resultSet->getUsedSearchRequest()->getActiveFacetValuesByName($facetName);
|
|
$activeFacetValues = is_array($activeFacetValues) ? $activeFacetValues : [];
|
|
|
|
return $activeFacetValues;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param array $facetValuesFromMeilisearchResponse
|
|
* @param array $facetValuesFromSearchRequest
|
|
* @return mixed
|
|
*/
|
|
protected function getMergedFacetValueFromSearchRequestAndMeilisearchResponse($facetValuesFromMeilisearchResponse, $facetValuesFromSearchRequest)
|
|
{
|
|
$facetValueItemsToCreate = $facetValuesFromMeilisearchResponse;
|
|
|
|
foreach ($facetValuesFromSearchRequest as $valueFromRequest) {
|
|
// if we have options in the request that have not been in the response we add them with a count of 0
|
|
if (!isset($facetValueItemsToCreate[$valueFromRequest])) {
|
|
$facetValueItemsToCreate[$valueFromRequest] = 0;
|
|
}
|
|
}
|
|
return $facetValueItemsToCreate;
|
|
}
|
|
|
|
/**
|
|
* @param AbstractOptionsFacet $facet
|
|
* @param array $facetConfiguration
|
|
* @return AbstractOptionsFacet
|
|
*/
|
|
protected function applyManualSortOrder(AbstractOptionsFacet $facet, array $facetConfiguration)
|
|
{
|
|
if (!isset($facetConfiguration['manualSortOrder'])) {
|
|
return $facet;
|
|
}
|
|
$fields = GeneralUtility::trimExplode(',', $facetConfiguration['manualSortOrder']);
|
|
// @extensionScannerIgnoreLine
|
|
$sortedOptions = $facet->getOptions()->getManualSortedCopy($fields);
|
|
|
|
// @extensionScannerIgnoreLine
|
|
$facet->setOptions($sortedOptions);
|
|
|
|
return $facet;
|
|
}
|
|
|
|
/**
|
|
* @param AbstractOptionsFacet $facet
|
|
* @param array $facetConfiguration
|
|
* @return AbstractOptionsFacet
|
|
*/
|
|
protected function applyReverseOrder(AbstractOptionsFacet $facet, array $facetConfiguration)
|
|
{
|
|
if (empty($facetConfiguration['reverseOrder'])) {
|
|
return $facet;
|
|
}
|
|
|
|
// @extensionScannerIgnoreLine
|
|
$facet->setOptions($facet->getOptions()->getReversedOrderCopy());
|
|
|
|
return $facet;
|
|
}
|
|
|
|
/**
|
|
* @param mixed $value
|
|
* @param array $facetConfiguration
|
|
* @return boolean
|
|
*/
|
|
protected function getIsExcludedFacetValue($value, array $facetConfiguration)
|
|
{
|
|
if (!isset($facetConfiguration['excludeValues'])) {
|
|
return false;
|
|
}
|
|
|
|
$excludedValue = GeneralUtility::trimExplode(',', $facetConfiguration['excludeValues']);
|
|
return in_array($value, $excludedValue);
|
|
}
|
|
}
|