function QuickEditImageController::upload

Same name in this branch
  1. 9 core/modules/quickedit/src/Controller/QuickEditImageController.php \Drupal\quickedit\Controller\QuickEditImageController::upload()
Same name and namespace in other branches
  1. 8.9.x core/modules/image/src/Controller/QuickEditImageController.php \Drupal\image\Controller\QuickEditImageController::upload()

Returns JSON representing the new file upload, or validation errors.

Parameters

\Drupal\Core\Entity\EntityInterface $entity: The entity of which an image field is being rendered.

string $field_name: The name of the (image) field that is being rendered

string $langcode: The language code of the field that is being rendered.

string $view_mode_id: The view mode of the field that is being rendered.

Return value

\Symfony\Component\HttpFoundation\JsonResponse The JSON response.

File

core/modules/image/src/Controller/QuickEditImageController.php, line 111

Class

QuickEditImageController
Returns responses for our image routes.

Namespace

Drupal\image\Controller

Code

public function upload(EntityInterface $entity, $field_name, $langcode, $view_mode_id) {
    $field = $this->getField($entity, $field_name, $langcode);
    $field_validators = $field->getUploadValidators();
    $field_settings = $field->getFieldDefinition()
        ->getSettings();
    $destination = $field->getUploadLocation();
    // Add upload resolution validation.
    if ($field_settings['max_resolution'] || $field_settings['min_resolution']) {
        $field_validators['file_validate_image_resolution'] = [
            $field_settings['max_resolution'],
            $field_settings['min_resolution'],
        ];
    }
    // Create the destination directory if it does not already exist.
    if (isset($destination) && !$this->fileSystem
        ->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY)) {
        return new JsonResponse([
            'main_error' => $this->t('The destination directory could not be created.'),
            'errors' => '',
        ]);
    }
    // Attempt to save the image given the field's constraints.
    $result = file_save_upload('image', $field_validators, $destination);
    if (is_array($result) && $result[0]) {
        
        /** @var \Drupal\file\Entity\File $file */
        $file = $result[0];
        $image = $this->imageFactory
            ->get($file->getFileUri());
        // Set the value in the Entity to the new file.
        
        /** @var \Drupal\file\Plugin\Field\FieldType\FileFieldItemList $field_list */
        $value = $entity->{$field_name}
            ->getValue();
        $value[0]['target_id'] = $file->id();
        $value[0]['width'] = $image->getWidth();
        $value[0]['height'] = $image->getHeight();
        $entity->{$field_name}
            ->setValue($value);
        // Render the new image using the correct formatter settings.
        $entity_view_mode_ids = array_keys($this->entityDisplayRepository
            ->getViewModes($entity->getEntityTypeId()));
        if (in_array($view_mode_id, $entity_view_mode_ids, TRUE)) {
            $output = $entity->{$field_name}
                ->view($view_mode_id);
        }
        else {
            // Each part of a custom (non-Entity Display) view mode ID is separated
            // by a dash; the first part must be the module name.
            $mode_id_parts = explode('-', $view_mode_id, 2);
            $module = reset($mode_id_parts);
            $args = [
                $entity,
                $field_name,
                $view_mode_id,
                $langcode,
            ];
            $output = $this->moduleHandler()
                ->invoke($module, 'quickedit_render_field', $args);
        }
        // Save the Entity to tempstore.
        $this->tempStore
            ->set($entity->uuid(), $entity);
        $data = [
            'fid' => $file->id(),
            'html' => $this->renderer
                ->renderRoot($output),
        ];
        return new JsonResponse($data);
    }
    else {
        // Return a JSON object containing the errors from Drupal and our
        // "main_error", which is displayed inside the dropzone area.
        $messages = StatusMessages::renderMessages('error');
        return new JsonResponse([
            'errors' => $this->renderer
                ->render($messages),
            'main_error' => $this->t('The image failed validation.'),
        ]);
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.