acf = $acf; $this->view = $view; $this->dataPost = $dataPost; $this->pageId = $pageId; $this->html = $markup; } protected function injectFieldInMarkup( string $fieldId, string $fieldMarkup, string $markup, bool $isRemoveWhenEmpty ): string { $regExpFieldId = str_replace('$', '\$', $fieldId); $regExp = "/([\s\S]*)/mi"; preg_match_all($regExp, $markup, $originItemMatch, PREG_SET_ORDER); $originItemMatch = $originItemMatch[0] ?? []; if (2 !== count($originItemMatch)) { return $markup; } $itemMarkup = ! $isRemoveWhenEmpty ? str_replace($fieldId, $fieldMarkup, $originItemMatch[1]) : ''; return str_replace($originItemMatch[0], $itemMarkup, $markup); } /** * @param FieldMeta $fieldMeta * @param Item $item * @param $fieldValue * * @return void */ protected function insertField( FieldMeta $fieldMeta, $item, $fieldValue ): void { $fieldMarkup = ''; $isRemoveWhenEmpty = true; if (! ! $fieldValue || $item->field->isVisibleWhenEmpty || 'true_false' === $fieldMeta->getType()) { $fieldMarkup = new FieldMarkup($this->acf, $fieldMeta, $item->field, $fieldValue); $fieldMarkup = $fieldMarkup->getMarkup(); $isRemoveWhenEmpty = false; } $this->html = $this->injectFieldInMarkup( '$' . $item->field->id . '$', $fieldMarkup, $this->html, $isRemoveWhenEmpty ); } public function insertFields(): void { // remove special symbols that used in the markup for a preview $this->html = str_replace(["\t", "\n", "\r"], '', $this->html); $fieldsMeta = $this->view->getFieldsMeta(); // e.g. already filled for cache/tests if (! $fieldsMeta) { $this->view->setFieldsMeta(); $fieldsMeta = $this->view->getFieldsMeta(); } foreach ($this->view->items as $item) { $fieldMeta = $fieldsMeta[$item->field->getAcfFieldId()]; // for IDE if (! $fieldMeta instanceof FieldMeta) { continue; } $fieldValue = $this->dataPost->getFieldValue($fieldMeta->getFieldId()); $fieldValue = $fieldValue ?: $item->field->defaultValue; $this->insertField($fieldMeta, $item, $fieldValue); } } public function getHTML(): string { return $this->html; } }