Пытаюсь сделать массовое копирование материалов. За основу взял модуль Node Clone, но он немного сыроватый, нет копирования файлов и ССК.
Требуется: скопировать материалы одного типа с определенным заголовком. У копии меняется заголовок, при этом прикрепленные файлы картинок тоже копируются, и поля копии ImageField должны содержать ссылки на уже скопированные файлы.
Сделано: копирование материалов и копирование файлов.
Не получается: поставить в ImageField новые ссылки.
Все делается вот так:
function clone_realty_nodes() {
$title='realty';
$type='realty';
$result=db_query("SELECT nid FROM {node} WHERE type='%s' AND title like '%s'",$type,$title);
while($n=db_fetch_object($result)) {
$node=node_load($n->nid);
global $user;
$original_node = drupal_clone($node);
$node->nid = NULL;
$node->vid = NULL;
$node->name = $user->name;
$node->uid = $user->uid;
$node->created = NULL;
$node->menu = NULL;
$node->book['mlid'] = NULL;
$node->path = NULL;
$node->files = array();
$node->title = "Exported realty";
/////////////////////////////////////////////////////////////////////
cloneimagefield_clone_node_alter($node, $original_node);
/////////////////////////////////////////////////////////////////////
if (variable_get('clone_reset_'. $node->type, FALSE)) {
$node_options = variable_get('node_options_'. $node->type, array('status', 'promote'));
// Fill in the default values.
foreach (array('status', 'moderate', 'promote', 'sticky', 'revision') as $key) {
$node->$key = in_array($key, $node_options);
}
}
// Let other modules do special fixing up.
// The function signature is: hook_clone_node_alter(&$node, $original_node, $method)
// Where $method is either 'prepopulate' or 'save-edit'.
drupal_alter("clone_node", $node, $original_node, "save-edit");
node_save($node);
}
}
function cloneimagefield_clone_node_alter(&$node, $original_node) {
$content_type = module_invoke('content', 'types', $node->type);
$image_fields = array();
// Find all the image fields
foreach ($content_type['fields'] as $data) {
if ($data['type'] == 'image') {
$image_fields[] = $data['field_name'];
}
}
$clone_imagefield = array();
// Put back the imagefields from the original node.
foreach ($image_fields as $key) {
if (isset($original_node->$key)) {
$node->$key = $original_node->$key;
// Make a copy of the imagefield data.
$clone_imagefield[$key] = $original_node->$key;
}
}
$method = "save-edit";
if ($method == "prepopulate") {
// The imagefield data is a flag that we can find during the form_alter.
$node->node_clone_imagefield = $clone_imagefield;
if (empty($_POST['op'])) {
drupal_set_message(t('Each pre-existing Imagefield file will be copied and attached when you submit (unless you select its "Delete" checkbox).'));
}
}
// только сюда
elseif ($method == "save-edit") {
foreach ($image_fields as $key) {
foreach ($node->$key as $delta => $file) {
_cloneimagefield_copy_file($node, $key, $delta);
}
}
}
}
/**
* Copy a specific attached file to a temporary location.
*
*/
function _cloneimagefield_copy_file(&$node, $key, $delta) {
$source = $node->{$key}[$delta]['filepath'];
// Create temporary name/path for duplicated files. On Windows, tempnam()
// requires an absolute path, so we use realpath().
$dest = dirname($source) . '/' . "exp_" . basename($source);
// Copy the file to the temporary location.
if (file_copy($source, $dest)) {
// $source now holds the actual filename used for the copy.
$node->{$key}[$delta]['filepath'] = $dest;
$node->{$key}[$delta]['fid'] = 'upload';
$node->{$key}[$delta]['nid'] = 0;
}
else {
// Copy failed, remove the file from the list of attachements.
unset($node->{$key}[$delta]);
}
}
Посмотрите, кто разбирается. Может что-то проясните.
Комментарии
http://drupal.org/project/node_clone - у меня он нормально копирует файлы imagefield.
Под 6-ку?
Да, под 5-ку там есть дополнительный модуль для ImaggeField.
Под пятерку Clone Imagefield
Под 6-ку он тоже копирует поля ImsgeField. Но при этом не копирует файлы и не изменяет ссылки в новой копии. Т.е. если удалить оригинал, то удалится и прикрепленная картинка, а в копии ноды ссылки в ImageField останутся на удаленный файл. А правильнее сделать копии файлов и в копии ноды выставить ссылки на новые файлы.