web-dev-qa-db-fra.com

Comment utiliser le champ managed_file dans un plugin de formulaire personnalisé

J'essaie de créer un module avec un formulaire personnalisé qui permet aux utilisateurs de télécharger un fichier à l'aide d'un champ managed_file. Le nom de mon module est foundation_settings et la structure du fichier est:

foundation_settings
  -foundation_settings.info.yml
  -foundation_settings.module
  -src
    -Form
      -FoundationForm.php

Dans FoundationForm.php, je crée le formulaire avec le code suivant:

public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('foundation.settings');
        $form['icons'] = [
            '#type'            => 'details',
            '#title'           => t('Front Page Icons'),
            '#open'            => FALSE,
            'icon1'            => [
                '#type'           => 'fieldset',
                '#title'          => t('First Icon'),
                'icon1_file'        => [
                    '#type'            => 'managed_file',
                    '#name'            => 'icon1',
                    '#title'           => t('First Icon Image'),
                    '#default_value'   => $config->get('icon1_file'),
                    '#upload_location' => 'public://',
                ],
            ],
       ];
}

Cependant, je ne sais pas comment gérer le managed_file lorsque le formulaire est soumis. Dans ma fonction submitForm, j'ai

public function submitForm(array&$form, FormStateInterface $form_state) {
    $imageid = $form_state->getValue('icon1_file');
    $file = file_load($imageid[0]);
        if (gettype($file) == 'object') {
            $file->status = FILE_STATUS_PERMANENT;
        }
        $this->config('foundation.settings')
             ->set('icon1_file', $form_state->getValue('icon1_file'))
            ->save();
            $file->save();
}

Le téléchargement et l'enregistrement fonctionnent bien, mais je continue de recevoir cette erreur après la soumission

Le fichier utilisé dans le champ First Icon Image peut ne pas être référencé.

Comment êtes-vous censé utiliser le champ managed_file dans les plugins de formulaires personnalisés?

3
Matt

Je pense que le problème que nous avions était de comprendre les données que le formulaire nous renvoyait lors de l'utilisation du type 'managed_file'. Cela crée une entité de fichier et stocke les informations d'image directement dans la table appelée "file_managed" dans votre base de données, mais enregistre également le fichier dans vos répertoires en fonction de l'endroit où vous l'envoyez. Prenez donc ce code par exemple:

$form['mainslider_slide_one']['image_dir'] = [
    '#type'                 => 'managed_file',
    '#upload_location'      => 'public://module-images/home-slider-images/',
    '#multiple'             => FALSE,
    '#description'          => t('Allowed extensions: gif png jpg jpeg'),
    '#upload_validators'    => [
      'file_validate_is_image'      => array(),
      'file_validate_extensions'    => array('gif png jpg jpeg'),
      'file_validate_size'          => array(25600000)
    ],
    '#title'                => t('Upload an image file for this slide')
];

Pour '#upload_location', nous indiquons que le fichier doit être stocké dans notre dossier public sous le répertoire spécifié (sites/nom du site/fichiers/répertoire). Alors maintenant, nous avons le fichier réel stocké où nous voulons, ainsi que les données stockées dans la base de données.

Lorsque nous recevons les informations (en cours de validation par exemple), nous avons le code suivant:

public function validateForm(array &$form, FormStateInterface $form_state) {
    $managedFileId_imageOne = $form_state->getValue(['mainslider_slide_one' => 'image_dir']);

    if (empty($managedFileId_imageOne)) {
        $form_state->setErrorByName('test', 'No image found for image one');
    }
}

Le résultat de $ managedFileId_imageOne sera soit un tableau vide (alors que j'envoie un message d'erreur) ou un tableau de fid. Le fid est l'emplacement dans la base de données. Ce sont les informations que nous avons fini par enregistrer dans nos données de fichier de paramètres. Ainsi, lorsque nous extrayons les informations dans notre programme, nous recherchons le "fid" situé dans la table "file_managed" en utilisant la méthode Entity :: load .

NOTE/MISE À JOUR:

N'oubliez pas que les fichiers téléchargés de cette manière sont actuellement, par défaut, définis comme temporaires (colonne d'état dans le tableau "file_managed"). Vous devez définir le fichier sur permanent pour définir manuellement l'état sur 1 afin qu'ils ne soient pas temporaires. Je pense que c'est une fonctionnalité qui est actuellement un bogue et ils envisagent de la mettre à jour dans les prochaines versions.

Échantillon de Jasodeep

   $image = $form_state->getValue('image');
   $file = File::load( $image[0] );
   $file->setPermanent();
   $file->save();

J'espère que cela vous aidera au moins à vous mettre en route!

9
Ron