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.'));
}
Tim Snyder
quelle

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);
  }
}
Clive
quelle
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

Gulok
quelle
1

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

$form['#attributes']['enctype'] = "multipart/form-data";
DrupalFever
quelle