Drupal 6 Node Создание PHP скрипта с загрузкой файлов не работает - PullRequest
0 голосов
/ 07 февраля 2011

У меня есть этот PHP-скрипт, над которым я работаю, чтобы импортировать платежные квитанции в Drupal. Он делает все так, как я хочу, за исключением того, что скрипт не присоединяет загруженный файл PDF к узлу.

Несколько заметок; Файловая система Drupal настроена как приватная, не уверенная, имеет ли это значение или нет. Во-вторых, pdf-файлы уже находятся в правильном расположении 'paystubs / [uid] /paystub_1.pdf', поэтому я считаю, что моя проблема заключается в том, что файл неправильно связан с узлом.

Вот код

function create_drupal_node($employeeID, $employeeDate, $drupalUid, $file2) {
  $sourcePDF = "/var/www/html/mgldev.************.com/burst_pdfs/pdfs/" . $file2;
  $destinationPDF = '/paystubs/' . $drupalUid . '/' . $file2;
  $destination = '/paystubs/' . $drupalUid . '/';

  if (!file_check_directory($destination, TRUE)){
    echo "Failed to check dir, does it exist?";
    mkdir($destination);    
    echo "trying to drupal mkdir...";
  }

  // Copy the file to the Drupal files directory 
  if (file_exists($sourcePDF)) {
    if(!rename($sourcePDF, $destinationPDF)) {
        echo "Failed to move file\n";
    } 
  }

  //Create node and attach file uplaod
  $file_drupal_path = "paystubs/" . $drupalUid . "/" . $file2;
  $mime = 'pdf/application';

  $file = new stdClass();
  $file->filename = $file2;
  $file->filepath = $file_drupal_path;
  $file->filemime = $mime;
  $file->filesize = filesize($file_drupal_path);

  $file->uid = $drupalUid;
  $file->status = FILE_STATUS_PERMANENT;
  $file->timestamp = time();
  drupal_write_record('files', $file);

  $node = new StdClass();
  $node->type = 'paystub';
  $node->body = $employeeID;
  $node->title = $employeeDate;
  $node->field_paystub_upload = array(
    array(
      'fid' => $file->fid,
      'title' => $file2,
      'filename' => $file->filename,
      'filepath' => $file->filepath,
      'filesize' => $file->filesize,
      'mimetype' => $mime,
      'data' => array(
        'description' => $file2,
      ),
      'list' => 1,
    ),
  );
  $node->uid = $drupalUid;
  $node->status = 1;
  $node->active = 1;
  $node->promote = 1;
  node_save($node); 
}

Узел создан, а заголовок и тело узла имеют правильные значения. Когда я смотрю на узел с помощью модуля Devel, я вижу, что массив 'field_paystub_upload' равен нулю. Так что по какой-то причине он делает все правильно, кроме прикрепления файла к узлу, и это то, о чем я трахал голову несколько дней. Лучший ответ получает бесплатный интернет?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2011

Drupal file.inc file_save_upload использует $_FILES, который является глобальным, магически установленным PHP Drupal ожидает загруженный файл, а не файл, который существует локально.

Лучше всего просто вызвать специальный метод сохранения файлов для обработки локальных файлов. Убедитесь, что его путь тоже в таблице базы данных files. file_save_upload будет полезен для создания такого вспомогательного метода.

1 голос
/ 09 февраля 2011

Большое спасибо berkes за помощь в решении этой проблемы. Оказывается, поскольку файлы уже были на веб-сервере drupal и не загружались в глобальную переменную PHP $ _FILES, я не смог программно загрузить файл правильно.

Это вызывало любой другой способ, которым я пытался потерпеть неудачу. Я попытался использовать модуль загрузки Drupals defualt, а также попытался использовать модуль CCK fielfield, оба не работали. Благодаря предложению berkes я нашел функцию, которая поставляется с виджетом файловых полей CCK для сохранения загруженных файлов, которые уже находятся на сервере. Надеюсь, это поможет кому-то еще.

Это функция Я нашел, что может сохранить файл, который уже находится на веб-сервере.

Вот рабочий код, который я использовал для создания узла и прикрепления файла после вызова field_file_save_file.

function create_drupal_node($employeeID, $employeeDate, $drupalUid, $file2){
    $file_remove_html_extention = substr($file2, 0, -7);
    $file_pdf = $file_remove_html_extention . '.pdf';</p>

<pre><code>$node = new stdClass();
$node->type = 'paystub';
$node->status = 1;
$node->uid = $drupalUid;
$node->title = $employeeDate . ' - eStub';
$node->body = $employeeID;
$node->created = time();
$node->changed = $node->created;
$node->promote = 1;
$node->sticky = 0;
$node->format = 1;
$node->language = 'en';

$file = '/var/www/html/mgldev.foobar.com/burst_pdfs/pdfs/' . $file_pdf;

// Get the path to your Drupal site's files directory 
$dest_folder = '/paystubs/' . $drupalUid;
$dest = 'paystubs/' . $drupalUid . '/' . $file_pdf;

if (!file_check_directory($dest_folder, TRUE)){
mkdir($dest_folder);    

}

// Загружаем поле CCK $ field = content_fields ('field_paystub_upload', 'paystub'); // Загружаем соответствующие валидаторы $ validators = array_merge (filefield_widget_upload_validators ($ field)); // Создать объект файла $ file = field_file_save_file ($ file, $ validators, $ dest_folder); // Применить файл к полю, это устанавливает только первый файл, может быть зациклен // если было больше файлов $ node-> field_paystub_upload = array (0 => $ file); // Файл был скопирован в соответствующий каталог, поэтому его можно // удален из каталога импорта разъединить ($ файла); // изменить статус файла на постоянный file_set_status ($ файл, 1); node_save ($ узел); }

Еще раз спасибо berkes

...