สร้างโหนดโดยทางโปรแกรม


34

ฉันจะสร้างโหนดด้วยโปรแกรมโดยใช้ฟิลด์วันที่และรูปภาพได้อย่างไร

ฉันรู้ว่าฉันสามารถทำได้ใน Drupal 7 ด้วยรหัสต่อไปนี้

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

รหัสเทียบเท่าสำหรับ Drupal 8 คืออะไร


โปรดตรวจสอบหัวข้อนี้drupal.org/node/178506
Aryashree Pritikrishna

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

@Eyal โปรดให้มากขึ้นคำถาม details.this จะเรียกว่ามากเกินไปในอนาคต
Yusef

คำตอบ:


56

รหัสต่อไปนี้จะช่วยให้คุณบันทึกภาพในโหนดใหม่

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

สำหรับข้อมูลเพิ่มเติมโปรดดูที่http://realityloop.com/blog/2015/10/08/programmatically-attach-files-node-drupal-8


ในตัวอย่างที่เฉพาะเจาะจงนี้เราไม่ต้องการ \ Drupal \ file \ Entity \ File เนื่องจากเรารับไฟล์ภาพโดยตรงจากอินเทอร์เน็ต แต่ถ้าคุณเห็นลิงค์นี้realityloop.com/blog/2015/10/08/…คุณจะพบตัวอย่างของเอนทิตีของไฟล์ที่กำลังใช้งาน // สร้างวัตถุไฟล์จากไฟล์ที่คัดลอกในเครื่อง $ uri = file_unmanaged_copy ('public: //source.jpg', 'public: //destination.jpg', FILE_EXISTS_REPLACE); $ file = ไฟล์ :: สร้าง (['uri' => $ uri,]); $ File-> บันทึก ();
amitgoyal

ไม่มีภาพตัวอย่าง สิ่งนี้ทำ: drupal.org/files/druplicon-small.png
Kari Kääriäinen

13

ใน drupal 8 เอนทิตีเป็นวัตถุและเป็นเช่นนี้เพื่อสร้างเอนทิตีคือการสร้างอินสแตนซ์ของคลาสประเภทของกิจการ หากคุณทราบคลาสของเอนทิตีคุณสามารถใช้คำหลักใหม่หรือสร้างฟังก์ชันได้

IE $foo = new Foo();หรือ$foo = Foo::create();

หากคุณไม่รู้จักคลาสของเอนทิตี (เฉพาะชื่อเครื่อง) จากนั้นคุณสามารถใช้การร้องขอคลาสการจัดเก็บเช่น: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();

ในการเติมฟิลด์ของเอนทิตีคุณสามารถใช้$entity->set($key, $value)เมธอดบนเอนทิตีวัตถุหรือส่งผ่านkey=>valueอาร์เรย์ไปยังตัวสร้างเอนทิตี เช่นนี้:

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

ในการบันทึกเอนทิตีคุณต้องเรียกใช้$entity->save()เมธอดบนออบเจ็กต์เอนทิตี

เนื่องจากไฟล์ใน drupal 8 เป็นเอนทิตีที่คุณต้องผ่าน ID ของไฟล์เอนทิตีหรือเอนทิตีไฟล์จริงเป็นค่า

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

นี่คือรหัสสำหรับสถานการณ์เฉพาะของคุณ:

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

ฉันต้องการเพิ่มฟิลด์ภาพหนึ่งฟิลด์และวันที่หนึ่งฟิลด์ให้คำตอบกับประเภทฟิลด์นี้
Yusef

แต่วิธีการเติมฟิลด์ข้อความโดยทางโปรแกรมใน Drupal 8 ณ เวลาที่สร้างโหนด?
WM

ข้อมูลใน $ node_data ถูกแม็พกับฟิลด์โหนดโดยตรง หากคุณต้องการเพิ่มข้อความลงในเขตข้อมูลที่เรียกว่า field_body เพียงเพิ่มรายการอื่นด้วยคีย์ field_body
Eyal

ฉันได้อัปเดตคำตอบพร้อมรายละเอียดเพิ่มเติมแล้ว ยินดี.
Eyal

1
อัปเดตคำตอบของฉัน
Eyal

12

ฉันคิดว่าวิธีการวางวัตถุนั้นสะดวกกว่าใช่ไหม

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

หากคุณต้องการทำอย่างสะอาดที่สุด (ทดสอบได้) ให้ใช้entity_type.managerบริการ:

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

ปัญหาเกี่ยวกับNode::createฟังก์ชั่นนั่นคือการโทรแบบคงที่และนั่นเป็นสาเหตุที่คุณไม่สามารถทดสอบหน่วยของคุณได้อีกต่อไป หลีกเลี่ยงการโทรออกเมื่อใดก็ตามที่เป็นไปได้ มันจะทำให้โค้ดของคุณอ่านง่ายขึ้น (เพราะการอ้างอิงจะชัดเจน)


2

รหัสต่อไปนี้ใช้งานได้สำหรับฉัน

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 เลิกใช้แล้ว
Eyal

นอกจากนี้ยัง$form_stateมีเฉพาะในบริบทที่เฉพาะเจาะจงเท่านั้น มิฉะนั้นคุณจะไม่สามารถเข้าถึงได้
kiamlaluno

2

อีกวิธีในการสร้างโหนดด้วยอิมเมจคือ:

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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.