Puncte:-1

Cum pot verifica dacă câmpul titlu al entității mele este scris în tabelul de bază de date necesar și că nu este scris niciun alt câmp acolo?

drapel my

Am o entitate numită Entity Product. Și această entitate are un formular, dacă modificați câmpul Titlu din acest formular, Drupal va salva automat noua valoare a acestui câmp în tabelul corespunzător din baza de date, dar în plus, salvez și modificarea câmpului Titlu în formular într-un alt tabel de bază de date produs_produs prin crearea unui _custom_product_save_title funcţie. Este necesar. Și această funcție este numită în hook_ENTITY_TYPE_update() care urmărește modificările în Produsul Entității.

Trebuie să adaug o verificare pentru a vedea dacă titlul este salvat și dacă alte câmpuri nu sunt salvate. Vă rog să-mi spuneți cum ar trebui să arate un astfel de control și unde ar trebui să fie exact în cod?

funcția _custom_product_save_title($custom_product_id, $entity_product_title) {

  if (isset($fields['url']) && $fields['url'] == '') {
    if (isset($fields['nume'])) {
      $fields['url'] = strtolower(str_replace(' ', '-', $fields['nume']));
    }
  }
  $id = $form_state->getValue('cid');
  dacă (!empty($form_state->getValue('cid'))) {
    $interogare = $this->connection->update($this->getTableName())
      ->condition('cid', $form_state->getValue('cid'));
  }
  else {
    $interogare = $this->connection->insert($this->getTableName());
  }
  $rezultat = $interogare
    ->câmpuri($câmpuri)
    ->execute();
  dacă (!$id) {
    $id = $rezultat;
  }
 
  Cache::invalidateTags([
    "produs:" . $form_state->getValue('cid'),
  ]);

  Cache::invalidateTags([
    „produs:$custom_product_id”,
  ]);

  dacă (!$custom_product_id) {
    Cache::invalidateTags([
      "lista de produse",
    ]);
  }

}

/**
 * Implementează hook_ENTITY_TYPE_update().
 */
function product_admin_node_update(\Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->bundle() == 'produs') {
    $custom_product_id = $entity->get('field_product_cid')->value;
    $entity_product_title = $entity->getTitle();
    _custom_product_save_title($custom_product_id, $entity_product_title);
  }
}

După depanarea codului folosind xdebug, văd următoarea structură a ceea ce vine în argumentul standard $entitate a cârligului:

$entitate
  câmpuri
    field_product_cid
    field_second
    .....
    titlu
      x-implicit
        listă
          0
            valorile
              valoare = âTitlul meuâ
apaderno avatar
drapel us
Bun venit la Drupal Answers! Când `hook_ENTITY_TYPE_update()` este invocat, entiy și câmpurile sale sunt deja salvate în baza de date.
leymannx avatar
drapel ne
Utilizați `hook_ENTITY_TYPE_presave` pentru a suprascrie datele înainte ca acestea să fie stocate fără a fi nevoie să vă amestecați cu baza de date sau cu memoria cache. Lasă totul în seama lui Drupal.
apaderno avatar
drapel us
`_custom_product_save_title()` nu are niciun parametru `$form_state` sau `$fields` și nici (ca funcție) nu are acces la `$this`. Aceasta înseamnă că `$form_state->getValue('cid')` și `$this->connection->update($this->getTableName())` ar cauza erori sau avertismente.
apaderno avatar
drapel us
Când puneți o întrebare, vă rugăm să afișați codul pe care îl utilizați cu adevărat și să verificați că codul este cod PHP valid.
sonfd avatar
drapel in
Cred că întrebarea dvs. reală este „[Cum] să adăugați o verificare pentru a vedea dacă titlul este salvat și dacă alte câmpuri nu sunt salvate [în hook_entity_update()]”, dar nu sunt sigur ce înseamnă asta. Cea mai bună presupunere este că doriți să testați dacă titlul entității a fost schimbat, dar nu alte modificări, dar asta nu are prea mult sens pentru mine în contextul postării dvs. generale.

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.