web-gelistirme-sc.com

Programlı olarak düğümler oluşturun

Tarih ve görüntü alanlarıyla programlı olarak nasıl düğüm oluşturabilirim?

Ben şu kodu ile Drupal 7 yapabilirim biliyorum.

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 için eşdeğer kod nedir?

35
Yusef

Aşağıdaki kod, görüntüyü yeni bir düğüme kaydetmenize yardımcı olacaktır.

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

Daha fazla bilgi için bkz. http://realityloop.com/blog/2015/10/08/programmatically-attach-files-node-drupal-8 .

59
amitgoyal

Nesneye yönelik yolun daha uygun olduğunu düşünüyorum, değil mi?

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

drupal 8 varlık nesnelerdir ve bu nedenle varlık oluşturmak için varlığın tür sınıfının bir örneğini oluşturmaktır. Varlığın sınıfını biliyorsanız, yeni anahtar sözcüğü kullanabilirsiniz veya oluşturma işlevi.

I.E. $foo = new Foo(); veya $foo = Foo::create();

Varlık sınıfını (yalnızca makine adını) bilmiyorsanız, Depolama sınıfını şu şekilde kullanabilirsiniz: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();

Bir varlığın alanlarını doldurmak için varlık nesnesinde $entity->set($key, $value) yöntemini kullanabilir veya varlık yapıcısına bir key=>value Dizisi iletebilirsiniz. Gibi:

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

Bir objeyi kaydetmek için sadece obje nesnesindeki $entity->save() yöntemini çağırmanız gerekir.

drupal 8 içindeki dosyalar da varlık olduğundan, değer olarak dosya varlığının kimliğini veya gerçek dosya varlığını iletmeniz gerekir.

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

Özel senaryo için bir kod:

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

Bunu en temiz şekilde yapmak istiyorsanız (test edilebilir), entity_type.manager Hizmetini kullanın:

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

Node::create İşlevi ile ilgili sorun, statik çağrı olmasıdır ve bu yüzden artık sınıfınızı gerçekten birim test edemezsiniz. Mümkün olduğunca statik çağrı yapmaktan kaçının. Kodunuzu daha okunabilir hale getirecektir (çünkü bağımlılıklar açık olacaktır).

7
ssibal

Aşağıdaki kod benim için çalışıyor

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

Görüntü ile düğüm oluşturmanın başka bir yolu:

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();
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);
0
Sándor Juhász