* @author Thomas Löffler * @author Tomas Norre Mikkelsen */ class TerIndexer extends \ApacheSolrForTypo3\Solr\IndexQueue\Indexer { /** * @var \TYPO3\CMS\Extbase\Object\ObjectManager */ protected $objectManager; /** * @var \T3o\TerFe2\Domain\Repository\ExtensionRepository */ protected $extensionRepository; public function __construct(array $options = array()) { parent::__construct($options); $this->objectManager = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\ObjectManager::class); $this->extensionRepository = $this->objectManager->get(\T3o\TerFe2\Domain\Repository\ExtensionRepository::class); $this->extensionRepository->setShowInsecure(false); } /** * Converts an item array (record) to a Solr document by mapping the * record's fields onto Solr document fields as configured in TypoScript. * * @param Item $item An index queue item * @param int $language Language Id * @return \Apache_Solr_Document The Solr document converted from the record */ protected function itemToDocument(Item $item, $language = 0) { $document = null; $itemRecord = $this->getFullItemRecord($item, $language); if (!is_null($itemRecord)) { $itemIndexingConfiguration = $this->getItemTypeConfiguration( $item, $language ); $document = $this->getBaseDocument($item, $itemRecord); $document = $this->addDocumentFieldsFromTyposcript($document, $itemIndexingConfiguration, $itemRecord); $document = $this->addSpecialFields($document, $itemRecord); } return $document; } /** * @param \Apache_Solr_Document $document * @param array $itemRecord * @return \Apache_Solr_Document */ public function addSpecialFields(\Apache_Solr_Document $document, array $itemRecord) { $extension = $this->extensionRepository->findByUid($itemRecord['uid']); if ($extension instanceof \T3o\TerFe2\Domain\Model\Extension && $extension->getLastVersion() instanceof \T3o\TerFe2\Domain\Model\Version) { $typo3Dependency = $this->getDependencyVersionForPackage($extension, 'typo3'); $document->setField('extensionMinTYPO3Version_tIntS', $typo3Dependency['minimum']); $document->setField('extensionMaxTYPO3Version_tIntS', $typo3Dependency['maximum']); $dependencyString = ''; $dependencyString .= $typo3Dependency['minimum'] > 0 ? VersionNumberUtility::convertIntegerToVersionNumber($typo3Dependency['minimum']) : ''; $dependencyString .= $typo3Dependency['maximum'] > 0 ? ' - ' . VersionNumberUtility::convertIntegerToVersionNumber($typo3Dependency['maximum']) : ''; $document->setField('extensionDependency_stringS', $dependencyString ?: 'N/A'); // is last version insecure $document->setField('insecure_boolS', $extension->getLastVersion()->getReviewState() === -1); $document->setField('outdated_boolS', $extension->getLastVersion()->getReviewState() === -2); // composer support $document->setField('supportsComposer_boolS', false); $document->setField('composerName_stringS', ''); if ($extension->getComposerName()) { $document->setField('supportsComposer_boolS', true); $document->setField('composerName_stringS', $extension->getComposerName()); } // does this extension supports different versions? // @todo: use JSON with all versions to get them $document->setField('supports7_boolS', false); $document->setField('supports8_boolS', false); $typo3Support = []; if (VersionUtility::doesExtensionSupportTypo3Version($extension, 7006000)) { $typo3Support[] = '7 LTS'; $document->setField('supports7_boolS', true); } if (VersionUtility::doesExtensionSupportTypo3Version($extension, 8007000)) { $typo3Support[] = '8 LTS'; $document->setField('supports8_boolS', true); } $document->setField('typo3support_stringM', $typo3Support); $extensionIcon = $this->getExtensionIcon($itemRecord['ext_key'], $extension->getLastVersion()->getVersionString()); $document->setField('extensionIcon_stringS', $extensionIcon); // add documentation link /** @var \T3o\TerFe2\Service\DocumentationService $documentationService */ $documentationService = GeneralUtility::makeInstance(\T3o\TerFe2\Service\DocumentationService::class); $documentationLink = $documentationService->getDocumentationLink($extension->getExtKey(), $extension->getLastVersion()->getVersionString(), true); $document->setField('extensionDocumentationLink_stringS', $documentationLink); // use external manual if given if ($extension->getExternalManual()) { $document->setField('extensionDocumentationLink_stringS', $extension->getExternalManual()); } // has manual $document->setField('hasManual_boolS', false); if ($documentationLink || $extension->getExternalManual()) { $document->setField('hasManual_boolS', true); } // get multiple authors $authors = []; if ($extension->getLastVersion() && $extension->getLastVersion()->getAuthor()) { $authors = GeneralUtility::trimExplode(',', $extension->getLastVersion()->getAuthor()->getName()); if ($extension->getLastVersion()->getAuthor()->getCompany()) { // Add company name to author $authors[] = $extension->getLastVersion()->getAuthor()->getCompany(); } } $document->setField('author_textWstM', $authors); } return $document; } /** * get the minimum dependency of an extension for a given $relationName (extension, php version, TYPO3 version...) * * @param \T3o\TerFe2\Domain\Model\Extension $extension * @param string $relationName The dependency to get the version from (e.g. "typo3" to get the minimum typo3 version) * @return array */ protected function getDependencyVersionForPackage(\T3o\TerFe2\Domain\Model\Extension $extension, $relationName) { $versions = array( 'minimum' => 0, 'maximum' => 0 ); foreach ($extension->getLastVersion()->getSoftwareRelations() as $relation) { if ($relation->getRelationType() === 'depends' && $relation->getRelationKey() === $relationName) { $versions = array( 'minimum' => $relation->getMinimumVersion(), 'maximum' => $relation->getMaximumVersion() ); break; } } return $versions; } /** * get the relative path for the extension icon * could be png or gif * * @param $extensionKey * @param $extensionVersion * @return string */ protected function getExtensionIcon($extensionKey, $extensionVersion) { $fileTypesToCheck = [ 'svg', 'png', 'gif' ]; $iconPath = 'fileadmin/ter/'; $icon = ''; foreach ($fileTypesToCheck as $fileType) { $iconFile = $this->generateIconFileName( $extensionKey, $extensionVersion, $fileType ); if (file_exists(PATH_site . $iconPath . $iconFile)) { $icon = \T3o\TerFe2\Utility\FileUtility::getRelativeUrlFromAbsolutePath($iconPath . $iconFile); break; } } return $icon; } /** * generate the path to an extension icon for a specific version * * @param $extension * @param $version * @param $fileType * @return string */ protected function generateIconFileName($extension, $version, $fileType) { if (empty($extension) || empty($version) || empty($fileType)) { return ''; } $extension = strtolower($extension); $fileType = strtolower(trim($fileType, '. ')); return $extension[0] . '/' . $extension[1] . '/' . $extension . '_' . $version . '.' . $fileType; } }