Jak mogę programowo tworzyć węzły z polami daty i obrazu?
Wiem, że mogę to zrobić w Drupal 7 za pomocą następującego kodu.
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);
Jaki jest równoważny kod dla Drupal 8?
Odpowiedzi:
Poniższy kod pomoże ci zapisać obraz w nowym węźle.
Aby uzyskać więcej informacji, zobacz http://realityloop.com/blog/2015/10/08/programmatically-attach-files-node-drupal-8 .
źródło
W drupal 8 byty są obiektami i jako takie, stworzenie bytu jest stworzeniem wystąpienia klasy typu bytu. Jeśli znasz klasę jednostki, możesz użyć nowego słowa kluczowego lub funkcji tworzenia.
IE
$foo = new Foo();
lub$foo = Foo::create();
Jeśli nie znasz klasy encji (tylko nazwa komputera), możesz użyć żądania klasy Storage w następujący sposób:
\Drupal::entityTypeManager()->getStorage($entity_type_id)->create();
Aby wypełnić pola encji, możesz użyć
$entity->set($key, $value)
metody na obiekcie encji lub przekazaćkey=>value
tablicę do konstruktora encji. Takie jak:Aby zapisać encję, wystarczy wywołać
$entity->save()
metodę na obiekcie encji.Ponieważ pliki w Drupal 8 są również encjami, musisz podać jako identyfikator identyfikator encji pliku lub rzeczywistą encję pliku.
Oto kod dla konkretnego scenariusza:
źródło
Myślę, że ten obiektowy sposób jest wygodniejszy, prawda?
źródło
Jeśli chcesz to zrobić w najczystszy sposób (testowalny), skorzystaj z
entity_type.manager
usługi:Problem z
Node::create
funkcją, że jest to wywołanie statyczne i dlatego tak naprawdę nie możesz już testować jednostkowo swojej klasy. Unikaj wykonywania połączeń statycznych, gdy tylko jest to możliwe. Uczyni to twój kod bardziej czytelnym (ponieważ zależności będą jasne).źródło
Innym sposobem utworzenia węzła z obrazem jest:
źródło
Poniższy kod działa dla mnie
źródło
$form_state
dostępny tylko w określonych kontekstach; w przeciwnym razie nie będziesz mieć do niego dostępu.źródło