Puncte:1

Publicați programatic noduri nepublicate

drapel in

Doresc să public noduri nepublicate într-o acțiune personalizată. Pentru a face acest lucru, interog baza de date pe o anumită condiție și vreau să folosesc condiția „există” pentru a găsi ID-urile nodurilor de publicat. Acesta este codul pe care îl folosesc.

$interogare = \Drupal::entityQuery('nod');

foreach($i_selectat ca $is) {
  $nids = $interogare->andConditionGroup()
    ->condition('tip', 'nivel3')
    ->condition('titlu', $file_name)
    ->condition('stare', '0')
    ->există('nid')
    ->execute();

  $nids->setPublished(TRUE)->save();
}

Primesc această eroare,

Eroare: apel la metoda nedefinită Drupal\Core\Entity\Query\Sql\Condition::execute()

Interogarea SQL pe care încerc să o realizez este:

   selectați nid, status, title din node_field_data unde status = '0' și title = $filename

din rezultat, vreau să văd dacă nid-urile există și să public acele nid-uri.

Cum repar această eroare?

apaderno avatar
drapel us
Odată ce ați răspuns la întrebare, nu o puteți modifica, nici măcar pentru a adăuga o actualizare bazată pe răspunsurile date. Întrebările nu sunt pentru un dus și înapoi cu utilizatorii care răspund.
Jiah avatar
drapel in
Am verificat răspunsul tău doar după ce mi-am dat seama de partea mea. Mă voi asigura că nu actualizez întrebările. Mulțumesc pentru sprijin :)
Puncte:3
drapel us

Codul sună a executa() asupra obiectului returnat de la $query->andConditionGroup(), dar acel obiect nu implementează niciunul a executa() metodă.

Modul corect de utilizare andConditionGroup() este prezentat în QueryBase::andConditionGroup().

$interogare = \Drupal::entityQuery('desen');
$grup = $interogare->andConditionGroup()
  ->condition('figures.color', 'red')
  ->condition('figures.shape', 'triunghi');
$interogare->conditie($grup);
$grup = $interogare->andConditionGroup()
  ->condition('figuri.culoare', 'albastru')
  ->condition('figures.shape', 'cerc');
$interogare->conditie($grup);
$entity_ids = $query->execute();

În cazul dvs., folosind andConditionGroup() nu este necesar, deoarece interogarea executată de acel cod returnează toate nodurile pentru care:

  • Tipul de conținut este nivelul 3
  • Titlul este $nume_fișier
  • Starea este 0

Nu returnează toate nodurile pentru care cel puțin una dintre aceste condiții este adevărată. Este similar cu ceea ce face următorul cod, care returnează toate pagină noduri unde valoarea de field_some_field este mai mare de 14.

$interogare = \Drupal::entityQuery('nod')
  ->condition('tip', 'pagina')
  ->condition('câmp_un_câmp', 14, '>');
$rezultate = $interogare->execute();

$query->execute() returnează o serie de ID-uri de entități, nu o entitate sau o matrice de entități. $nids = $query->execute(); $nids->setPublished(TRUE)->save(); este încă greșit, deoarece o matrice nu implementează setPublished() metodă.
Dată o serie de ID-uri de noduri $nids, codul corect pentru a încărca nodurile este următorul.

$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple(array_values($nids));

$noduri va conține o serie de entități. Publicarea acestora se poate realiza cu următorul cod.

foreach ($noduri ca $nod) {
  $nod->setPublished(TRUE)->save();
}

Obiectul s-a întors de la \Drupal::entityQuery() verifică că utilizatorul conectat în prezent are acces de vizualizare la nodurile returnate. În majoritatea cazurilor, utilizatorul nu are acces la noduri nepublicate. Pentru a evita ca interogarea returnează numai nodurile pe care utilizatorul conectat în prezent le poate vizualiza, este necesar să le apelați $query->accessCheck(FALSE), ca în $interogare = \Drupal::entityQuery('nod')->checkAccess(FALSE);

În plus, cel există('nid') apelul nu este necesar, deoarece ID-ul nodului este întotdeauna salvat pentru noduri.

Lăsând bucla pe $i_selectat, codul pe care l-aș folosi este următorul.

$interogare = \Drupal::entityQuery('nod')->checkAccess(FALSE);

$nids = $query->condition('tip', 'nivel3')
  ->condition('titlu', $file_name)
  ->condition('stare', '0')
  ->execute();

$nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple(array_values($nids));

foreach ($noduri ca $nod) {
  $nod->setPublished(TRUE)->save();
}

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.