it-swarm-ko.tech

맞춤 모듈에서 이미지 업로드

사용자 정의 모듈을 작성 중이며 이미지를 업로드하는 데 필요합니다. 나는 이것에 관한 좋은 문서를 찾는 데 어려움을 겪고 있지만 가까운 거리에 있다고 생각합니다.

내가 무엇을 놓치고 있습니까? $ file은 양식 제출에서 false를 반환합니다.

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

내 말이 마음에 들지 않으면 열심히하고 있습니다. Drupal에는 managed_file 이 논리의 대부분을 처리하는 요소 유형 :

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

Clive 응답으로 6 시간 후에 이미지가 삭제되었습니다. 누군가 내가 가진 것과 같은 문제가 발생하면. 여기에 해결책이 있습니다 (약간의 추가로 Clive의 대답에서).

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

해결책은 file_usage_add. API 설명서에서 :

참고 : 새 파일은 상태 0으로 업로드되며 6 시간 후에 cron을 통해 제거되는 임시 파일로 처리됩니다. 모듈은 $ file 객체 상태를 FILE_STATUS_PERMANENT로 변경하고 새 상태를 데이터베이스에 저장해야합니다. 제출 핸들러 내에서 다음과 같은 것이 트릭을 수행해야합니다.

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

4
Gulok

파일 업로드 작업을 수행하려면이 속성을 양식에 추가해야합니다.

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