Puncte:1

Cum se validează un câmp de paragraf?

drapel sa

Am un tip de paragraf cu 2 câmpuri: an și trimestru

Am un tip de conținut cu un câmp de paragraf (câmp_an_și_trimestru) care vizează NUMAI acest tip de paragraf

Încerc să creez o constrângere pentru a interzice codificarea unui duplicat (același an/trimestru)

Am încercat:

1-O constrângere la nivelul nodului în care se face buclă câmp_an_și_trimestru cu $node->get('field_year_and_quarter')->referencedEntities() pentru a verifica dacă există vreun duplicat

=> Acest lucru nu funcționează, deoarece nu ia în considerare ceea ce este codificat în widget, doar ultima versiune salvată este verificată

2-O constrângere la nivel de paragraf care face ca părintele său să poată intra în buclă câmp_an_și_trimestru cu $node_parent->get('field_year_and_quarter')->referencedEntities() pentru a verifica dacă există un duplicat [Înlocuiesc un articol cu ​​paragraful prevăzut în parametru]

Iată codul:

  validare funcție publică($certificat_p, Constrângere $constrângere) {
    /* @var \Drupal\paragraphs\Entity\Paragraph $certificat_p */
    if ($certificat_p->bundle() == 'qoc') {
      $prod_company = $certificat_p->getParentEntity();
      $certificate = $prod_company->get('field_year_and_quarter')
        ->referencedEntities();
      $toate_certificatele = [];
      foreach ($certificate ca $certificat) {
        // folosiți paragraful furnizat în parametrul funcției
        $certificat_de_verificare = ($certificat_p->id() == $certificat->id()) ? $certificat_p : $certificat;
        $an = $cert_to_check->get('field_qoc_year')->value;
        $quarter = $certif_to_check->get('field_qoc_quarter')->value;
        // Anul/Tristrul sunt deja codificate
        dacă (isset($all_certificates[$an][$trimestru])) {
          $this->context->addViolation($constraint->duplicate_certif, [
            '%quarter' => surround_by_nbsp($quarter),
            '%an' => surround_by_nbsp($an),
          ]);
          pauză;
        }
        $all_certificates[$year][$quarter] = TRUE;
      }
    }

=> Acest lucru nu funcționează din același motiv

3- O constrângere la nivel de câmp... iată codul:

  validare funcție publică($articole, Constrângere $constrângere) {
    $certificates = $items->referencedEntities();
    $toate_certificatele = [];
    foreach ($certificate ca $certificat) {
      $an = $certificat->get('field_qoc_year')->valoare;
      $sfert = $certificat->get('field_qoc_quarter')->valoare;
      // Anul/Tristrul sunt deja codificate
      dacă (isset($all_certificates[$an][$trimestru])) {
        $this->context->addViolation($constraint->duplicate_certif, [
          '%quarter' => surround_by_nbsp($quarter),
          '%an' => surround_by_nbsp($an),
        ]);
        pauză;
      }
      $all_certificates[$year][$quarter] = TRUE;
    }
  }

=> Nu funcționează din același motiv

Ce ar trebuii să fac? (am incercat si eu sa validez in formular fara noroc)

4uk4 avatar
drapel cn
Nu este nicio problemă să validați mai multe paragrafe într-o constrângere, consultați https://drupal.stackexchange.com/questions/278067/adding-constraint-to-paragraph-field. Acest lucru ar putea fi legat de problema IEF de la ultima întrebare? De asemenea, de ce este variabila un câmp de bază EntityReferenceFieldItemList și nu un câmp [ERR](https://www.drupal.org/project/entity_reference_revisions)?
Baud avatar
drapel sa
1-Am editat întrebarea pentru a elimina referința greșită. 2-Am eliminat IEF-ul. 3-Exemplul pe care l-ai dat va funcționa pentru că nu verifică valorile interne... Aceasta este o constrângere la nivel de câmp (ca exemplul meu 3) dar, în cazul meu, tot spune că am un duplicat chiar dacă editez forma pentru a-l elimina (sau acesta opus)
miststudent2011 avatar
drapel fr
Înrudit https://drupal.stackexchange.com/questions/294733/adding-constraint-to-entity-referenced-paragraph-field
Puncte:1
drapel cn

OK, uitându-ne la implementările ERR ale $items->referencedEntities() și $item->entity, se pare că prima funcție este capabilă să gestioneze entități noi, dar numai a doua proprietate de câmp calculată este capabilă să gestioneze entitățile nesalvate.

Așa că încercați să treceți peste $items și apoi să obțineți paragraful din elementul de câmp unic:

foreach ($articole ca $item) {
  $paragaph = $item->entitate;
  $valoare = $paragraf->field_foo->valoare;
  // ...
}
Baud avatar
drapel sa
mi-ai salvat ziua!!!! Mulţumesc mult!
4uk4 avatar
drapel cn
Apropo, grozavă descoperire! Nu știam că asta face diferența. Îl încrucișez cu exemplul legat.

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.