LimeSurvey: внешний ID без токенов, как у людей
Задача стара как мир: панель шлёт респондентов без токенов, просто с ?id=1234
в URL. Lime вежливо молчит, как будто всё нормально. А потом у тебя в базе десятки дублей и вечный вопрос “А кто все эти люди и кто платит за банкет?”. Давай чинить.
Что нам нужно?
- Проверить, что ID вообще передан
- Если ID новый — создать токен
- Если ID уже был — вернуть респондента в его анкету (незавершённую или завершённую)
- Дальше — пусть Lime сам разруливает (screenout, overquota, complete..)
Почему не обычные токены?
Потому что их негде взять. Панель даёт только ID-шники, а остальное делай сам. Списков нет, токенов нет, а работать как-то надо. Lime говорит: “я без токена не пускаю”. Значит, будем делать вид, что токены у нас есть.
Правильный алгоритм
1. Делаем скрипт – проставку – токен проверяшку-добавляшку
- Качай тут: index.zip
- Настраивай конфиг в шапке скрипта под себя
- Выкладывай куда-то за пределы директории с лаймом
- Включи в лайме поддержку API и JSON (Общие настройки -> Интерфейсы)
- Запусти свой опрос в режиме ограниченного доступа. Создай таблицу токенов. Пустую. Добавлять токены туда будет скрипт
- Отдай панелям ссылку на опрос такого формата
https://example.com/q/?q=666&r=[respondent id]
/q/
– директория со криптом-проставкойq=666
– номер твоего опроса в лаймеr=[respondent id]
– номер респондента. Присваивает панель.- Забрать id респондента для обратных редиректов в панель можно так:
{TOKEN:FIRSTNAME}
. Иди кури. Завари ромашковый чай.
- Где:
2. Как работает скрипт-проставка
- Читает из ссылки номер опроса и номер респондента.
- Забирает по api все токены из твоего опроса и ищет респондента с таким номером.
- Если не находит, создает новый токен и пишет номер респондента в поле
firstname
(один фиг, оно всегда пустое.. Зато внутри опроса ничего не надо создавать дополнительно). - Если респондент нашелся (повторный заход), тогда просто берем его токен.
- Затем редирект в твой опрос по токену (новому или найденному).
3. Что дальше?
А дальше — маршрутизация стандартными средствами лайма. Если анкета не заполнена, значит – заполнить. Если заполнена, значит заполнена. Проблемы читеров шерифа не волнуют.
Почему это правильно?
- Ты не ведёшь таблицу токенов
- Ты не дерёшься с панелью за список
- Ты не ломаешь логику Lime, а просто помогаешь ему вспомнить респондента
- У тебя чистые данные без дублей (ну, почти). Не забудь в конце опроса сверить с панелью список панелистов.
Как это выглядит для респондента?
Никак. Для него ничего не меняется.
Ну всё, вроде бы ничего не забыл.
Если что, пиши комменты или стучись в личку..