У меня есть тип абзаца с двумя полями: год и квартал
У меня есть тип контента с полем абзаца (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;
}
}
=> Не работает по той же причине
Что мне делать? (Я также безуспешно пытался проверить форму)