Secara terprogram membuat node


34

Bagaimana saya bisa membuat pemrograman dengan bidang tanggal dan gambar?

Saya tahu saya bisa melakukannya di Drupal 7 dengan kode berikut.

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

Apa kode yang setara untuk Drupal 8?



Node :: create ($ node_data_array) -> save ()
Eyal

@Eyal tolong berikan lebih banyak detail. Pertanyaan ini terlalu banyak dirujuk di masa mendatang
Yusef

Jawaban:


56

Kode berikut akan membantu Anda menyimpan gambar di simpul baru.

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

Untuk informasi lebih lanjut, lihat http://realityloop.com/blog/2015/10/10/programmatically-attach-files-node-drupal-8 .


Dalam contoh khusus ini, kita tidak perlu \ Drupal \ file \ Entity \ File karena kita langsung mendapatkan file gambar dari Internet. Tetapi jika Anda melihat tautan ini realityloop.com/blog/2015/10/10/... , di sana Anda akan menemukan contoh entitas File yang digunakan, // Buat objek file dari file yang disalin secara lokal. $ uri = file_unmanaged_copy ('public: //source.jpg', 'public: //destination.jpg', FILE_EXISTS_REPLACE); $ file = File :: Create (['uri' => $ uri,]); $ file-> save ();
amitgoyal

Contoh gambar tidak ada. Yang ini: drupal.org/files/druplicon-small.png
Kari Kääriäinen

13

Dalam drupal 8 entitas adalah objek dan dengan demikian, membuat entitas adalah dengan membuat instance dari kelas tipe entitas. Jika Anda mengetahui kelas entitas maka Anda dapat menggunakan kata kunci baru atau fungsi buat.

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

Jika Anda tidak tahu kelas entitas (hanya nama mesin) maka Anda dapat menggunakan permintaan kelas Penyimpanan seperti: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();

Untuk mengisi bidang suatu entitas Anda dapat menggunakan $entity->set($key, $value)metode pada objek entitas atau meneruskan key=>valuearray ke konstruktor entitas. Dengan demikian:

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

Untuk menyimpan entitas, Anda hanya perlu memanggil $entity->save()metode pada objek entitas.

Karena file dalam drupal 8 juga merupakan entitas, Anda harus memberikan id entitas file, atau entitas file yang sebenarnya, sebagai nilainya.

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

Berikut adalah kode untuk skenario spesifik Anda:

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

Saya ingin menambahkan satu bidang gambar dan satu bidang tanggal, berikan jawaban Anda dengan jenis bidang ini.
Yusef

Tetapi bagaimana cara mengisi bidang teks secara terprogram dalam Drupal 8, pada saat pembuatan simpul?
WM

Data dalam $ node_data dipetakan langsung ke bidang simpul. Jika Anda ingin menambahkan teks ke bidang bernama field_body, tambahkan saja entri lain dengan kunci field_body.
Eyal

Saya telah memperbarui jawaban saya dengan lebih detail. Sama sama.
Eyal

1
Diperbarui jawaban saya
Eyal

12

Saya pikir cara berorientasi objek lebih mudah, bukan?

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

7

Jika Anda ingin melakukannya dengan cara yang paling bersih (dapat diuji), gunakan entity_type.managerlayanan:

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

Masalah dengan Node::createfungsi, itu adalah panggilan statis, dan itulah mengapa Anda tidak dapat benar-benar menguji kelas Anda lagi. Hindari melakukan panggilan statis kapan pun memungkinkan. Ini akan membuat kode Anda lebih mudah dibaca (karena dependensi akan lebih jelas).


3

Cara lain untuk membuat simpul dengan gambar adalah:

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

2

Kode berikut berfungsi untuk saya

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

1
entitas_create sudah tidak digunakan lagi
Eyal

Juga, $form_statehanya tersedia dalam konteks tertentu; jika tidak, Anda tidak dapat mengaksesnya.
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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.