ノードを保存した後、アップロードしたファイルの名前を変更するにはどうすればよいですか?この目的のために FileField Paths モジュールがあることは知っていますが、Drupal 7.の場合はまだバグがあります。モジュールのソースを調べましたが、できません。必要なコードを抽出します。
私が知っている唯一のことは、hook_node_update()
およびfield_attach_update()
を使用する必要があることですが、それらの使用方法はわかりません。
多分これはあなたを助けるでしょう。昨夜、ファイルを自動生成してノードにアタッチするためのコードを書きました。ノードが保存される直前に、関数はノードからアップロードされたファイルを削除し、新しいファイルを作成して添付します。
あなたの場合、file_copyでファイル名を更新し、filefieldをリセットするだけでよい場合があります。
function MODULE_node_presave($node) {
/*
* Out with the old - detach file object
*/
if (isset($node->field_filefieldname['und'][0]['fid'])) {
file_delete(file_load($node->field_filefieldname['und'][0]['fid']));
}
unset($node->field_filefieldname['und'][0]); //just for good measure
/*
* In with the new
*/
$filename = 'newfilename.dot';
$filepath = conf_path().'/files/yourpath/';
$touchout = $node->title;
$tempFile = file_directory_temp().'/'.$filename;
file_put_contents($tempFile, $touchout);
$file = (object) array(
'uid' => 1,
'uri' => $tempFile,
'filemime' => file_get_mimetype($tempFile),
'status' => 1,
'display' => 1,
);
/*
* File save operation, puts file in /sites/default/files and records update in db
*/
if (file_prepare_directory($filepath, FILE_CREATE_DIRECTORY)) {
$file = file_copy($file, 'public://path/'.$filename, FILE_EXISTS_REPLACE);
}
/*
* Reattaches our severed file, good as new.
*/
$node->field_filefieldname['und'][0] = (array)$file;
}
?>
ファイルIDがわかっていれば(そしてPHPコードを実行してもかまわない)、とても簡単です。
$file = file_load($fid);
file_move($file, 'public://new/path');
hook_file_presave()
を使用してファイルが保存される直前にデータベースに追加されたときに、ファイルを変更する方法は次のとおりです。
例えば:
_/**
* Implements hook_file_presave().
*/
function hook_file_presave($file) {
// Change the file timestamp to an hour prior.
$file->timestamp -= 3600;
if ($file->filename == 'my_file.wav') {
$file->filename = 'mynewfile.wav';
}
}
_
参照: プログラムでアップロードしたファイルの名前を変更するにはどうすればよいですか?(画像ファイルの自動名前変更)
注:このメソッドはファイルのファイル名を変更せず、file_managedテーブル内のファイル名のみを変更します。そのため、ファイル自体の名前を変更する場合は、手動で移動する必要があります(例:$file = file_move($file, $uri);
)。これを見てください post 。
ファイルがデータベースに追加された後に変更するには、次のように hook_file_insert()
を使用します。
_function hook_file_insert($file) {
// Add a message to the log, if the file is a jpg
$validate = file_validate_extensions($file, 'jpg');
if (empty($validate)) {
watchdog('file', 'A jpg has been added.');
}
}
_