Crear nodos mediante programación

34

¿Cómo puedo crear nodos mediante programación con campos de fecha e imagen?

Sé que puedo hacerlo en Drupal 7 con el siguiente 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);

¿Cuál es el código equivalente para Drupal 8?

Yusef
fuente
Por favor revise este hilo drupal.org/node/178506
Aryashree Pritikrishna
Nodo :: create ($ node_data_array) -> save ()
Eyal
@Eyal, por favor proporcione más detalles. Esta pregunta se referirá demasiado en el futuro
Yusef

Respuestas:

56

El siguiente código lo ayudará a guardar una imagen en un nuevo nodo.

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 obtener más información, consulte http://realityloop.com/blog/2015/10/08/programmatic-attach-files-node-drupal-8 .

amitgoyal
fuente
En este ejemplo específico, no necesitamos \ Drupal \ file \ Entity \ File ya que estamos obteniendo directamente el archivo de imagen de Internet. Pero si ve este enlace realityloop.com/blog/2015/10/08/… , encontrará ejemplos de entidad de archivo que se está utilizando, // Cree un objeto de archivo a partir de un archivo copiado localmente. $ uri = file_unmanaged_copy ('public: //source.jpg', 'public: //destination.jpg', FILE_EXISTS_REPLACE); $ archivo = Archivo :: Crear (['uri' => $ uri,]); $ archivo-> guardar ();
amitgoyal
La imagen de ejemplo no existe. Este sí: drupal.org/files/druplicon-small.png
Kari Kääriäinen
13

En drupal 8, las entidades son objetos y, como tal, crear una entidad es crear una instancia de la clase de tipo de la entidad. Si conoce la clase de la entidad, puede usar la nueva palabra clave o la función crear.

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

Si no conoce la clase de entidad (solo el nombre de la máquina), puede usar la solicitud de la clase Almacenamiento de la siguiente manera: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();

Para llenar los campos de una entidad, puede usar el $entity->set($key, $value)método en el objeto de la entidad o pasar una key=>valuematriz al constructor de la entidad. Como tal:

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

Para guardar una entidad solo tiene que llamar al $entity->save()método en el objeto de entidad.

Dado que los archivos en drupal 8 también son entidades, debe pasar el ID de la entidad de archivo o la entidad de archivo real como valor.

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

Aquí hay un código para su escenario 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
fuente
Quiero agregar un campo de imagen y un campo de fecha, proporcione su respuesta con este tipo de campo.
Yusef
Pero, ¿cómo llenar campos de texto mediante programación en Drupal 8, en el momento de la creación del nodo?
WM
Los datos en $ node_data se asignan directamente a los campos del nodo. Si desea agregar texto a un campo llamado field_body, simplemente agregue otra entrada con la clave field_body.
Eyal el
He actualizado mi respuesta con más detalles. De nada.
Eyal
1
Actualicé mi respuesta
Eyal
12

Creo que la forma orientada a objetos es más conveniente, ¿no?

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
fuente
7

Si desea hacerlo de la manera más limpia (comprobable), use el entity_type.managerservicio:

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

El problema con la Node::createfunción, que es una llamada estática, y es por eso que ya no puedes probar tu clase de forma unitaria. Evite hacer llamadas estáticas siempre que sea posible. Hará que su código sea más legible (porque las dependencias serán claras).

ssibal
fuente
3

Otra forma de crear un nodo con imagen es:

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
fuente
2

El siguiente código me funciona

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
fuente
1
entity_create está en desuso
Eyal
Además, $form_statesolo está disponible en contextos específicos; de lo contrario, no puede acceder a él.
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
fuente