Lập trình tạo các nút


34

Làm thế nào tôi có thể lập trình tạo các nút với các trường ngày và hình ảnh?

Tôi biết tôi có thể làm điều đó trong Drupal 7 với đoạn mã sau.

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

Mã tương đương cho Drupal 8 là gì?


Vui lòng kiểm tra chủ đề này drupal.org/node/178506
Aryashree Pritikrishna

Nút: tạo ($ node_data_array) -> save ()
Eyal

@Eyal vui lòng cung cấp thêm chi tiết. Câu hỏi này sẽ được đề cập quá nhiều trong tương lai
Yusef

Câu trả lời:


56

Đoạn mã sau sẽ giúp bạn lưu hình ảnh trong một nút mới.

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

Để biết thêm thông tin, hãy xem http://realityloop.com/blog/2015/10/08/programmatically-attach-files-node-drupal-8 .


Trong ví dụ cụ thể này, chúng tôi không cần \ Drupal \ file \ Entity \ File vì chúng tôi đang trực tiếp lấy tệp hình ảnh từ Internet. Nhưng nếu bạn thấy liên kết này factloop.com/blog/2015/10/08/ , bạn sẽ tìm thấy các ví dụ về thực thể Tệp đang được sử dụng, // Tạo đối tượng tệp từ một tệp được sao chép cục bộ. $ uri = file_unmanaged_copy ('công khai: //source.jpg', 'công khai: //destination.jpg', FILE_EXISTS_REPLACE); $ file = File :: Tạo (['uri' => $ uri,]); $ file-> save ();
amitgoyalty

Hình ảnh ví dụ không tồn tại. Cái này có: drupal.org/files/druplicon-small.png
Kari Kääriäinen

13

Trong drupal 8 thực thể là các đối tượng và như vậy, để tạo một thực thể là tạo một thể hiện của lớp loại thực thể. Nếu bạn biết lớp của thực thể thì bạn có thể sử dụng từ khóa mới hoặc hàm tạo.

IE $foo = new Foo();hoặc$foo = Foo::create();

Nếu bạn không biết lớp thực thể (chỉ tên máy) thì bạn có thể sử dụng yêu cầu lớp Storage như vậy: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();

Để điền vào các trường của một thực thể, bạn có thể sử dụng $entity->set($key, $value)phương thức trên đối tượng thực thể hoặc truyền một key=>valuemảng cho hàm tạo thực thể. Như vậy:

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

Để lưu một thực thể, bạn chỉ phải gọi $entity->save()phương thức trên đối tượng thực thể.

Vì các tệp trong drupal 8 cũng là các thực thể bạn cần truyền id của thực thể tệp hoặc thực thể tệp thực tế làm giá trị.

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

Đây là một mã cho kịch bản cụ thể của bạn:

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

Tôi muốn thêm một trường hình ảnh và một ngày ffield, cung cấp câu trả lời của bạn với các loại trường này.
Yusef

Nhưng làm thế nào để điền vào các trường văn bản theo chương trình trong Drupal 8, tại thời điểm tạo nút?
WM

Dữ liệu trong $ node_data được ánh xạ trực tiếp đến các trường nút. Nếu bạn muốn thêm văn bản vào một trường có tên là field_body, chỉ cần thêm một mục khác với khóa field_body.
Mắt

Tôi đã cập nhật câu trả lời của tôi với nhiều chi tiết hơn. Không có chi.
Mắt

1
Cập nhật câu trả lời của tôi
Eyal

12

Tôi nghĩ rằng cách hướng đối tượng là thuận tiện hơn, phải không?

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

Nếu bạn muốn làm theo cách sạch nhất (có thể kiểm tra), hãy sử dụng entity_type.managerdịch vụ:

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

Vấn đề với Node::createchức năng, đó là cuộc gọi tĩnh và đó là lý do tại sao bạn không thể thực sự kiểm tra lớp của mình nữa. Tránh thực hiện các cuộc gọi tĩnh bất cứ khi nào có thể. Nó sẽ làm cho mã của bạn dễ đọc hơn (vì các phụ thuộc sẽ rõ ràng).


2

Mã sau đang làm việc cho tôi

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
entity_create không được dùng nữa
Eyal

Ngoài ra, $form_statechỉ có sẵn trong bối cảnh cụ thể; nếu không, bạn không thể truy cập nó.
kiamlaluno

2

Một cách khác để tạo nút có hình ảnh là:

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

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.