it-swarm.com.de

Verwendung des Felds "verwaltete Datei" in einem benutzerdefinierten Formular-Plugin

Ich versuche, ein Modul mit einem benutzerdefinierten Formular zu erstellen, mit dem Benutzer eine Datei mithilfe eines Felds "aged_file "hochladen können. Der Name meines Moduls lautet Foundation_Settings und die Dateistruktur lautet:

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

In FoundationForm.php erstelle ich das Formular mit dem folgenden Code:

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://',
                ],
            ],
       ];
}

Ich bin mir jedoch nicht sicher, wie ich mit der verwalteten Datei umgehen soll, wenn das Formular gesendet wird. In meiner submitForm-Funktion habe ich

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();
}

Das Hochladen und Speichern funktioniert in Ordnung, aber ich erhalte diesen Fehler nach dem Absenden weiterhin

Auf die im Feld "Erstes Symbolbild" verwendete Datei wird möglicherweise nicht verwiesen.

Wie soll das Feld "verwaltete Datei" in benutzerdefinierten Formular-Plugins verwendet werden?

3
Matt

Ich denke, das Problem, das wir hatten, war das Verständnis der Daten, die das Formular an uns zurückgesendet hat, wenn der Typ 'manage_file' verwendet wurde. Dadurch wird eine Entität von File erstellt und die Bildinformationen werden direkt in der Tabelle 'file_managed' in Ihrer Datenbank gespeichert. Die Datei wird jedoch auch in Ihren Verzeichnissen gespeichert, je nachdem, wohin Sie sie senden. Nehmen Sie zum Beispiel diesen Code:

$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')
];

Für den '#upload_location' teilen wir der Datei mit, dass sie in unserem öffentlichen Ordner unter dem angegebenen Verzeichnis (sites/sitename/files/directory) gespeichert werden soll. Jetzt haben wir die eigentliche Datei dort gespeichert, wo wir möchten, sowie die Daten in der Datenbank.

Wenn wir die Informationen zurückerhalten (zum Beispiel unter Validierung), haben wir den folgenden Code:

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');
    }
}

Das Ergebnis von $ manageFileId_imageOne ist entweder ein leeres Array (während ich eine Fehlermeldung zurückschicke) oder ein Array von FIDs. Die FID ist der Speicherort in der Datenbank. Dies sind die Informationen, die wir letztendlich in unseren Einstellungsdateidaten gespeichert haben. Wenn wir also die Informationen in unser Programm ziehen, fragen wir mit der Methode Entity :: load nach der 'fid' in der Tabelle 'file_managed'.

HINWEIS/UPDATE:

Vergessen Sie nicht, dass auf diese Weise hochgeladene Dateien derzeit standardmäßig als temporär festgelegt sind (Statusspalte in der Tabelle "file_managed"). Sie müssen die Datei auf permanent setzen, um den Status manuell auf 1 zu setzen, damit sie nicht temporär sind. Ich glaube, dies ist eine Funktionalität, die derzeit ein Fehler ist, und sie versuchen, diese möglicherweise in zukünftigen Versionen zu aktualisieren.

Probe aus Jasodeep

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

Hoffe das hilft dir wenigstens auf den Weg!

9
Ron