Копирование полей ImageField

Главные вкладки

Аватар пользователя Lexandro Lexandro 22 сентября 2008 в 14:01

Пытаюсь сделать массовое копирование материалов. За основу взял модуль 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]);
  }
}

Посмотрите, кто разбирается. Может что-то проясните.

Комментарии

Аватар пользователя Lexandro Lexandro 23 сентября 2008 в 9:13

Под 6-ку он тоже копирует поля ImsgeField. Но при этом не копирует файлы и не изменяет ссылки в новой копии. Т.е. если удалить оригинал, то удалится и прикрепленная картинка, а в копии ноды ссылки в ImageField останутся на удаленный файл. А правильнее сделать копии файлов и в копии ноды выставить ссылки на новые файлы.