*/ class FieldCollection extends Collection { public function forMembers(): self { return $this->filter(fn ($field) => $field->forMembers === true); } public function withNamiType(): self { return $this->filter(fn ($field) => $field->namiType !== null); } public function noNamiType(): self { return $this->filter(fn ($field) => $field->namiType === null); } public function noNamiField(): self { return $this->filter(fn ($field) => !is_a($field, NamiField::class)); } /** * @return stdClass */ public function getMailRecipient(): ?stdClass { $firstname = $this->findBySpecialType(SpecialType::FIRSTNAME)?->value; $lastname = $this->findBySpecialType(SpecialType::LASTNAME)?->value; $email = $this->findBySpecialType(SpecialType::EMAIL)?->value; return $firstname && $lastname && $email ? (object) [ 'name' => "$firstname $lastname", "email" => $email, ] : null; } /** * @param array $input */ public static function fromRequest(Form $form, array $input): self { return $form->getFields()->each(fn ($field) => $field->value = array_key_exists($field->key, $input) ? $input[$field->key] : $field->default()); } /** * @return array */ public function present(): array { $attributes = collect([]); foreach ($this as $field) { $attributes = $attributes->merge($field->present()); } return $attributes->toArray(); } private function findBySpecialType(SpecialType $specialType): ?Field { return $this->first(fn ($field) => $field->specialType === $specialType); } }