2012-01-04 4 views
2

여러 비디오 형식의 여러 파일과 캡션을 사용할 수있는 사용자 지정 "비디오"필드를 만들고 있습니다. 지금까지 스키마는 괜찮지 만 실제 파일을 업로드하고 저장할 수는 없습니다.여러 파일 필드가있는 Drupal 7의 사용자 정의 필드

hook_field_widget_form에서 내 코드 (에만 해당 비트를 붙여 넣기) 다음과 같습니다

: 내 .install 파일에서

$element['mp4'] = array(
    '#type' => 'file', 
    '#title' => 'MP4 file', 
    '#delta' => $delta, 
); 
$element['ogg'] = ... /* similar to the mp4 one */ 
$element['caption'] = array(
    '#type' => 'textfield', 
    '#title' => 'Caption', 
    '#delta' => $delta, 
); 

또한 : 내가하려고 할 때

function customvideofield_field_schema($field) { 
    return array(
    'columns' => array(
     'mp4' => array(
     'type' => 'int', 
     'unsigned' => TRUE, 
     'not null' => TRUE, 
     'default' => 0, 
    ), 
     'ogg' => ... /* similar to mp4 */ 
     'caption' => array(
     'type' => 'varchar', 
     'length' => 255, 
    ), 
    ) 
); 
} 

내가지고있어 오류가 데이터를 저장합니다. 나는 폼을 얻었고, 데이터베이스는 괜찮아 보인다. (드루팔 (Drupal)은 적어도 생성한다.) 그러나 INSERT를 시도하면, 정수 필드에 들어가려고하는 값이 빈 문자열이기 때문에 실패한다.

내가 이해하는 것으로부터 정수가되어야합니다. 맞습니까? (fid s?)하지만 파일 업로드를위한 올바른 인터페이스를 얻더라도 파일이 업로드되고 있지 않다고 생각합니다.

Drupal은 여기에 게시하기에는 너무 긴 INSERT 쿼리를 보여 줍니 다. 텍스트 필드 인 caption 필드의 값은 쿼리에서 문제가없는 것으로 볼 수 있습니다. 그래서 파일 필드에만 문제가 있습니다.

답변

3

당신은 아마 대신 managed_file 필드 유형을 사용하려면,이 파일을 업로드하고 당신을 위해 managed_files 테이블에 등록 처리합니다. 그럼 당신은 단지 당신의 위젯 형태로 기능을 제출 추가하고 (위의 링크 된 FAPI 페이지에서) 다음 코드를 삽입합니다 :

// Load the file via file.fid. 
$file = file_load($form_state['values']['mp4']); 

// Change status to permanent. 
$file->status = FILE_STATUS_PERMANENT; 

// Save. 
file_save($file); 

// Record that the module (in this example, user module) is using the file. 
file_usage_add($file, 'customvideofield', 'customvideofield', $file->fid); 

희망

편집

핵심을하는 데 도움이 파일 모듈은 hook_field_presave()을 사용하여 실제 제출물을 처리합니다.이 코드는 다음과 같이 작동합니다.

function customvideofield_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) { 
    // Make sure that each file which will be saved with this object has a 
    // permanent status, so that it will not be removed when temporary files are 
    // cleaned up. 
    foreach ($items as $item) { 
    $file = file_load($item['mp4']); 
    if (!$file->status) { 
     $file->status = FILE_STATUS_PERMANENT; 
     file_save($file); 
    } 
    } 
} 

필드의 파일 ID 열이 mp4이라고 가정합니다.

새 훅을 구현할 때 드루팔 (Drupal)의 캐시를 비워두면 등록되지 않습니다.

+0

이것은 정말 올바른 방향으로 나를 보내고 있습니다, 감사합니다! 이 코드를 어디에 두어야하는지 알고 있습니까? 'hook_field_update_field()'입니까? – cambraca

+0

@cambraca : 도움이 되었으면 좋겠습니다. :) – Clive

+0

'hook_field_presave'를 사용하면'file_usage_add'를 사용하여 파일을 등록 할 필요가 없습니다. – Beebee

0

아직 내 Drupal 모듈에서 파일 업로드를 시도하지 않았지만 양식 태그에 속성 enctype = "multipart/form-data"가 있는지 확인할 수 있습니까?

드루팔 (Drupal이 이것을 자동으로 포함시켜야한다고 생각하지만, 파일 필드가 없으면 당신이 겪고있는 것처럼 보입니다.

제임스

관련 문제