管理対象ファイル:フィールドで使用されているファイルは参照できません


39

managed_fileタイプにいくつかの問題があります。managed_file要素が含まれるフォームを編集して保存しようとすると、エラーが発生します。Picture フィールドで使用されているファイルが参照されない可能性があります。

これは私が使用しているコードです:

function foo_form ($form, &$form_state, $foo) {  
  ...     
  $form['file'] = array(
    '#type' => 'managed_file',
    '#title' => t('Picture'),
    '#default_value' => (isset($foo->file->fid) ? $banner->foo->fid : ''),
    '#upload_location' => variable_get('foo_upload_location'),
  );

  if (isset($foo->file)) {
    $form['current_file'] = array(
      '#type' => 'hidden',
      '#value' => $foo->file->fid,
    );
  }
  ...
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  return $form;
 }

function foo_form_submit ($form, &$form_state) {
  $foo = (object)$form_state['values'];

  $current_file_set = isset($form_state['values']['current_file']);

  if ($form_state['values']['file'] != 0 && !$current_file_set) {
    // Load the file uploaded in the form.
    $file = file_load($form_state['values']['file']);

    $file->status = FILE_STATUS_PERMANENT;

    file_save($file);

    $foo->file = $file->fid;
  } else if ($form_state['values']['file'] != 0 && $current_file_set) {

    // If we are uploading a different picture, delete the old one and save the
    // new one. If not, don't do anything.
    if ($form_state['values']['current_file'] != $form_state['values']['file']) {
      file_delete(file_load($form_state['values']['current_file']));
      // Load the file uploaded in the form.
      $file = file_load($form_state['values']['file']);

      $file->status = FILE_STATUS_PERMANENT;

      file_save($file);

      $foo->file = $file->fid;
    }
  } else {
    file_delete(file_load($form_state['values']['current_file']));
    $foo->file = null;
  }

  ...
}

modules / file / file.modulefile_managed_file_validate関数にエラーをさかのぼりましたが、ファイル参照については何も知りません。

回答:


40

解決策は、ファイルを保存した後にfile_usage_addの呼び出しを追加することです。この呼び出しは、データベース内のファイルへの参照を追加します。file_managed_file_validateの機能は、参照を発見し、エラーをトリガしません。

file_usage_add($file, 'foo', 'foo', $foo->id);

これは、フォームAPIのmanaged_fileの例に記載されていません。

この問題は、Drupalのドキュメントの問題で議論されています:リンク


3
+1これで髪の毛を引き裂いているだけで、ファイル使用記録を追加するだけで問題はすぐに解決します。ありがとうございました!
クライブ

ありがたいことに、現在、managed_fileの例に追加されています。しかし、それは私が従ったどんな例でもなかったので、この答えは命の恩人でした!
ジョシュアスチュワードソン

@Cliveテンプレート設定からファイルを保存するのはどうですか?!その関数のパラメーターとして機能するモジュールはありません!
SaidbakR

1
sємsєм@ただテーマの名前を使用する-文字列自体が検証されていない、それはちょうどそれを追跡しています事にユニークなものである必要があります-モジュール名は、それが立ち往生している大会ですので、Drupalの各地を名前空間をするために使用されている
クライヴ

:@Cliveあなたはこの質問を見て取得してもらえdrupal.stackexchange.com/questions/124373/...
SaidbakR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.