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?

Yusef
sumber
Silakan periksa utas ini drupal.org/node/178506
Aryashree Pritikrishna
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 .

amitgoyal
sumber
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();
Eyal
sumber
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();
Eugene
sumber
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).

ssibal
sumber
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();
JHONATAN DAVID FERNANDEZ ROSA
sumber
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();
visabhishek
sumber
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);
Salam Juhász
sumber