Как вывести и сохранить повторяющиеся поля формы без дублирования на стороне пользователя?
Делаю "сложную" регистрацию:
у пользователя может быть несколько профессий
для каждой профессии своя анкета разделенная на блоки/разделы
анкета составляется из админки (каждое поле отдельно, полю присваиваются block_id (блоки анкеты - анкета разделена на несколько блоков) и profession_id (посматриваю в сторону profession_assignments, но это лирика - массив полей собирается на ура))
До этого места все гут))
Все анкеты заполняются раздельно по профессии, но... нужно, чтобы в одном блоке выводились поля из всех выбранных пользователем профессий (без дублей, а они, почти все, одинаковые, за редким исключением).
Профессии могут как добавляться так и удаляться самим пользователем (из имеющихся на сайте).
Вопрос: как собрать и сохранить поля данного блока анкеты чтобы при заполнении пользователем не выводились дубли и при этом сохранялись значения для всех профессий?
Как при добавлении пользователем профессии записать дублирующиеся поля без участия пользователя?
Подумываю над тем, что можно массив собрать из полей этого блока и уникализировать по id поля, но как потом в отсеянные передать? Еще раз собрать массив полей этого блока, но без уникальности и при совпадении id циклом сохранять?
Не слишком ли заморочено это будет? Или все правильно понял и зря накручиваю?
Не совсем понятен вопрос. )) У разных профессий могут быть одинаковые поля. Значит можно сделать :
отдельную таблицу с полями
таблицу с профессиями
таблицу сопоставления полей и профессий.
таблицу сопоставления пользователей и профессий.
таким образом разные профессии могут использовать одинаковые поля.
Если пользователь выбрал несколько профессий, можно легко получить набор всех требуемых для них полей и сразу в запросе исключить дубли (distinct).
Если нужны только поля пользователя по определенной профессии добавляем в запрос этот критерий (у нас есть таблица сопоставления пользователей и профессий)
что такое block_id и блок, вообще? что такое "удалить профессию" ?
Все эти таблицы у меня в наличии.
Блоки - блоки анкеты.
Т.е. у каждой профессии имеется несколько блоков (General Info, Profession Info и т.д. и п.р.)
И мне определенно понятно что отдельно по профессии выводить и они не будут при этом дублироваться, но в блоке General Info нужно выводить их вместе, от этого и вопрос.
Удалить профессию - пользователь указал у себя в профиле 2-3 профессии и по каким-то причинам решил одну убрать и соответственно удаляет ее из своего профиля вместе со всеми полями анкеты этой профессии... Таким же Макаром, только наоборот - добавить.
Но по сайту в целом набор профессий задается в админке и выбор для пользователя ограничен.
получаете все оставшиеся профессии данного пользователя,
получаете список их полей (пусть это список А),
затем удаляете те поля ненужной теперь профессии, которые не входят в список А.
удаляете профессию данного пользователя из таблицы "пользователь- профессии"
таким образом "ненужную" профессию и ее неиспользуемые в других "нужных" профессиях поля вы удаляете , а то что еще актуально остается в целости.
Василий, в блоке General Info, для которого я и пытаюсь найти решение, поля заполняются одинаково - потому и дубли полей... просто пользователь может выбрать 1 профессию, а может и 2 и 3... У одной профы один набор полей, у другой - другой, у третьей - третий, но большинством полей этого блока они схожи, есть лишь несколько уникальных именно по профе.
И затык...
Если бы они заполнялись разными данными, то дубли не получились бы и смысл их сводить в этом блоке вместе и заполнять без повторения не возник ну никак
Александр Степанов,
а зачем заполнять General Info одинаково ?
Пользователь заполняет его единожды. Пусть General Info будет тоже как отдельная профессия , но обязательная для всех пользователей . Далее юзер заполняет отдельные профили с отличающейся в зависимости от профессии инфой.
Таблица сопоставления пользователей и профессий связывает юзера с его "главной профессией" (General Info) и остальными. Таким образом вы избегаете дублирования General Info в каждой добавляемой профессии.
Василий, General info - не главная профессия, а блок полей анкеты в каждой из профессий. В данном блоке есть дублирующиеся поля одинаковые для всех проф и есть свои уникальные....
Но, наверное, получится таким подходом, как Вы подсказали...
Только еще кучу таблиц и связей придется примудровывать и анкета будет еще на 3 модели с CRUD-дами больше, а значит и для конечного пользователя админки сложнее...
Но уже 2 варианта есть для решения задачи )))
Спасибо за идею
Александр Степанов, конечно, я понимаю ,что General info - не главная профессия , я просто предложил рассматривать ее , как равноценную самостоятельную составляющую наряду с другими наборами полей. При таком раскладе одинаковые данные не нужно дублировать в каждой профессии.
Здесь вообще, возможно, подошла бы монга. В каждом пользователе лежит массив с наборами вложенных полей по специальностям и общая инфа. Но это просто мысли вслух. ))
Василий, спасибо за пищу для ума.
Поищу инфу про монгу. Может быть и она подойдет лучше.
А может и мои догадки из текста вопроса подойдут лучше всего, правда заморочено будет, но без лишних сущностей и таблиц, а то черт ногу сломит при создании анкеты...
В любом случае Вам огромное спасибо.