web-dev-qa-db-ja.com

Drupal 7のファイルフィールドにファイルをインポートする

PDFドキュメントを添付ファイルとして受け入れるコンテンツタイプがあります。現在、添付ファイルのないエントリがたくさんありますが、各エントリにファイルがあり、ファイルを関連付ける必要があります。それぞれのエントリで。

現在、これらのファイルはすべてpublic:// publicationsに保存されているため、本来あるべき場所のパブリックファイルパスに既に存在しているので、「接続」するだけです。

これをRubyで通常ハッキングするのではなく、悪い習慣を蹴ってDrupal APIを使用します。次の記事:

..でも、本当に頭を包むことができませんでした。

他の人がこの状況に対処したかどうか、そして彼らがそれに対処するために何をしたかについて興味があります。ありがとう。

[〜#〜]更新[〜#〜]

ファイルをコピーする必要があります。ただし、エラーは発生していません。エラーはnode_saveの呼び出し中に発生します。

ここにエラーがあります:

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'uri': INSERT INTO {file_managed} (filesize, status, timestamp) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2); Array
(
    [:db_insert_placeholder_0] => 0
    [:db_insert_placeholder_1] => 1
    [:db_insert_placeholder_2] => 1330491978
)
 in drupal_write_record() (line 6975 of /var/www/website/drupal-7.4/includes/common.inc).

そして、これがコードです。

$node = node_load($bib_value->nid);

$file = new stdClass();
$file->filename = basename($filepath);
$file->filepath = $filepath;
$file->filemime = file_get_mimetype($filepath);
$file->filesize = filesize($filepath);
$file->uid = 1;
$file->status = FILE_STATUS_PERMANENT;
$file->uri = $filepath;
$file = file_copy($file,'public://publications',FILE_EXISTS_REPLACE);

// THIS IS A PROBLEM LINE
$node->field_publication_attachment[LANGUAGE_NONE] = $file;

node_save($node);

THIS IS A PROBLEM LINEというラベルの付いた行をコメント化すると、エラーは発生しませんが、ファイルがノードに添付されずに完了していることを意味するため、明らかに望ましくありません。助けて!

[〜#〜]ソリューション[〜#〜]

$node = node_load($bib_value->nid);

$file = new stdClass();
$file->filename = basename($filepath);
$file->filepath = $filepath;
$file->filemime = file_get_mimetype($filepath);
$file->filesize = filesize($filepath);
$file->uid = 1;
$file->status = FILE_STATUS_PERMANENT;
$file->uri = $filepath;
$file->display = 1;
$file->description = '';
$file = file_copy($file,'public://publications',FILE_EXISTS_REPLACE);

$node->field_publication_attachment[LANGUAGE_NONE][] = (array)$file;

node_save($node);

displaydescription$fileに設定し、$fileを添付フィールドに追加するときに配列としてキャストする必要があります。その後はすべてスムーズに動作しました。

4
Lester Peabody

私は現在、写真を使用することを除いて、まったく同じことに取り組んでいます。自分のプロファイル名をクリックすると、要求されていることを行う方法の学習に関連する一連の質問が表示されます。

フォルダー内のすべてのファイルをループ処理してノードに追加するコードを簡単に実行できました。

$file = new stdClass();
$file->filename = basename($local_path);
$file->filepath = $local_path;
$file->uri = $local_path;
$file->filemime = $mime;
$file->filesize = filesize($local_path);

// Set this at the very beginning to correspond to USER you want posting items.
$file->uid = $uid; 
$file->status = FILE_STATUS_PERMANENT;
file_save($file);

$images[] = array(
'fid' => $file->fid,
'alt' => $page_data['title'],
'title' => $page_data['title']
);
5
blue928

それを行う別の方法:

$entity = entity_load($id);
$data = file_get_contents($localpath);
$destination = file_create_filename(basename($localpath), file_default_scheme() . '://yourdir/' );
$file = file_save_data($data, $destination);
$entity->field_attachment[LANGUAGE_NONE][] = (array)$file;
$entity->save();
5
Xatoo