Jaki jest odpowiedni sposób na zdobycie przedmiotów z kolejki jednostek?

9

Miałem problemy ze znalezieniem przykładów API dla kolejki jednostek w Drupal 8.

Skończyło się na napisaniu zapytania, aby uzyskać przedmioty.

$query = $this->database->select('entity_subqueue__items', 'esi')
  ->fields('esi', array('items_target_id'))
  ->condition('esi.bundle', $name_of_queue)
  ->orderBy('delta', 'ASC');

$nids = $query->execute()->fetchCol();

Ale jeśli to możliwe, chciałbym użyć wbudowanej funkcji. Gdzie jest funkcja pobierania elementów z kolejki jednostek?

oknate
źródło
Taki sam jak w D7 - \ Drupal :: queue ('my queue') -> ClareItem ()
Nie sądzę, że to to samo. Istnieje kolejka tabel, która korzysta z obiektu DatabaseQueue. To jest moduł entityqueue. Wypróbowałem twój przykład, ale to nie działa, a po wczytaniu do kodu wygląda, że ​​obiekt DatabaseQueue patrzy na tabelę z kolumnami takimi jak „nazwa”, których brakuje w tabeli podmiot_subqueue__items.
oknate
Ach, przepraszam, nie używam modułu entityqueue.

Odpowiedzi:

12

Biorąc pod uwagę $ sid jest twoim identyfikatorem podkolejki:

$entity_subqueue = \Drupal::entityManager()->getStorage('entity_subqueue')->load($sid);

Ładuje obiekt podkolejki. Możesz nim manipulować, aby odzyskać lub zaktualizować kolejkę encji.

Aby zdobyć przedmioty:

$items = $entity_subqueue->get('items')->getValue();

Aby zaktualizować elementy, dodaj kolejny element do tablicy $ items, a następnie zapisz obiekt encji:

$items[] = ['target_id' => 69];

$entity_subqueue->set('items', $items);

$entity_subqueue->save();

Voila!

W bazie danych można sprawdzić, czy kolejka jednostek jest zaktualizowana:

select * from entity_subqueue__items where bundle = :sid;

Chciałbym również dodać, że w Drupal 8 istnieje świetna alternatywa dla używania encji . Moduł Config Pages . Pozwala tworzyć pakiety jednostek, które mają tylko jedną jednostkę. Następnie możesz dodać dowolny typ pola, w tym pola odniesienia encji. Niedawno zastąpiłem kolejkę encji w projekcie stroną konfiguracji z polem referencji encji i wolałem wrażenia użytkownika.

oknate
źródło
0

Istnieje również skrót do załadowania podkolejki: \Drupal\entityqueue\Entity\EntitySubqueue::load($sid);

rem
źródło