Рейтинг:1

Как проверить поле абзаца?

флаг sa

У меня есть тип абзаца с двумя полями: год и квартал

У меня есть тип контента с полем абзаца (field_year_and_quarter) с таргетингом ТОЛЬКО на этот тип абзаца

Я пытаюсь создать ограничение, чтобы запретить кодирование дубликата (тот же год/квартал)

Я пытался:

1-Ограничение на уровне узла, которое зацикливается на field_year_and_quarter с $node->get('field_year_and_quarter')->referencedEntities() чтобы проверить, есть ли дубликаты

=> Это не работает, так как не учитывает то, что закодировано в виджете, проверяется только последняя сохраненная версия

2-Ограничение на уровне абзаца, которое позволяет родителю зацикливаться на field_year_and_quarter с $node_parent->get('field_year_and_quarter')->referencedEntities() чтобы проверить, есть ли какие-либо дубликаты [я заменяю один элемент абзацем, указанным в параметре]

Вот код:

  общедоступная функция проверки ($certificate_p, ограничение $ограничение) {
    /* @var \Drupal\paragraphs\Entity\Paragraph $certificate_p */
    если ($certificate_p->bundle() == 'qoc') {
      $prod_company = $certificate_p->getParentEntity();
      $сертификаты = $prod_company->get('field_year_and_quarter')
        ->ссылочные объекты();
      $all_certificates = [];
      foreach ($ сертификаты как $ сертификат) {
        // используем абзац, указанный в параметре функции
        $certif_to_check = ($certificate_p->id() == $certificate->id()) ? $certificate_p : $сертификат;
        $year = $certif_to_check->get('field_qoc_year')->значение;
        $quarter = $certif_to_check->get('field_qoc_quarter')->значение;
        // Год/квартал уже закодированы
        если (isset($all_certificates[$год][$квартал])) {
          $this->context->addViolation($constraint->duplicate_certif, [
            '%quarter' => Surround_by_nbsp($quarter),
            '%year' => объемный_by_nbsp($год),
          ]);
          сломать;
        }
        $all_certificates[$year][$quarter] = TRUE;
      }
    }

=> Это не работает по той же причине

3- Ограничение на уровне поля... вот код:

  общедоступная функция проверки ($ элементы, ограничение $ ограничение) {
    $certificates = $items->referencedEntities();
    $all_certificates = [];
    foreach ($ сертификаты как $ сертификат) {
      $год = $сертификат->получить('field_qoc_year')->значение;
      $quarter = $certificate->get('field_qoc_quarter')->значение;
      // Год/квартал уже закодированы
      если (isset($all_certificates[$год][$квартал])) {
        $this->context->addViolation($constraint->duplicate_certif, [
          '%quarter' => Surround_by_nbsp($quarter),
          '%year' => объемный_by_nbsp($год),
        ]);
        сломать;
      }
      $all_certificates[$year][$quarter] = TRUE;
    }
  }

=> Не работает по той же причине

Что мне делать? (Я также безуспешно пытался проверить форму)

4uk4 avatar
флаг cn
Проверить несколько абзацев в ограничении не проблема, см. https://drupal.stackexchange.com/questions/278067/adding-constraint-to-paragraph-field. Может ли это быть связано с проблемой IEF из последнего вопроса? Кроме того, почему переменная является основным EntityReferenceFieldItemList, а не полем [ERR] (https://www.drupal.org/project/entity_reference_revisions)?
Baud avatar
флаг sa
1-я отредактировал вопрос, чтобы удалить неправильную ссылку. 2-я удалил IEF. 3-Приведенный вами пример будет работать, потому что он не проверяет внутренние значения... Это ограничение на уровне поля (например, мой пример 3), но в моем случае он продолжает говорить, что у меня есть дубликат, даже если я редактирую форма для его удаления (или наоборот)
miststudent2011 avatar
флаг fr
Связанное https://drupal.stackexchange.com/questions/294733/adding-constraint-to-entity-referenced-paragraph-field
Рейтинг:1
флаг cn

Хорошо, глядя на реализации ERR $items->referencedEntities() и $item->entity, кажется, что первая функция способна обрабатывать новые объекты, но только второе свойство вычисляемого поля может обрабатывать несохраненные объекты.

Поэтому попробуйте перебрать $items, а затем получить абзац из одного элемента поля:

foreach ($items as $item) {
  $paragaph = $item->entity;
  $value = $paragraph->field_foo->value;
  // ...
}
Baud avatar
флаг sa
ты спас мой день!!!! Большое спасибо!
4uk4 avatar
флаг cn
Отличная находка кстати! Не знал, что это имеет значение. Я связываю его со связанным примером.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.