Перейти к основному контенту

Реализация формы React Formik с хуком useFormConfig.

В этом примере мы демонстрируем, как реализовать форму React Formik, используя хук OneEntry useFormConfig.

✅ Цель сценария:

  • Реализовать форму Formik, используя хук OneEntry useFormConfig.
  • Убедиться, что данные правильно отформатированы и проверены перед отправкой.

✅ Что вам нужно:

  • Действительный PROJECT_URL и APP_TOKEN для аутентификации с API OneEntry.
  • Настроенная среда разработки с включенным React.js (например, Next.js, Create React App).
  • Настроенная в интерфейсе OneEntry контактная форма с маркером "contact_us".

📌 Важно:

  • Эти примеры не включают обработку ошибок.
  • Вы можете управлять ошибками, используя блок try-catch или применяя конструкцию типа await Promise.catch((error) => error).
  • Убедитесь, что маркер формы (например, "contact_us"), используемый в Forms.getFormByMarker, соответствует существующей форме в вашем проекте OneEntry.

Сценарий

1. Импортируйте oneEntry и определите url и token

Пример:

import { defineOneEntry } from 'oneentry';

const PROJECT_URL = 'your-project-url';
const APP_TOKEN = 'your-app-token';

2. Создание API-клиента с помощью функции defineOneEntry()

Пример:

const { Forms } = defineOneEntry(PROJECT_URL, {
token: APP_TOKEN,
});

Получение данных формы из oneentry

Пример:

const formData = await Forms.getFormByMarker('contact_us');
Результат:
{
"id": 3,
"attributeSetId": 2,
"type": "data",
"localizeInfos": {
"title": "Свяжитесь с нами",
"titleForSite": "",
"successMessage": "Сообщение о успешной обработке данных",
"unsuccessMessage": "Сообщение о неуспешной обработке данных",
"urlAddress": "",
"database": "0",
"script": "0"
},
"version": 5,
"position": 1,
"identifier": "contact_us",
"processingType": "script",
"templateId": null,
"attributes": [
{
"type": "string",
"marker": "first_name",
"isLogin": null,
"isSignUp": null,
"position": 1,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {
"requiredValidator": {
"strict": true
}
},
"localizeInfos": {
"title": "Имя"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "string",
"marker": "email",
"isLogin": null,
"isSignUp": null,
"position": 2,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {
"requiredValidator": {
"strict": true
},
"emailInspectionValidator": true
},
"localizeInfos": {
"title": "Электронная почта"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "string",
"marker": "surname",
"isLogin": null,
"isSignUp": null,
"position": 3,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {
"stringInspectionValidator": {
"stringMax": 0,
"stringMin": 0,
"stringLength": 0
}
},
"localizeInfos": {
"title": "Фамилия"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "list",
"marker": "topic",
"isLogin": null,
"isSignUp": null,
"position": 4,
"settings": {},
"isVisible": true,
"listTitles": [
{
"title": "Статья",
"value": "article",
"extended": {
"type": null,
"value": null
},
"position": 1
},
{
"title": "Статья-2",
"value": "article-2",
"extended": {
"type": null,
"value": null
},
"position": 2
}
],
"validators": {
"requiredValidator": {
"strict": true
}
},
"localizeInfos": {
"title": "Тема"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "text",
"marker": "text",
"isLogin": null,
"isSignUp": null,
"position": 5,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Текст"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "spam",
"marker": "spam",
"isLogin": null,
"isSignUp": null,
"position": 6,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Вы не робот?"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
},
{
"type": "button",
"marker": "send",
"isLogin": null,
"isSignUp": null,
"position": 7,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {},
"localizeInfos": {
"title": "Отправить"
},
"additionalFields": [],
"isNotificationEmail": null,
"isNotificationPhoneSMS": null,
"isNotificationPhonePush": null
}
]
}

Используйте хук useFormConfig

Этот хук предоставляет данные конфигурации формы.

Пример:

const {
fields,
initialValues,
validationSchema,
} = useFormConfig(formData?.attributes);

Интеграция с Formik

Пример:

<Formik initialValues={initialValues} validationSchema={validationSchema} onSubmit={() => {}}>
{({
values,
errors,
touched,
handleChange,
handleBlur,
handleSubmit,
isSubmitting,
}) => {
return (
<form onSubmit={handleSubmit}>
<input
type="email"
name="email"
onChange={handleChange}
onBlur={handleBlur}
value={values?.email}
/>
<input
type="text"
name="first_name"
onChange={handleChange}
onBlur={handleBlur}
value={values?.first_name}
/>
<input
type="text"
name="surname"
onChange={handleChange}
onBlur={handleBlur}
value={values?.surname}
/>
<button type="submit" disabled={isSubmitting}>
Отправить
</button>
</form>
);
}}
</Formik>

Финальный пример

// 1. Импортируйте defineOneEntry, Formik и useFormConfig
import { defineOneEntry } from 'oneentry';
import { Formik } from 'formik';
import useFormConfig from './useFormConfig';

// 1.1 определите PROJECT_URL и APP_TOKEN
const PROJECT_URL = 'your-project-url';
const APP_TOKEN = 'your-app-token';

// 2. Создание API-клиента
const { Forms, FormData } = defineOneEntry(PROJECT_URL, {
token: APP_TOKEN,
});

// 3. Получите данные формы из OneEntry
const formData = await Forms.getFormByMarker('contact_us');

// 4. Извлеките конфигурацию формы с помощью react-хука useFormConfig
const {
fields,
initialValues,
validationSchema,
} = useFormConfig(formData?.attributes);

// 5. Создайте форму с помощью Formik и данных useFormConfig
return (
<Formik initialValues={initialValues} validationSchema={validationSchema} onSubmit={() => {}}>
{({
values,
errors,
touched,
handleChange,
handleBlur,
handleSubmit,
isSubmitting,
}) => {
return (
<form onSubmit={handleSubmit}>
<input
type="email"
name="email"
onChange={handleChange}
onBlur={handleBlur}
value={values?.email}
/>
<input
type="text"
name="first_name"
onChange={handleChange}
onBlur={handleBlur}
value={values?.first_name}
/>
<input
type="text"
name="surname"
onChange={handleChange}
onBlur={handleBlur}
value={values?.surname}
/>
<button type="submit" disabled={isSubmitting}>
Отправить
</button>
</form>
);
}}
</Formik>
);