Программно создавать узлы

Как я могу программно создавать узлы с полями даты и изображения?

Я знаю, что могу сделать это в Drupal 7 со следующим кодом.

  глобальный $ user;

  $ node = new stdClass ();
  $ node-> title = "YOUR TITLE";
  $ node-> type = "YOUR_NODE_TYPE";
  node_object_prepare ($ узел); //Устанавливает некоторые значения по умолчанию. Вызывает hook_prepare () и hook_node_prepare ().
  $ node-> language = LANGUAGE_NONE; //Или, например, 'en', если локаль включена
  $ node-> uid = $ user-> uid;
  $ node-> status = 1; //(1 или 0): опубликовано или нет
  $ node-> promotion = 0; //(1 или 0): продвигается на главную страницу
  //поле изображения
  $ existing_filepath = "/home/nzcodarnoc/sites/default/files/imported/picture.jpg"
  $ new_filepath = "public: //picture.jpg"
  //Создаем файл-объект
  $ drupal_file = file_save_data (file_get_contents ($ existing_filepath), $ new_filepath);
  $ drupal_file-> alt = $ node-> title;
  $ drupal_file-> title = $ node-> title;
  //Назначьте объект файла узлу, как массив
  $ node-> field_my_file [$ node-> language] [0] = get_object_vars ($ drupal_file);
  //поле даты
  $ node-> birth_date [LANGUAGE_NONE] [0] ['value'] = time ();
  $ node = node_submit ($ node); //Подготовить узел для сохранения
  node_save ($ узел);
 

Что такое эквивалентный код для Drupal 8?

26 голосов | спросил zhilevan 31 ThuEurope/Moscow2015-12-31T13:38:46+03:00Europe/Moscow12bEurope/MoscowThu, 31 Dec 2015 13:38:46 +0300 2015, 13:38:46

7 ответов


44

Следующий код поможет вам сохранить изображение в новом узле.

  use \ Drupal \ node \ Entity \ Node;
use \ Drupal \ file \ Entity \ File;

//Создаем объект-файл из удаленного 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 = Node :: create ([
  'type' => 'статья',
  'title' => «Тест Druplicon»,
  'field_image' => [
    'target_id' => $ Файл- & GT; Идентификатор (),
    'alt' => 'Привет мир',
    'title' => 'Прощай мир'
  ],
]);
$ Node- & GT; сохранить ();
 

Для получения дополнительной информации см. http://realityloop.com/блог /2015/10 /08 /программно-прикрепляется-файлы-узел друпали-8 .

ответил amitgoyal 3 FebruaryEurope/MoscowbWed, 03 Feb 2016 17:11:28 +0300000000pmWed, 03 Feb 2016 17:11:28 +030016 2016, 17:11:28
8

В drupal 8 объектов являются объектами и как таковые, для создания сущности необходимо создать экземпляр класса типа объекта. Если вы знаете класс объекта, то вы можете либо использовать новое ключевое слово, либо функцию create.

т.е. $ foo = new Foo (); или $ foo = Foo :: create ();

Если вы не знаете класс сущности (только имя машины), вы можете использовать запрос класса Storage следующим образом: \ Drupal :: entityTypeManager () -> getStorage ($ entity_type_id) - & GT; создать ();

Чтобы заполнить поля объекта, вы можете использовать метод $ entity-> set ($ key, $ value) для объекта сущности или передать key => value в конструктор сущности. Таким образом:

  $ foo = new Foo ([
  'Имя' = & ЕТ; 'бара',
  'Базь = & GT; ПРАВДА,
  'multi_value' => [
    'первый',
    «Второй»,
    'в третьих',
  ]
]);
 

Чтобы сохранить объект, вам нужно вызвать метод $ entity-> save () объекта объекта.

Так как файлы в drupal 8 также являются объектами, вам необходимо либо передать идентификатор файловой сущности, либо фактический объект файла в качестве значения.

  $ file_1 = Файл :: load (1);
$ foo-> set ('bar_files', [
  $ File_1,
  2
]);
 

Вот код для вашего конкретного сценария:

  $ node_entity_type = \ Drupal :: entityTypeManager () -> getDefinition ('node');
//Функция [file_save_upload] [1] возвращает массив всех файлов, которые были сохранены.
$ poster_images = file_save_upload ($ upload_name, $ validators, $ destination);
$ node = новый узел ([
  $ node_entity_type-> getKey ('bundle') => 'кино',
  $ node_entity_type-> getKey ('label') => 'Foo',
  'field_release_date' => '1/1/2015',
  'field_poster_image' => $ poster_images,
]);
$ Node- & GT; сохранить ();
 
ответил Eyal 2 Jpm1000000pmSat, 02 Jan 2016 17:57:34 +030016 2016, 17:57:34
7

Я думаю, что объектно-ориентированный способ более удобен, не так ли?

  использовать 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- & GT; enforceIsNew ();
$ My_article- & GT; сохранить ();
 
ответил Eugene 6 TueEurope/Moscow2016-12-06T09:18:29+03:00Europe/Moscow12bEurope/MoscowTue, 06 Dec 2016 09:18:29 +0300 2016, 09:18:29
4

Если вы хотите сделать это самым чистым способом (проверяемым), используйте службу entity_type.manager :

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

Проблема с функцией Node :: create , что это статический вызов, и поэтому вы больше не можете тестировать свой класс. Избегайте делать статические вызовы всякий раз, когда это возможно. Это сделает ваш код более читаемым (потому что зависимости будут ясными).

ответил ssibal 22 MarpmWed, 22 Mar 2017 14:42:14 +03002017-03-22T14:42:14+03:0002 2017, 14:42:14
2

Следующий код работает для меня

  use \ Drupal \ node \ Entity \ Node;
use \ Drupal \ file \ Entity \ File;

$ node = entity_create ('node', array (
'type' => 'статья',
'title' => $ Form_state- & GT; GetValue ( 'название'),
'body' => массив (
'value' => $ Form_state- & GT; GetValue ( 'тело'),
'format' => 'Basic_html',
),
'uid' => $ UID,
));
$ Node- & GT; сохранить ();
 
ответил visabhishek 19 FebruaryEurope/MoscowbFri, 19 Feb 2016 20:13:32 +0300000000pmFri, 19 Feb 2016 20:13:32 +030016 2016, 20:13:32
1

Другой способ создания узла с изображением:

  use \ Drupal \ file \ Entity \ File;

//Создаем объект-файл из удаленного 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' => 'статья',
  'title' => «Тест Druplicon»,
  'field_image' => [
    'target_id' => $ Файл- & GT; Идентификатор (),
    'alt' => 'Привет мир',
    'title' => 'Прощай мир'
  ],
));
$ Node- & GT; сохранить ();
 
ответил JHONATAN DAVID FERNANDEZ ROSA 7 ThuEurope/Moscow2017-12-07T17:31:35+03:00Europe/Moscow12bEurope/MoscowThu, 07 Dec 2017 17:31:35 +0300 2017, 17:31:35
0
  использовать Drupal \ Core \ Language \ Language;


$ definition = \ Drupal :: entityTypeManager () -> getDefinition ('node');
$ values ​​= [
    $ definition-> getKey ('bundle') => 'Basic_page',
    'langcode' => Язык :: LANGCODE_NOT_SPECIFIED,
    'title' => '...',
];
$ entity = \ Drupal :: entityTypeManager () -> getStorage ('node') -> create ($ values);
 
ответил Sándor Juhász 20 PMpThu, 20 Apr 2017 16:07:32 +030007Thursday 2017, 16:07:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132