2012-01-04 8 views
2

私はいくつかのファイル(異なるビデオフォーマット用)とキャプションを受け入れる予定のカスタム "ビデオ"フィールドを作っています。これまでのところ、スキーマは問題ありませんが、実際のファイルをアップロードして保存することはできません。複数のファイルフィールドを持つDrupal 7のカスタムフィールド

hook_field_widget_formでの私のコードは、この(唯一の関連ビットを貼り付け)のようになります。また

$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, 
); 

、私の.installファイル内:

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_filesテーブルに登録処理します。

EDIT

コアに役立つことを願っています

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

:次に、あなただけのあなたのウィジェットのフォームに提出する機能を追加し、(上記にリンクされているFAPIページから)次のコードを置きますファイルモジュールは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にこれを自動的に含める必要がありますが、それがなければファイルフィールドは機能しません。これはあなたが経験しているようです。

あなたはおそらく代わりにmanaged_fileフィールドタイプを使用したいジェームズ

関連する問題