public function SolrDocument::get in Search API Solr 8.2
Same name and namespace in other branches
- 8.3 src/Plugin/DataType/SolrDocument.php \Drupal\search_api_solr\Plugin\DataType\SolrDocument::get()
- 4.x src/Plugin/DataType/SolrDocument.php \Drupal\search_api_solr\Plugin\DataType\SolrDocument::get()
Gets a property object.
Parameters
$property_name: The name of the property to get; e.g., 'title' or 'name'.
Return value
\Drupal\Core\TypedData\TypedDataInterface The property object.
Throws
\InvalidArgumentException If an invalid property name is given.
\Drupal\Core\TypedData\Exception\MissingDataException If the complex data structure is unset and no property can be created.
Overrides ComplexDataInterface::get
File
- src/
Plugin/ DataType/ SolrDocument.php, line 67
Class
- SolrDocument
- Defines the "Solr document" data type.
Namespace
Drupal\search_api_solr\Plugin\DataTypeCode
public function get($property_name) {
if (!isset($this->item)) {
throw new MissingDataException("Unable to get Solr field {$property_name} as no item has been provided.");
}
// First, verify that this field actually exists in the Solr server. If we
// can't get a definition for it, it doesn't exist.
/** @var \Drupal\search_api_solr\Plugin\DataType\SolrField $plugin */
$plugin = \Drupal::typedDataManager()
->getDefinition('solr_field')['class'];
$field_manager = \Drupal::getContainer()
->get('solr_field.manager');
$server_id = $this->item
->getIndex()
->getServerInstance()
->id();
$fields = $field_manager
->getFieldDefinitions($server_id);
if (empty($fields[$property_name])) {
throw new \InvalidArgumentException("The Solr field {$property_name} could not be found on the {$server_id} server.");
}
// Create a new typed data object from the item's field data.
$property = $plugin::createInstance($fields[$property_name], $property_name, $this);
// Now that we have the property, try to find its values. We first look at
// the field values contained in the result item.
$found = FALSE;
foreach ($this->item
->getFields(FALSE) as $field) {
if ($field
->getDatasourceId() === 'solr_document' && $field
->getPropertyPath() === $property_name) {
$property
->setValue($field
->getValues());
$found = TRUE;
break;
}
}
if (!$found) {
// If that didn't work, maybe we can get the field from the Solr document?
$document = $this->item
->getExtraData('search_api_solr_document');
if ($document instanceof AbstractDocument && isset($document[$property_name])) {
$property
->setValue($document[$property_name]);
}
}
return $property;
}