Criar nós de forma programática


34

Como criar programaticamente nós com campos de data e imagem?

Eu sei que posso fazer isso no Drupal 7 com o seguinte código.

global $user;

  $node = new stdClass();
  $node->title = "YOUR TITLE";
  $node->type = "YOUR_NODE_TYPE";
  node_object_prepare($node); // Sets some defaults. Invokes hook_prepare() and hook_node_prepare().
  $node->language = LANGUAGE_NONE; // Or e.g. 'en' if locale is enabled
  $node->uid = $user->uid; 
  $node->status = 1; //(1 or 0): published or not
  $node->promote = 0; //(1 or 0): promoted to front page
  //image field
  $existing_filepath = "/home/nzcodarnoc/sites/default/files/imported/picture.jpg"
  $new_filepath = "public://picture.jpg"
  // Create the file object
  $drupal_file = file_save_data(file_get_contents($existing_filepath), $new_filepath);
  $drupal_file->alt = $node->title;
  $drupal_file->title = $node->title;
  // Assign the file object to the node, as an array
  $node->field_my_file[$node->language][0] = get_object_vars($drupal_file);
  //date field
  $node->birth_date[LANGUAGE_NONE][0]['value'] = time();  
  $node = node_submit($node); // Prepare node for saving
  node_save($node);

Qual é o código equivalente para o Drupal 8?


Por favor, verifique esta discussão drupal.org/node/178506
Aryashree Pritikrishna

Node :: create ($ node_data_array) -> save ()
Eyal

@Eyal forneça mais details.this questão seja submetida muito no futuro
Yusef

Respostas:


56

O código a seguir ajudará você a salvar uma imagem em um novo nó.

use \Drupal\node\Entity\Node;
use \Drupal\file\Entity\File;

// Create file object from remote URL.
$data = file_get_contents('https://www.drupal.org/files/druplicon.small_.png');
$file = file_save_data($data, 'public://druplicon.png', FILE_EXISTS_REPLACE);

// Create node object with attached file.
$node = Node::create([
  'type'        => 'article',
  'title'       => 'Druplicon test',
  'field_image' => [
    'target_id' => $file->id(),
    'alt' => 'Hello world',
    'title' => 'Goodbye world'
  ],
]);
$node->save();

Para obter mais informações, consulte http://realityloop.com/blog/2015/10/08/programmatically-attach-files-node-drupal-8 .


Neste exemplo específico, não precisamos de \ Drupal \ file \ Entity \ File, pois estamos obtendo diretamente o arquivo de imagem da Internet. Mas se você vir este link realityloop.com/blog/2015/10/08/… , encontrará exemplos de entidades File sendo usadas, // Criar objeto de arquivo a partir de um arquivo copiado localmente. $ uri = file_unmanaged_copy ('public: //source.jpg', 'public: //destination.jpg', FILE_EXISTS_REPLACE); $ file = File :: Create (['uri' => $ uri,]); $ arquivo-> save ();
Amitgoyal 12/08/19

A imagem de exemplo não existe. Este é o seguinte: drupal.org/files/druplicon-small.png
Kari Kääriäinen

13

No drupal 8, entidades são objetos e, como tal, criar uma entidade é criar uma instância da classe de tipo da entidade. Se você conhece a classe da entidade, pode usar a nova palavra-chave ou a função de criação.

IE $foo = new Foo();ou$foo = Foo::create();

Se você não conhece a classe da entidade (apenas o nome da máquina), pode usar a solicitação da classe Storage da seguinte forma: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();

Para preencher os campos de uma entidade, você pode usar o $entity->set($key, $value)método no objeto da entidade ou passar uma key=>valuematriz para o construtor da entidade. Assim sendo:

$foo = new Foo([
  'name'=>'bar',
  'baz'=> TRUE,
  'multi_value' => [
    'first',
    'second',
    'third',
  ]
]);

Para salvar uma entidade, você só precisa chamar o $entity->save()método no objeto da entidade.

Como os arquivos no drupal 8 também são entidades, você precisa passar o ID da entidade de arquivo ou a entidade de arquivo real como valor.

$file_1 = File::load(1);
$foo->set('bar_files', [
  $file_1,
  2
]);

Aqui está um código para o seu cenário específico:

$node_entity_type = \Drupal::entityTypeManager()->getDefinition('node');
// The [file_save_upload][1] function returns an array of all the files that were saved.
$poster_images = file_save_upload($upload_name, $validators, $destination);
$node = new Node([
  $node_entity_type->getKey('bundle') => 'movie',
  $node_entity_type->getKey('label') => 'Foo',
  'field_release_date' => '1/1/2015',
  'field_poster_image' => $poster_images,
]);
$node->save();

Quero adicionar um campo de imagem e um campo de data, forneça sua resposta com esses tipos de campo.
Yusef

Mas como preencher campos de texto programaticamente no Drupal 8, no momento da criação do nó?
WM

Os dados em $ node_data são mapeados diretamente para os campos do nó. Se você deseja adicionar texto a um campo chamado field_body, basta adicionar outra entrada com a chave field_body.
Eyal

Atualizei minha resposta com mais detalhes. Você é bem vindo.
Eyal

11
Atualizei minha resposta
Eyal

12

Eu acho que a maneira orientada a objetos é mais conveniente, não é?

use Drupal\node\Entity\Node;

$my_article = Node::create(['type' => 'article']);
$my_article->set('title', 'My article');
$my_article->set('field_text', 'My text');
$my_article->set('field_image', FID);
$my_article->set('field_user', UID);
$my_article->enforceIsNew();
$my_article->save();

7

Se você deseja fazer da maneira mais limpa (testável), use o entity_type.managerserviço:

$storage = $this->entityTypeManager->getStorage($entity_type_id);
$my_entity = $storage->create([
   ....
]);

O problema com a Node::createfunção, que é chamada estática, e é por isso que você não pode mais testar sua unidade. Evite fazer chamadas estáticas sempre que possível. Isso tornará seu código mais legível (porque as dependências serão claras).


3

Outra maneira de criar nó com imagem é:

use \Drupal\file\Entity\File;

// Create file object from remote URL.
$data = file_get_contents('https://www.drupal.org/files/druplicon.small_.png');
$file = file_save_data($data, 'public://druplicon.png', FILE_EXISTS_REPLACE);

$node = \Drupal::entityTypeManager()->getStorage('node')->create(array(
  'type'        => 'article',
  'title'       => 'Druplicon test',
  'field_image' => [
    'target_id' => $file->id(),
    'alt' => 'Hello world',
    'title' => 'Goodbye world'
  ],
));
$node->save();

2

O código a seguir está funcionando para mim

use \Drupal\node\Entity\Node;
use \Drupal\file\Entity\File;

$node = entity_create('node', array(
'type' => 'article',
'title' => $form_state->getValue('title'),
'body' => array(
'value' => $form_state->getValue('body'),
'format' => 'basic_html',
),
'uid' => $uid,
));
$node->save();

11
entity_create é preterido
Eyal

Além disso, $form_stateestá disponível apenas em contextos específicos; caso contrário, você não poderá acessá-lo.
kiamlaluno

0
use Drupal\Core\Language\Language;


$definition = \Drupal::entityTypeManager()->getDefinition('node');
$values = [
    $definition->getKey('bundle') => 'basic_page',
    'langcode'                    => Language::LANGCODE_NOT_SPECIFIED,
    'title'                       => '...',
];
$entity = \Drupal::entityTypeManager()->getStorage('node')->create($values);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.