Программно прикреплять файлы

Я создал тип контента «Галерея» и добавил два поля: «фото» и «документ». Затем я использовал следующий код для загрузки файла в поле «документ»:

$file = file_save_upload('document', array(
    'file_validate_extensions' => array('txt doc'), // Validate extensions.
));

// If the file passed validation:
if ($file) {
// Move the file, into the Drupal file system
if ($file = file_move($file, 'public://')) {
  $file->status = FILE_STATUS_PERMANENT;
 // $file->file_display = 1;
  $file = file_save($file);

} else {
  $output = t('Failed to write the uploaded file the site\'s file folder.');
}       
 } else {
$output = t('No file was uploaded.');
 }

Я прикрепляю этот файл к узлу, используя следующий код:

$customNode->field_document[$customNode->language][0] = (array)$file;

Когда я вызываю функцию node_submit(), я получаю следующую ошибку:

  

Нарушение ограничения целостности: 1048 Столбец 'field_document_display' не может быть null

Кто-нибудь знает, что я делаю неправильно?

24 голоса | спросил Vinodkumar SC 30 PM00000060000004031 2011, 18:46:40

6 ответов


30

Я обычно не бросаю строку (array)$file, потому что на самом деле единственное, что нужны полевым данным, это fid, описание и отображение. Поэтому я обычно делаю следующее:

$node->field_image[LANGUAGE_NONE][] = array(
  'fid' => $file->fid,
  'display' => 1,
  'description' => '',
);
node_save( $node );

Таким образом, если дисплей необходим, я не получаю сообщение об ошибке. Но это только я ...

ответил Mark Casias 21 FebruaryEurope/MoscowbTue, 21 Feb 2012 21:56:37 +0400000000pmTue, 21 Feb 2012 21:56:37 +040012 2012, 21:56:37
12

Возможно, это помогает: Сохранить изображение программно в Drupal 7 .

Код, указанный в этом кратком руководстве, следующий:

global $user_id;

$node = node_load(1);

$image_url = 'http://example.com/image.png'; 
$file = file_save_data(file_get_contents($image_url), file_default_scheme().'://products_images/'.basename($image_url));
$file->uid = $user->uid;
$node->field_image[$node->language][0] = (array)$file;

node_save($node);

Сначала загрузите узел с идентификатором, равным единице, добавьте файл в поле «field_image» и сохраните узел с помощью node_save().
Переписывая код, вы сможете адаптировать его к своему делу.

ответил ram4nd 30 PM000000100000000931 2011, 22:23:09
7

Ваше решение почти правильно; однако в некоторых случаях это требует, чтобы вы также установили отображение и описание.

Чтобы сделать работу с вашим кодом, выполните следующие действия:

$file = file_save_upload('document', array(
    'file_validate_extensions' => array('txt doc'), // Validate extensions.
));

// If the file passed validation:
if ($file) {
// Move the file, into the Drupal file system
if ($file = file_move($file, 'public://')) {
  $file->status = FILE_STATUS_PERMANENT;
 // $file->file_display = 1;
  $file = file_save($file);
  //set the extra values needed to make node_save work
  $file->display = 1;
  $file->description = "";
} else {
  $output = t('Failed to write the uploaded file the site\'s file folder.');
}       
 } else {
$output = t('No file was uploaded.');
 }
ответил Eric van Eldik 28 +04002011-10-28T11:42:16+04:00312011bEurope/MoscowFri, 28 Oct 2011 11:42:16 +0400 2011, 11:42:16
2

Я думаю, что здесь ключевыми являются те строки

$file->display = 1;
$file->description = "";

, как указал Эрик ван Элдик. Я боролся с одной и той же проблемой, добавив просто

$file->display = 1;

не помогло, но

$file->description = "";

сделал мой день.

ответил Victor Lazov 5 12012vEurope/Moscow11bEurope/MoscowMon, 05 Nov 2012 20:12:03 +0400 2012, 20:12:03
0

Для добавления файла программно к узлу вы можете использовать

$managed = TRUE; // Whether or not to create a Drupal file record
$filename = 'public://imdb-cast-' . time() . '.jpg';
$iamge_file = system_retrieve_file($url,$filename , $managed);
if($iamge_file){
$file = file_load(db_query('SELECT MAX(fid) FROM {file_managed}')->fetchField());
$node->field_image['und'][0] = (array) $file;
  }
}
ответил zhilevan 15 J000000Friday16 2016, 17:46:15
0

Просто чтобы вставить мое решение здесь, мне нужно было создать новый узел и загрузить изображение программно.

$filepath = variable_get('file_public_path') . '/xmas_banner.jpg';
$file_temp = file_get_contents($filepath);
$file_temp = file_save_data($file_temp, file_default_scheme() . '://' .'xmas_banner_nl.jpg', FILE_EXISTS_RENAME);

$node = new stdClass();
$node->type = 'carousel'; // custom content type
$node->title = 'XMAS NL';
$node->field_banner_image['und'][0] = (array) $file_temp;
$node->uid = 1;
$node->status = 0;
$node->active = 0;
$node->promote = 0;
node_save($node);
ответил Bram 23 32016vEurope/Moscow11bEurope/MoscowWed, 23 Nov 2016 15:04:27 +0300 2016, 15:04:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132