Контекст: я написал API для обработки своих пользователей / групп / разрешений в api-платформе, очень похожий на то, что мы имели в Symfony 1.4 sfGuardUserPlugin - за исключением того, что ассоциация userGroup имеет дополнительные свойства:
Пример поддельного запроса на получение пользователя:
{
"@context": "/contexts/User",
"@id": "/users/92",
"@type": "User",
"id": 92,
"firstName": "Joseph",
"lastName": "Chauvet",
"email": "Joseph.Chauvet@fakemail.fr",
"isActive": true,
"userGroups": [
{
"@id": "/user_groups/group=17;user=92",
"@type": "UserGroup",
"group": {
"@id": "/groups/17",
"@type": "Group",
"id": 17,
"name": "adsi",
"role": "ROLE_ADSI"
},
"isManual": false,
"isForbidden": false,
"groupname": "adsi"
}
]
}
sidenote: свойство groupname в userGroup является виртуальным свойством с использованием метода получения, а не избыточных данных.
Проблема:
Я очень старался получить работающий UserEdit в Reaction-Admin, который мог бы обрабатывать API, описанный выше (это именно то, что я хотел, поэтому здесь нет проблем).
Для того, чтобы сопоставьте структуру данных пользователей -> userGroups -> групп ресурсов, я думаю, мне нужен ArrayInput для итерации userGroups и ReferenceInput + selectInput для выбора значения группы.
Список ресурсов группы в selectInput это хорошо, но текущее значение группы пользователя никогда не отображается, поэтому я предполагаю, что проблема связана со значением моего исходного атрибута referenceInput.
Я пробовал много, много, много комбинаций, используя - getSource()
- добавляя <FormDataConsumer>
Элемент - пытаясь использовать прямой хук useGetOne()
, даже если я не очень хорошо понимаю, как hooks работает, и что hooks и callback не очень хорошо играют вместе. - даже пытаясь установить источник "трудным путем", таким как {"userGroups [0] .group"} или пытаясь {"scopedFormData.group"} в форме formDataConsumer. но ничего не работает ...
Вот пример одной из моих (самых простых) попыток
export const UserEdit = props => (
<Edit {...props}>
<SimpleForm>
<TextInput source={"firstName"}/>
<TextInput source={"lastName"}/>
<TextInput source={"email"} type="email"/>
<DateInput source={"lastLogin"}/>
<BooleanInput source={"isActive"}/>
<ArrayInput source={"userGroups"}>
<SimpleFormIterator>
<ReferenceInput
source={"group"} //should translate to userGroups[0].group
reference={"groups"}
label={"Groupe"}
>
<SelectInput label={"Groupe"} optionText="name"/>
</ReferenceInput>
</SimpleFormIterator>
</ArrayInput>
</SimpleForm>
</Edit>
)
Я пробовал вот так:
[...]
<ArrayInput source={"userGroups"}>
<SimpleFormIterator>
<FormDataConsumer>
{({
formData, // The whole form data
scopedFormData, // The data for this item of the ArrayInput
getSource, // A function to get the valid source inside an ArrayInput
...props
}) =>
<ReferenceInput
//source={useGetOne('groups', '/groups/16').data}
source={getSource('group')}
reference={"groups"}
label={"Groupe"}
>
<SelectInput label={"Groupe"} optionText="name"/>
</ReferenceInput>
}
</FormDataConsumer>
</SimpleFormIterator>
Я также пытался использовать ловушку useGetOne для извлечения данных с прямой ссылкой, но перехватчики запрещены в обратном вызове, и я не очень разбираюсь в предпосылках в контексте jsx.
Бесполезный собственный контекст: I Я старший разработчик, новичок во всей парадигме реакции / редукции, и я привык решать проблемы самостоятельно, но я застрял на этом и потратил около пятидесяти часов на изучение документации, ошибок, источников, чтобы избавиться от этого. Мой стек Api-платформы и response-admin современны (да, даже пота-admin сегодня выпуска 3.2.4, который исправляет ошибку arrayInput)
Мое необразованное предположение диких символов таково:
- Я просто делаю это неправильно
- Это может быть связано с тем, как HydraProvider анализирует и сохраняет / кэширует ссылки связанных ресурсов, а не передает его реагирующим элементам, как simpleRestProvider.
Возможно, это связано с тем, что ни мне, ни другим моим товарищам по команде не удалось использовать source = {"reference.property"} в любом поле ввода / ввода в response-admin с использованием Hydra dataProvider.
Любая помощь очень, очень ценится, один из моих товарищей по команде добавил: «Кевин (ie: Dunglas), Viens Mettre des paillettes dans ma v ie» 10