¿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?
Respuestas:
El siguiente código lo ayudará a guardar una imagen en un nuevo nodo.
Para obtener más información, consulte http://realityloop.com/blog/2015/10/08/programmatic-attach-files-node-drupal-8 .
fuente
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 unakey=>value
matriz al constructor de la entidad. Como tal: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.
Aquí hay un código para su escenario específico:
fuente
Creo que la forma orientada a objetos es más conveniente, ¿no?
fuente
Si desea hacerlo de la manera más limpia (comprobable), use el
entity_type.manager
servicio:El problema con la
Node::create
funció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).fuente
Otra forma de crear un nodo con imagen es:
fuente
El siguiente código me funciona
fuente
$form_state
solo está disponible en contextos específicos; de lo contrario, no puede acceder a él.fuente