testPluginId : $data['plugin_id']; $field_name = empty($data['field_name']) ? $this->testFieldName : $data['field_name']; $settings = empty($data['settings']) ? [] : $data['settings']; $display_id = $this->entityType . '.' . $bundle . '.' . $view_mode; $storage = $this->blazyManager->getEntityTypeManager()->getStorage('entity_view_display'); $display = $storage->load($display_id); if (!$display) { $values = [ 'targetEntityType' => $this->entityType, 'bundle' => $bundle, 'mode' => $view_mode, 'status' => TRUE, ]; $display = $storage->create($values); } $settings['current_view_mode'] = $settings['view_mode'] = $view_mode; $display->setComponent($field_name, [ 'type' => $plugin_id, 'settings' => $settings, 'label' => 'hidden', ]); $display->save(); return $display; } /** * Gets the field definition. * * @param string $field_name * Formatted field name. * * @return \Drupal\Core\Field\FieldDefinitionInterface * The field definition. * * @see BaseFieldDefinition::createFromFieldStorageDefinition() */ protected function getBlazyFieldDefinition($field_name = '') { if (!$this->fieldDefinition) { $field_name = empty($field_name) ? $this->testFieldName : $field_name; $field_storage_config = $this->getBlazyFieldStorageDefinition($field_name); $this->fieldDefinition = BaseFieldDefinition::createFromFieldStorageDefinition($field_storage_config); } return $this->fieldDefinition; } /** * Gets the field storage configuration. * * @param string $field_name * Formatted field name. * * @return \Drupal\field\FieldStorageConfigInterface * The field storage definition. */ protected function getBlazyFieldStorageDefinition($field_name = '') { if (!$this->fieldStorageDefinition) { $field_name = empty($field_name) ? $this->testFieldName : $field_name; $field_storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions($this->entityType); $this->fieldStorageDefinition = $field_storage_definitions[$field_name]; } return $this->fieldStorageDefinition; } /** * Returns the field formatter instance. * * @param string $plugin_id * Formatter plugin ID. * @param string $field_name * Formatted field name. * * @return \Drupal\Core\Field\FormatterInterface|null * The field formatter instance. */ protected function getFormatterInstance($plugin_id = '', $field_name = '') { $plugin_id = empty($plugin_id) ? $this->testPluginId : $plugin_id; $field_name = empty($field_name) ? $this->testFieldName : $field_name; $settings = $this->getFormatterSettings() + $this->formatterPluginManager->getDefaultSettings($plugin_id); $options = [ 'field_definition' => $this->getBlazyFieldDefinition($field_name), 'configuration' => [ 'type' => $plugin_id, 'settings' => $settings, ], 'view_mode' => 'default', ]; return $this->formatterPluginManager->getInstance($options); } /** * Build dummy content types. * * @param string $bundle * The bundle name. * @param array $settings * (Optional) configurable settings. */ protected function setUpContentTypeTest($bundle = '', array $settings = []) { $node_type = NodeType::load($bundle); $restricted_html = $this->blazyManager->entityLoad('restricted_html', 'filter_format'); if (empty($node_type)) { $node_type = NodeType::create([ 'type' => $bundle, 'name' => $bundle, ]); $node_type->save(); } if (!$restricted_html) { FilterFormat::create([ 'format' => 'restricted_html', 'name' => 'Basic HML', 'weight' => 2, 'filters' => [], ])->save(); } node_add_body_field($node_type); if (!empty($this->testFieldName)) { $settings['fields'][$this->testFieldName] = empty($this->testFieldType) ? 'image' : $this->testFieldType; } if (!empty($settings['field_name']) && !empty($settings['field_type'])) { $settings['fields'][$settings['field_name']] = $settings['field_type']; } $data = []; foreach ($settings['fields'] as $field_name => $field_type) { $data['field_name'] = $field_name; $data['field_type'] = $field_type; $this->setUpFieldConfig($bundle, $data); } $node_type->save(); return $node_type; } /** * Build dummy nodes with optional fields. * * @param string $bundle * The bundle name. * @param array $settings * (Optional) configurable settings. * * @return \Drupal\node\Entity\Node|null * The node instance. */ protected function setUpContentWithItems($bundle = '', array $settings = []) { $title = empty($settings['title']) ? $this->testPluginId : $settings['title']; $data = empty($settings['values']) ? [] : $settings['values']; $values = $data + [ 'title' => $title . ' : ' . $this->randomMachineName(), 'type' => $bundle, 'status' => TRUE, ]; $node = $this->blazyManager->getEntityTypeManager() ->getStorage($this->entityType) ->create($values); $node->save(); if (isset($node->body)) { $node->body->value = $this->getRandomGenerator()->paragraphs($this->maxParagraphs); $node->body->format = 'restricted_html'; } if (!empty($this->testFieldName)) { $settings['fields'][$this->testFieldName] = empty($this->testFieldType) ? 'image' : $this->testFieldType; } if (!empty($settings['field_name']) && !empty($settings['field_type'])) { $settings['fields'][$settings['field_name']] = $settings['field_type']; } if (!empty($settings['fields'])) { foreach ($settings['fields'] as $field_name => $field_type) { $multiple = $field_type == 'image' || strpos($field_name, 'mul') !== FALSE; if (strpos($field_name, 'empty') !== FALSE) { continue; } if (isset($this->entityFieldName) && ($field_name == $this->entityFieldName)) { continue; } $max = $multiple ? $this->maxItems : 2; $node->{$field_name}->generateSampleItems($max); } } $node->save(); $this->testItems = $node->{$this->testFieldName}; $this->entity = $node; return $node; } /** * Setup a new image field. * * @param string $bundle * The bundle name. * @param array $data * (Optional) A list of field data. */ protected function setUpFieldConfig($bundle = '', array $data = []) { $config = []; $default = empty($this->testFieldType) ? 'image' : $this->testFieldType; $field_type = empty($data['field_type']) ? $default : $data['field_type']; $field_name = empty($data['field_name']) ? $this->testFieldName : $data['field_name']; $multiple = strpos($field_name, 'mul') !== FALSE; if (in_array($field_type, ['file', 'image'])) { $config['file_directory'] = $this->testPluginId; $config['file_extensions'] = 'png gif jpg jpeg'; if ($field_type == 'file') { $config['file_extensions'] .= ' txt'; } if ($field_type == 'image') { $config['title_field'] = 1; $config['title_field_required'] = 1; } $multiple = TRUE; } $field_storage = FieldStorageConfig::loadByName($this->entityType, $field_name); $storage_settings = []; if ($field_type == 'entity_reference') { $storage_settings['target_type'] = isset($this->targetType) ? $this->targetType : $this->entityType; $bundle = $this->bundle; $multiple = FALSE; } if ($field_name == 'field_image') { $multiple = FALSE; } if (!$field_storage) { FieldStorageConfig::create([ 'entity_type' => $this->entityType, 'field_name' => $field_name, 'type' => $field_type, 'cardinality' => $multiple ? -1 : 1, 'settings' => $storage_settings, ])->save(); } $field_config = FieldConfig::loadByName($this->entityType, $bundle, $field_name); if ($field_type == 'entity_reference' && !empty($this->targetBundles)) { $config['handler'] = 'default'; $config['handler_settings']['target_bundles'] = $this->targetBundles; $config['handler_settings']['sort']['field'] = '_none'; $bundle = $this->bundle; } if (!$field_config) { $field_config = FieldConfig::create([ 'field_storage' => $field_storage, 'field_name' => $field_name, 'entity_type' => $this->entityType, 'bundle' => $bundle, 'label' => str_replace('_', ' ', $field_name), 'settings' => $config, ]); $field_config->save(); } return $field_config; } /** * Sets field values as built by FieldItemListInterface::view(). * * @param \Drupal\Core\Entity\EntityInterface[] $referenced_entities * An array of entity objects that will be referenced. * @param string $type * The formatter plugin ID. * @param array $settings * Settings specific to the formatter. Defaults to the formatter's defaults. * * @return array * A render array. */ protected function buildEntityReferenceRenderArray(array $referenced_entities, $type = '', array $settings = []) { $type = empty($type) ? $this->entityPluginId : $type; $items = $this->referencingEntity->get($this->entityFieldName); // Assign the referenced entities. foreach ($referenced_entities as $referenced_entity) { $items[] = ['entity' => $referenced_entity]; } // Build the renderable array for the field. $data['type'] = $type; if ($settings) { $data['settings'] = $settings; } return $items->view($data); } /** * Sets field values as built by FieldItemListInterface::view(). * * @param \Drupal\Core\Entity\EntityInterface[] $entity * An entity object that will be displayed. * @param array $settings * Settings specific to the formatter. Defaults to the formatter's defaults. * * @return array * A render array. */ protected function collectRenderDisplay(array $entity, array $settings = []) { $view_mode = empty($settings['view_mode']) ? 'default' : $settings['view_mode']; $display = EntityViewDisplay::collectRenderDisplay($entity, $view_mode); return $display->build($entity); } /** * Build dummy contents with entity references. * * @param array $settings * (Optional) configurable settings. */ protected function setUpContentWithEntityReference(array $settings = []) { $target_bundle = $this->targetBundle; $bundle = $this->bundle; $fields = empty($settings['fields']) ? [] : $settings['fields']; $image_settings = empty($settings['image_settings']) ? [] : $settings['image_settings']; $entity_settings = empty($settings['entity_settings']) ? [] : $settings['entity_settings']; $er_field_name = empty($settings['entity_field_name']) ? $this->entityFieldName : $settings['entity_field_name']; $er_plugin_id = empty($settings['entity_plugin_id']) ? $this->entityPluginId : $settings['entity_plugin_id']; // Create referenced entity. $referenced_data['title'] = 'Referenced ' . $this->testPluginId; // Create dummy fields. $referenced_data['fields'] = $fields + $this->getDefaultFields(); // Create referenced entity type. $this->setUpContentTypeTest($target_bundle, $referenced_data); // Create referencing entity type. $referencing_data['fields'] = [ $er_field_name => 'entity_reference', ]; $this->setUpContentTypeTest($bundle, $referencing_data); // 1. Build the referenced entities. $referenced_formatter_link = [ 'field_name' => 'field_link', 'plugin_id' => 'link', 'settings' => [], ]; $this->setUpFormatterDisplay($target_bundle, $referenced_formatter_link); $referenced_formatter_data = [ 'field_name' => $this->testFieldName, 'plugin_id' => $this->testPluginId, 'settings' => $image_settings + $this->getFormatterSettings(), ]; $this->referencedDisplay = $this->setUpFormatterDisplay($target_bundle, $referenced_formatter_data); // Create referenced entities. $this->referencedEntity = $this->setUpContentWithItems($target_bundle, $referenced_data); // 2. Build the referencing entity. $referencing_formatter_settings = $this->getDefaultFields(TRUE); $referencing_formatter_data = [ 'field_name' => $er_field_name, 'plugin_id' => $er_plugin_id, 'settings' => empty($entity_settings) ? $referencing_formatter_settings : array_merge($referencing_formatter_settings, $entity_settings), ]; $this->referencingDisplay = $this->setUpFormatterDisplay($bundle, $referencing_formatter_data); } /** * Create referencing entity. */ protected function createReferencingEntity(array $data = []) { if (empty($data['values']) && $this->referencedEntity->id()) { $data['values'] = [ $this->entityFieldName => [ ['target_id' => $this->referencedEntity->id()], ], ]; } return $this->setUpContentWithItems($this->bundle, $data); } /** * Set up dummy image. */ protected function setUpRealImage() { $this->uri = $this->getImagePath(); $item = $this->dummyItem; if (isset($this->testItems[0])) { $item = $this->testItems[0]; if ($item instanceof ImageItem) { $this->uri = ($entity = $item->entity) && empty($item->uri) ? $entity->getFileUri() : $item->uri; } } $this->testItem = $item; $this->data = [ 'settings' => $this->getFormatterSettings(), 'item' => $item, ]; $this->imageFactory = $this->container->get('image.factory'); } /** * Returns path to the stored image location. */ protected function getImagePath($is_dir = FALSE) { $path = \Drupal::root() . '/sites/default/files/simpletest/' . $this->testPluginId; $name = $this->testPluginId . '.png'; $source = \Drupal::root() . '/core/misc/druplicon.png'; $uri = $path . '/' . $name; if (!is_file($uri)) { file_prepare_directory($path, FILE_CREATE_DIRECTORY); file_unmanaged_copy($source, $uri, FILE_EXISTS_REPLACE); } $item = File::create([ 'uri' => $uri, 'uid' => \Drupal::currentUser()->id(), 'status' => FILE_STATUS_PERMANENT, ]); $item->save(); $uri = ($entity = $item->entity) && empty($item->uri) ? $entity->getFileUri() : $item->uri; $this->dummyUri = $uri; $this->dummyItem = $item; $this->dummyData = [ 'settings' => $this->getFormatterSettings(), 'item' => $item, ]; return $is_dir ? $path : $uri; } }