Tải lên hình ảnh trong một mô-đun tùy chỉnh


8

Tôi đang viết một mô-đun tùy chỉnh và tôi cần nó để tải lên một hình ảnh. Tôi gặp khó khăn khi tìm tài liệu tốt về điều này, nhưng tôi nghĩ rằng tôi đang ở gần.

Tôi đang thiếu gì? $ file trả về false trong biểu mẫu gửi.

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

Câu trả lời:


19

Nếu bạn không phiền tôi nói rằng bạn đang làm điều này một cách khó khăn. Drupal có một managed_fileloại phần tử xử lý hầu hết logic này cho bạn:

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

Cần lưu ý rằng file_save chỉ khả dụng sau Drupal 6.
Will

4

Với câu trả lời Clive, hình ảnh của tôi đã bị xóa sau 6 giờ. Vì vậy, nếu ai đó trải qua vấn đề tương tự mà tôi nhận được. Đây là giải pháp (từ câu trả lời của Clive với một chút bổ sung).

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

Giải pháp là thêm file_usage_add. Từ tài liệu API:

Lưu ý: Các tệp mới được tải lên với trạng thái 0 và được coi là các tệp tạm thời bị xóa sau 6 giờ qua cron. Mô-đun của bạn chịu trách nhiệm thay đổi trạng thái đối tượng tệp $ thành FILE_STATUS_PERMANENT và lưu trạng thái mới vào cơ sở dữ liệu. Một cái gì đó như sau trong trình xử lý trình của bạn nên thực hiện thủ thuật.

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


1

Thuộc tính này nên được thêm vào biểu mẫu của bạn để nó hoạt động với các tệp tải lên.

$form['#attributes']['enctype'] = "multipart/form-data";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.