Anexar arquivos programaticamente

25

Eu criei o tipo de conteúdo "Galeria" e adicionei dois campos: "foto" e "documento". Em seguida, usei o seguinte código para carregar um arquivo no campo "documento":

$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.');
 }

Estou anexando este arquivo ao nó usando o seguinte código:

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

Quando chamo node_submit()função, recebo o seguinte erro:

Violação de restrição de integridade: 1048 A coluna 'field_document_display' não pode ser nula

Alguém sabe o que estou fazendo de errado?

Vinodkumar SC
fonte

Respostas:

29

Normalmente, não jogo na (array)$filelinha porque realmente a única coisa que os dados do campo precisam é da descrição, descrição e exibição. Então, eu costumo fazer o seguinte:

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

Dessa forma, se a exibição for necessária, não recebo um erro. Mas isso sou só eu ...

Mark Casias
fonte
Confuso para mim por que não tem valores padrão.
32i
Você não vê valores padrão porque é uma atribuição direta.
Lester Peabody #
7

Sua solução está quase certa; no entanto, em alguns casos, é necessário definir também a exibição e a descrição.

Para fazer seu código funcionar, faça o seguinte:

$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
fonte
2

Eu acho que a chave aqui são essas linhas

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

como Eric van Eldik apontou. Eu estava lutando com exatamente o mesmo problema, adicionando apenas

$file->display = 1;

não ajudou, mas

$file->description = "";

fez o meu dia.

Victor Lazov
fonte
0

Para adicionar arquivo programaticamente ao nó, você pode usar

$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;
  }
}
Yusef
fonte
0

Apenas para colar minha solução aqui também, eu precisava criar um novo nó e fazer upload de uma imagem programaticamente.

$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
fonte
0

Anexe vários arquivos programaticamente no Drupal 8:

foreach ($fileIds as $fid) {
  $node->field_images[] = [
    'target_id' => $fid,
    'alt' => 'ALT TEXT',
    'title' => 'TITLE TEXT'
  ];
}
$node->save();
Tien Wang
fonte