프로그래밍 방식으로 노드 생성


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 자세한 내용을 알려주세요.이 질문은 앞으로 너무 많이 언급 될 것입니다
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 = 파일 :: Create ([ 'uri'=> $ uri,]); $ file-> save ();
amitgoyal

예제 이미지가 존재하지 않습니다. 이 일을 수행합니다 drupal.org/files/druplicon-small.png
카리 Kääriäinen

13

드루팔에서 엔티티는 객체이며, 따라서 엔티티를 생성하는 것은 엔티티 유형 클래스의 인스턴스를 생성하는 것입니다. 엔터티의 클래스를 알고 있다면 new 키워드 또는 create 함수를 사용할 수 있습니다.

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

하나의 이미지 필드와 하나의 날짜 ffield를 추가하고 싶습니다.이 필드 유형에 대한 답변을 제공하십시오.
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.managerservice를 사용하십시오 .

$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.