View source
<?php
namespace Drupal\search_api_solr_multilingual\Entity;
use Drupal\Component\Serialization\Json;
use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\search_api_solr\Utility\Utility as SearchApiSolrUtility;
use Drupal\search_api_solr_multilingual\SolrFieldTypeInterface;
use Drupal\search_api_solr_multilingual\Utility\Utility;
class SolrFieldType extends ConfigEntityBase implements SolrFieldTypeInterface {
protected $id;
protected $label;
protected $managed_schema;
protected $minimum_solr_version;
protected $field_type;
protected $field_type_language_code;
protected $domains;
protected $text_files;
public function getFieldType() {
return $this->field_type;
}
public function getFieldTypeLanguageCode() {
return $this->field_type_language_code;
}
public function getDomains() {
return empty($this->domains) ? [
'generic',
] : $this->domains;
}
public static function getAvailableDomains() {
$domains = [
'generic',
];
$config_factory = \Drupal::configFactory();
foreach ($config_factory
->listAll('search_api_solr_multilingual.solr_field_type.') as $field_type_name) {
$config = $config_factory
->get($field_type_name);
$domains = array_merge($domains, $config
->get('domains'));
}
sort($domains);
return array_unique($domains);
}
public function getFieldTypeAsJson() {
$field_type = $this->field_type;
unset($field_type['analyzers']);
foreach ($this->field_type['analyzers'] as $analyzer) {
$type = 'analyzer';
if (!empty($analyzer['type'])) {
if ('multiterm' == $analyzer['type']) {
$type = 'multiTermAnalyzer';
}
else {
$type = $analyzer['type'] . 'Analyzer';
}
unset($analyzer['type']);
}
$field_type[$type] = $analyzer;
}
return Json::encode($field_type);
}
public function setFieldTypeAsJson($field_type) {
$field_type = $this->field_type = Json::decode($field_type);
foreach ([
'index' => 'indexAnalyzer',
'query' => 'queryAnalyzer',
'multiterm' => 'multiTermAnalyzer',
'analyzer' => 'analyzer',
] as $type => $analyzer) {
if (!empty($field_type[$analyzer])) {
unset($this->field_type[$analyzer]);
if ($type != $analyzer) {
$field_type[$analyzer]['type'] = $type;
}
$this->field_type['analyzers'][] = $field_type[$analyzer];
}
}
return $this;
}
public function getFieldTypeAsXml($add_commment = TRUE) {
$root = new \SimpleXMLElement('<fieldType/>');
$f = function (\SimpleXMLElement $element, array $attributes) use (&$f) {
foreach ($attributes as $key => $value) {
if (is_scalar($value)) {
$element
->addAttribute($key, $value);
}
elseif (is_array($value)) {
if (array_key_exists(0, $value)) {
$key = rtrim($key, 's');
foreach ($value as $inner_attributes) {
$child = $element
->addChild($key);
$f($child, $inner_attributes);
}
}
else {
$child = $element
->addChild($key);
$f($child, $value);
}
}
}
};
$f($root, $this->field_type);
$comment = '';
if ($add_commment) {
$comment = "<!--\n " . $this
->label() . "\n " . ($this
->isManagedSchema() ? " for managed schema\n " : '') . $this
->getMinimumSolrVersion() . "\n-->\n";
}
$dom = dom_import_simplexml($root)->ownerDocument;
$dom->formatOutput = TRUE;
$formatted_xml_string = $dom
->saveXML();
return $comment . preg_replace('/<\\?.*?\\?>\\s*\\n?/', '', $formatted_xml_string);
}
public function getDynamicFields() {
$dynamic_fields = [];
foreach (array(
'ts',
'tm',
'terms_ts',
'terms_tm',
) as $prefix) {
$dynamic_fields[] = [
'name' => SearchApiSolrUtility::encodeSolrName(Utility::getLanguageSpecificSolrDynamicFieldPrefix($prefix, $this->field_type_language_code)) . '*',
'type' => $this->field_type['name'],
'stored' => TRUE,
'indexed' => TRUE,
'multiValued' => strpos($prefix, 'm') !== FALSE,
'termVectors' => strpos($prefix, 't') === 0,
];
}
return $dynamic_fields;
}
public function getCopyFields() {
$copy_fields = [];
foreach (array(
'ts' => 'terms_ts',
'tm' => 'terms_tm',
) as $src_prefix => $dest_prefix) {
$copy_fields[] = [
'source' => SearchApiSolrUtility::encodeSolrName(Utility::getLanguageSpecificSolrDynamicFieldPrefix($src_prefix, $this->field_type_language_code)) . '*',
'dest' => SearchApiSolrUtility::encodeSolrName(Utility::getLanguageSpecificSolrDynamicFieldPrefix($dest_prefix, $this->field_type_language_code)) . '*',
];
}
return $copy_fields;
}
public function getFieldTypeName() {
return isset($this->field_type['name']) ? $this->field_type['name'] : '';
}
public function getTextFiles() {
return $this->text_files;
}
public function addTextFile($name, $content) {
$this->text_files[$name] = preg_replace('/\\R/u', "\n", $content);
}
public function setTextFiles($text_files) {
$this->text_files = [];
foreach ($text_files as $name => $content) {
$this
->addTextFile($name, $content);
}
}
public function isManagedSchema() {
return $this->managed_schema;
}
public function setManagedSchema($managed_schema) {
$this->managed_schema = $managed_schema;
}
public function getMinimumSolrVersion() {
return $this->minimum_solr_version;
}
public function setMinimumSolrVersion($minimum_solr_version) {
$this->minimum_solr_version = $minimum_solr_version;
}
protected function urlRouteParameters($rel) {
$uri_route_parameters = parent::urlRouteParameters($rel);
if ('collection' == $rel) {
$uri_route_parameters['search_api_server'] = \Drupal::routeMatch()
->getRawParameter('search_api_server') ?: 'core_issue_2919648_workaround';
}
return $uri_route_parameters;
}
}