Bild-Upload in ein benutzerdefiniertes Modul


8

Ich schreibe ein benutzerdefiniertes Modul und benötige es, um ein Bild hochzuladen. Ich habe Probleme, eine gute Dokumentation dazu zu finden, aber ich denke, ich bin nah dran.

Was vermisse ich? $ file gibt in der Formularübermittlung false zurück.

function mymodule_custom_content_block_form($form_state){
    $form = array();
    $form['custom_content_block_text'] = array(
        '#type' => 'textarea',
        '#title' => t('Block text'),
        '#default_value' => variable_get('mymodule_custom_content_block_text'),
        '#required' => true,
    );
    $form['custom_content_block_image'] = array(
        '#type' => 'file',
        '#name' => 'custom_content_block_image',
        '#title' => t('Block image'),
        '#size' => 40,
        '#description' => t("Image should be less than 400 pixels wide and in JPG format."),
    );  
    $form['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Update'),
    );
    return $form;
}

function mymodule_custom_content_block_form_submit($form, &$form_state){
    if(isset($form_state['values']['custom_content_block_image'])){
        $validators = array('file_validate_extensions' => array('jpg jpeg'));
        $file = file_save_upload('custom_content_block_image', $validators, 'public://');
        if($file == false){
            drupal_set_message(t("Error saving image."), $type = "error", $repeat = false);
        }
        else{
            $file->status = FILE_STATUS_PERMANENT;
            $file = file_save($file);   
        }
    }
    variable_set('mymodule_custom_content_block_text', $form_state['values']['custom_content_block_text']);
    drupal_set_message(t('Custom Content Block has been updated.'));
}

Antworten:


19

Wenn es Ihnen nichts ausmacht, dass ich sage, tun Sie das auf die harte Tour. Drupal hat einen managed_fileElementtyp, der den größten Teil dieser Logik für Sie erledigt:

function mymodule_custom_content_block_form($form, &$form_state) {
  $form['custom_content_block_image'] = array(
    '#type' => 'managed_file',
    '#name' => 'custom_content_block_image',
    '#title' => t('Block image'),
    '#size' => 40,
    '#description' => t("Image should be less than 400 pixels wide and in JPG format."),
    '#upload_location' => 'public://'
  ); 

  return $form; 
}

function mymodule_custom_content_block_form_submit($form, &$form_state) {
  if (isset($form_state['values']['custom_content_block_image'])) {
    $file = file_load($form_state['values']['custom_content_block_image']);

    $file->status = FILE_STATUS_PERMANENT;

    file_save($file);
  }
}

Es sollte beachtet werden, dass file_save erst nach Drupal 6 verfügbar ist.
Will

4

Mit Clive Antwort wurde mein Bild nach 6 Stunden gelöscht. Also, wenn jemand das gleiche Problem hatte, das ich hatte. Hier ist die Lösung (aus Clives Antwort mit einer kleinen Ergänzung).

function mymodule_custom_content_block_form($form, &$form_state) {
  $form['custom_content_block_image'] = array(
    '#type' => 'managed_file',
    '#name' => 'custom_content_block_image',
    '#title' => t('Block image'),
    '#size' => 40,
    '#description' => t("Image should be less than 400 pixels wide and in JPG format."),
    '#upload_location' => 'public://'
  ); 

  return $form; 
}

function mymodule_custom_content_block_form_submit($form, &$form_state) {
  if (isset($form_state['values']['custom_content_block_image'])) {
    $file = file_load($form_state['values']['custom_content_block_image']);

    $file->status = FILE_STATUS_PERMANENT;

    $file_saved =file_save($file);
    // Record that the module is using the file. 
    file_usage_add($file_saved, 'mymodule_custom_content_block_form', 'custom_content_block_image', $file_saved->fid); 
  }
}

Die Lösung besteht darin, hinzuzufügen file_usage_add. Aus der API-Dokumentation:

Hinweis: Neue Dateien werden mit dem Status 0 hochgeladen und als temporäre Dateien behandelt, die nach 6 Stunden über cron entfernt werden. Ihr Modul ist dafür verantwortlich, den Status der $ file-Objekte in FILE_STATUS_PERMANENT zu ändern und den neuen Status in der Datenbank zu speichern. So etwas wie das Folgende in Ihrem Submit-Handler sollte den Trick machen.

Siehe: https://api.drupal.org/api/drupal/developer%21topics%21forms_api_reference.html/7.x#managed_file


1

Dieses Attribut sollte Ihrem Formular hinzugefügt werden, damit es mit Datei-Uploads funktioniert.

$form['#attributes']['enctype'] = "multipart/form-data";
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.