प्रोग्रामेटिक रूप से नोड्स बनाएं


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
आर्यश्री प्रितिकृष्ण

नोड :: बनाने ($ node_data_array) -> बचाने ()
ईयाल

@ कृपया अधिक विवरण प्रदान करें। इस प्रश्न को भविष्य में बहुत अधिक संदर्भित किया जाएगा
युसेफ

जवाबों:


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 ('जनता: //source.jpg', 'public: //destination.jpg', FILE_EXISTS_REPLACE); $ फ़ाइल = फ़ाइल :: बनाएँ (['uri' => $ uri,]); $ फ़ाइल> सहेजें ();
amitgoyal

उदाहरण छवि मौजूद नहीं है। यह एक करता है: drupal.org/files/druplicon-small.png
कारी कौशल्या

13

ड्रुपल में 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()इकाई ऑब्जेक्ट पर विधि को कॉल करना होगा ।

चूंकि ड्रुपल 8 में फाइलें भी इकाइयां हैं, जिन्हें आपको या तो फ़ाइल इकाई की आईडी, या वास्तविक फ़ाइल इकाई को मान के रूप में पास करना होगा।

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

मैं एक छवि फ़ील्ड और एक दिनांक फ़ील्ड जोड़ना चाहता हूं, इस फ़ील्ड प्रकार के साथ अपना उत्तर प्रदान करें।
युसुफ

लेकिन नोड निर्माण के समय, Drupal 8 में प्रोग्राम फ़ील्ड को कैसे पॉप्युलेट किया जाए?
WM

$ Nd_data में डेटा सीधे नोड क्षेत्रों पर मैप किया जाता है। यदि आप किसी फ़ील्ड में टेक्स्ट जोड़ना चाहते हैं, जिसे कहा जाता है field_body तो कुंजी field_body के साथ एक और प्रविष्टि जोड़ें।
इल

मैंने अधिक विवरण के साथ अपना उत्तर अपडेट किया है। आपका स्वागत है।
इल

1
मेरा जवाब अपडेट किया गया
ईयाल

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
Unit_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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.