2

複数のファイル (さまざまなビデオ形式用) とキャプションを受け入れることになっているカスタム「ビデオ」フィールドを作成しています。これまでのところ、スキーマは問題ありませんが、実際のファイルをアップロードして保存することはできません。

私のコードは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 を実行しようとすると、これらの整数フィールドに取得しようとする値が空の文字列であるため失敗します。

私が理解していることから、それらは整数でなければなりませんよね?( fids ?) しかし、ファイルをアップロードするための適切なインターフェイスが得られたとしても、ファイルがアップロードされていないと思います。

captionDrupal は実行しようとしている INSERT クエリを示しています。これは長すぎてここに投稿できませんが、フィールド (単なるテキスト フィールド)の値がクエリで問題ないことがわかります。ファイルフィールドで。

4

2 に答える 2

3

managed_file代わりにフィールド タイプを使用することをお勧めします。ファイルのアップロードとmanaged_filesテーブルへの登録が処理されます。次に、submit 関数をウィジェット フォームに追加し、次のコードを配置します (上記のリンク先の 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 のキャッシュをクリアしてください。クリアしないと登録されません。

于 2012-01-04T10:06:23.367 に答える
0

Drupal モジュールでファイルのアップロードをまだ試していませんが、フォーム タグに属性 enctype ="multipart/form-data" があるかどうかを確認できますか?

Drupal はこれを自動的にインクルードするはずですが、それがないとファイル フィールドが機能しません。

ジェームズ

于 2012-01-04T09:10:15.237 に答える