Vladislav, В моём случае - это целиком бэкенд, тест с разнородными элементами ввода (обычная строка, селекторы, drop-down'ы, мультичекбоксы, textarea, цвета, изображения, канвас и т.д.).
Иерархия - неполносвязный граф: т.е. может менять направление в зависимости от выбранных значений и результатов и зацикливаться при необходимости на несколько циклов.
1. Вопрос и несколько ответов: список вопросов - отдельно, список ответов - отдельно. Связываем их через таблицу "многие-ко-многим", чтобы иметь возможность задавать подобные вопросы и перемешать ответы. В этой же таблице (в связке) задаём верное состояние: ответ должен быть выбран или нет, если он связан с этим вопросом (всего 3 поля: id-вопроса, id-ответа, is_checked).
Задаём подобные через каждые 5 вопросов и мешаем ответы, добавляя их в разные вопросы. Дополнительно, можно создать типы вопросов, в которых участвуют конкретные ответы и т.д.
2. Как хранить пропуски слов: как и обычный файл переводов - с помощью знаков подстановки (для sprintf(), к примеру).
Проще всего (в плане интерактива): inline edit (если нужно вписать по-буквам или вставить верную букву) и on-hover(наведение мышки или клик с чётким! показом доп. слоя с вариантами и местом вставки), если нужно выбрать.
У меня не определенное количество языков, может быть и 2 и 5
Как раз именно для этого я и посоветовал: делайте столько колонок, сколько необходимо сделать языков, а числовые значения - будут для всех одни и те же.
Выборка - будет тоже одна и та же, с подстановкой в нужные поля нужного языка.
-------
Топология Full-Mesh:
Берём все строки по-парно с поисковым запросом (поисковый запрос и каждая строка из таблиц) определяем степень соответствия.
Сохраняем каждый такой граф и при следующем аналогичном поиске у нас уже будут готовые результаты, которые мы сможем взять по "узлу" ранее сохранённого поискового запроса.
Александр Иванов, Для разных языков - нужно создать колонки с переводами на нужные языки (в той же таблице). А переводить - можно автоматически (с помощью Google Translate API, например) или вручную.
Я делаю так: Caption[ru-ru], Caption[en-us] и т.д.
Поиск - у меня выполняется по колонкам в соответствии с текущим выбранным языком.
Для создания поиска (для каждого языка по-отдельности) - использовал генерацию связей графа "Full-Mesh" и таблицу-указатель индексов по этому графу.
Зная расстояния между узлами (похожесть строк в процентах), я могу быстро и точно выдавать нужный результат.
Yan-s, всё верно, только не факт, что именно разбор DOM. Может быть и усовершенствованный markdown-синтаксис какой-нибудь. Всё зависит от того, в каком виде новая публикация приходит в обработку для постинга.
dom1n1k, согласен на все 1000%. Одна голова хорошо, а две - лучше!
Откуда брал код, делали (как я понял) для одной строки в заголовке item...
Я подправил, и вот как вышло.
PS: могу дать исходник, если интересно...
dom1n1k, Честно? Да...
Я даже и не ожидал, но подсознание - реально фиксирует гармонию...
Но пока - надо "качаться".
Там очень много приёмов как правильно юзать под разные элементы.. (я учусь пока сам...)
GavriKos, а кто отменял проверку по "веткам дерева" через in_array() ?
А нужно всунуть новую команду - array_push() с нужным индексом.
И входящая очередь - тоже массив.
switch() внутри цикла while-do: пока очередь не пуста - крутим и опустошаем через array_pop().
Закончили обработку всей очереди - вышли из цикла.
Иерархия - неполносвязный граф: т.е. может менять направление в зависимости от выбранных значений и результатов и зацикливаться при необходимости на несколько циклов.
1. Вопрос и несколько ответов: список вопросов - отдельно, список ответов - отдельно. Связываем их через таблицу "многие-ко-многим", чтобы иметь возможность задавать подобные вопросы и перемешать ответы. В этой же таблице (в связке) задаём верное состояние: ответ должен быть выбран или нет, если он связан с этим вопросом (всего 3 поля: id-вопроса, id-ответа, is_checked).
Задаём подобные через каждые 5 вопросов и мешаем ответы, добавляя их в разные вопросы. Дополнительно, можно создать типы вопросов, в которых участвуют конкретные ответы и т.д.
2. Как хранить пропуски слов: как и обычный файл переводов - с помощью знаков подстановки (для sprintf(), к примеру).
Проще всего (в плане интерактива): inline edit (если нужно вписать по-буквам или вставить верную букву) и on-hover(наведение мышки или клик с чётким! показом доп. слоя с вариантами и местом вставки), если нужно выбрать.