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?

Yusef
fonte
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 .

amitgoyal
fonte
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();
Eyal
fonte
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();
Eugene
fonte
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).

ssibal
fonte
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();
JHONATAN DAVID FERNANDEZ ROSA
fonte
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();
visabhishek
fonte
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);
Sándor Juhász
fonte