Erstellen Sie programmgesteuert Knoten

34

Wie kann ich programmgesteuert Knoten mit Datums- und Bildfeldern erstellen?

Ich weiß, dass ich es in Drupal 7 mit dem folgenden Code machen kann.

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);

Was ist der entsprechende Code für Drupal 8?

Yusef
quelle
Bitte überprüfe diesen Thread. Drupal.org/node/178506
Aryashree Pritikrishna 31.12.15
Node :: create ($ node_data_array) -> save ()
Eyal
@Eyal bitte geben Sie weitere Details.Diese Frage wird in Zukunft zu viel verwiesen
Yusef

Antworten:

56

Mit dem folgenden Code können Sie ein Bild in einem neuen Knoten speichern.

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();

Weitere Informationen finden Sie unter http://realityloop.com/blog/2015/10/08/programmatically-attach-files-node-drupal-8 .

amitgoyal
quelle
In diesem speziellen Beispiel wird \ Drupal \ file \ Entity \ File nicht benötigt, da die Bilddatei direkt aus dem Internet abgerufen wird. Wenn Sie diesen Link jedoch sehen , finden Sie dort Beispiele für die Verwendung der Entität Datei. // Dateiobjekt aus einer lokal kopierten Datei erstellen. $ uri = file_unmanaged_copy ('public: //source.jpg', 'public: //destination.jpg', FILE_EXISTS_REPLACE); $ file = File :: Create (['uri' => $ uri,]); $ file-> save ();
Amitgoyal
Das Beispielbild existiert nicht. Dieser tut es: drupal.org/files/druplicon-small.png
Kari Kääriäinen
13

In Drupal 8 sind Entitäten Objekte. Um eine Entität zu erstellen, muss eine Instanz der Typklasse der Entität erstellt werden. Wenn Sie die Klasse der Entität kennen, können Sie entweder das neue Schlüsselwort oder die Funktion create verwenden.

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

Wenn Sie die Klasse der Entität (nur den Computernamen) nicht kennen, können Sie die Anforderung der Speicherklasse folgendermaßen verwenden: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();

Zum Auffüllen der Felder einer Entität können Sie entweder die $entity->set($key, $value)Methode für das Entitätsobjekt verwenden oder ein key=>valueArray an den Entitätskonstruktor übergeben. So wie:

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

Um eine Entität zu speichern, müssen Sie nur die $entity->save()Methode für das Entitätsobjekt aufrufen .

Da Dateien in Drupal 8 auch Entitäten sind, müssen Sie entweder die ID der Dateientität oder die tatsächliche Dateientität als Wert übergeben.

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

Hier ist ein Code für Ihr spezifisches Szenario:

$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
quelle
Ich möchte ein Bildfeld und ein Datumsfeld hinzufügen, geben Sie Ihre Antwort mit diesen Feldtypen an.
Yusef
Wie werden Textfelder in Drupal 8 zum Zeitpunkt der Knotenerstellung programmgesteuert ausgefüllt?
WM
Die Daten in $ node_data werden direkt den Knotenfeldern zugeordnet. Wenn Sie einem Feld mit dem Namen field_body Text hinzufügen möchten, fügen Sie einfach einen weiteren Eintrag mit dem Schlüssel field_body hinzu.
Eyal
Ich habe meine Antwort mit mehr Details aktualisiert. Bitte schön.
Eyal
1
Meine Antwort wurde aktualisiert
Eyal
12

Ich denke, dass objektorientierter Weg praktischer ist, nicht wahr?

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

Wenn Sie es möglichst sauber (testbar) machen möchten, verwenden Sie entity_type.managerservice:

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

Das Problem mit der Node::createFunktion ist, dass es sich um einen statischen Aufruf handelt und Sie deshalb Ihre Klasse nicht mehr richtig testen können. Vermeiden Sie statische Anrufe, wann immer dies möglich ist. Dadurch wird der Code besser lesbar (da die Abhängigkeiten klar sind).

ssibal
quelle
2

Der folgende Code funktioniert für mich

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
quelle
1
entity_create ist veraltet
Eyal
Ist $form_stateauch nur in bestimmten Kontexten verfügbar. Andernfalls können Sie nicht darauf zugreifen.
kiamlaluno
2

Eine andere Möglichkeit, einen Knoten mit einem Bild zu erstellen, ist:

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