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?
Antworten:
Mit dem folgenden Code können Sie ein Bild in einem neuen Knoten speichern.
Weitere Informationen finden Sie unter http://realityloop.com/blog/2015/10/08/programmatically-attach-files-node-drupal-8 .
quelle
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 einkey=>value
Array an den Entitätskonstruktor übergeben. So wie: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.
Hier ist ein Code für Ihr spezifisches Szenario:
quelle
Ich denke, dass objektorientierter Weg praktischer ist, nicht wahr?
quelle
Wenn Sie es möglichst sauber (testbar) machen möchten, verwenden Sie
entity_type.manager
service:Das Problem mit der
Node::create
Funktion 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).quelle
Der folgende Code funktioniert für mich
quelle
$form_state
auch nur in bestimmten Kontexten verfügbar. Andernfalls können Sie nicht darauf zugreifen.Eine andere Möglichkeit, einen Knoten mit einem Bild zu erstellen, ist:
quelle
quelle