Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анкета. Чекбоксы и радио-кнопки. 
:(
    Опции темы
bugsb
Дата 11.9.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



Имеется анкета, вопросы выводятся из базы данных.
Но имеются и такие вопросы, которые я не знаю как лучше организовать, например:

Цитата

Где вы бывали?
- Париж
- Франция
- Германия
* Нигде не был


"-" - это чекбокс
"*" - это радио-кнопка.

как такое реализовать? чувствую тут надо поле создавать в mysql и указывать там тип каждого вопроса либо чекбокс либо радиокнопка.
PM MAIL   Вверх
bars80080
Дата 11.9.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



если уж анкета генерируется настолько автоматически, то да, надо в БД сохранять и тип ответа
PM MAIL WWW   Вверх
bugsb
Дата 11.9.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



наверно это уже относится к разделу js, но раз тут начал спрашивать то думаю не стоит темы размножать...

Цитата

<input type="checkbox" name="variant[534]" value="1"> Франция<br/>
<input type="checkbox" name="variant[534]" value="2"> Англия<br/>
<input type="radio" name="variant[534]" value="3"> Нигде не был<br/>

вот примерно такое можно вывести из базы, 544 - это id вопроса.
1,2,3 - это id ответа

но тогда надо чтобы когда пользователь отметит "Нигде не был" убирались все отмеченные ранее чекбоксы и наоборот, если он отметит сначала "Нигде не был", а потом захочет выбрать еще и "Францию", надо чтобы радио-кнопка опять была неотмечена. 

Это сообщение отредактировал(а) bugsb - 11.9.2009, 13:44
PM MAIL   Вверх
bars80080
Дата 11.9.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



это уже чистая зависимость, которую придётся считать на клиенте, т.е. javascript.
тут бы я тогда предложил не заморачиваться с radio, а чисто строить чекбоксы, просто некоторые с пометкой уникальности.

но вопрос всё равно советую перезадать в разделе javascript, здесь всё-таки другим занимаются
PM MAIL WWW   Вверх
bugsb
Дата 11.9.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



вот тут http://forum.vingrad.ru/forum/topic-272488...y1963534/0.html
мне даже готовый код написали... =) в принципе все как надо, только щас я не знаю как в бд это сделать...

Получается так
Цитата

* Здесь я был
    - Франция
    - Германия
    - Италия
* Нигде не был

"*" - радио-кнопки
"-" - чекбоксы

но по сути варианта ответа "Здесь я был" нету...

на данный момент вот такие поля имеются в mysql
Цитата

anketa_quest - таблица с вопросами
- quest_id - идентификатор, выставляется автоматически
- quest_variant - если 1, то 1 вариант ответа, если 0, то несколько.
- quest_name - сам вопрос

anketa_var - таблица с ответами
- var_id - идентификатор, выставляется автоматически
- var_idq - ид вопроса к которому относится вариант ответа
- var_golos - количество голосов за этот вариант
- var_name - сам вариант
- var_text_act - Если 1, то выводим дополнительно текстовое поле
- var_text - Варианты ответа через запятую которые указали пользователи дополнительно

PM MAIL   Вверх
capitan
Дата 11.9.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 2
Всего: 13



bugsb, 

anketa_quest - таблица с вопросами
- quest_id - идентификатор, выставляется автоматически
- quest_variant - если 1, то 1 вариант ответа, если 0, то несколько.
- quest_name - сам вопрос

я бы добавил поле :
- parent_id => quest_id - если 0 - главная т.е. "*" - радио-кнопки
если >0 тогда "-" - чекбоксы
PM MAIL WWW ICQ   Вверх
bugsb
Дата 13.9.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



Цитата

я бы добавил поле :
- parent_id => quest_id - если 0 - главная т.е. "*" - радио-кнопки
если >0 тогда "-" - чекбоксы

capitan, это наверно надо не в таблицу с вопросами, а в таблицу с ответами!? 

а если в вопросе нет ответов имеющие радио-кнопки? т.е. надо чтобы главными были чекбоксы и небыло подвариантов.

вот пример анкеты: http://itay.ru/123.html

реально ли вообще такую генерировать автоматически из базы?

Это сообщение отредактировал(а) bugsb - 13.9.2009, 12:49
PM MAIL   Вверх
capitan
Дата 14.9.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 2
Всего: 13



Генерировать реально.

anketa_quest - таблица с вопросами
- quest_id - идентификатор, выставляется автоматически
- quest_type - checkbox/ radio/main.
- quest_value
- quest_text
- parent_id - родитель (0 - главный вопрос )

1. Делаем выборку parent_id = 0 (получим список вопросов)
2. Делаем выборку для подвопросов  parent_id = quest_id (id вопроса)
3. IF quest_type = radio => делаем выборку checkbox  parent_id = quest_id (id radio)

Логика примерно такая.  Типа дерева.
PM MAIL WWW ICQ   Вверх
bugsb
Дата 14.9.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



capitan, у меня нет подвопросов! у меня есть подответы ;-)

думаю база будет примерно такой

Таблица вопросов:
quest_id
quest_text

Таблица ответов:
var_id
var_idq - ид вопроса
var_txt - ответ
var_type - 1 - checkbox; 0 - radio
var_idv - 0 - главный ответ; >0 значит подответ (указать id родительского ответа)

Например 
3 | 5 | Где то был | 0 | 0
4 | 5 | Франция | 1 | 3
5 | 5 | Германия | 1 | 3
6 | 5 | Нигде не был | 0 | 0

вот это выведет:
* Где то был
---- Франция
---- Германия
* Нигде не был

по моему эта система рабочая, но тогда очень тяжело придумать как будет создаваться опрос в админке, надо ведь предусмотреть если родительский ответ чекбокс, то подответ не может быть радиокнопкой и вот такие подобные комбинации (если родительский ответ радио, то к этому же вопросу нельзя сделать чекбокс родительским)
PM MAIL   Вверх
capitan
Дата 14.9.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 2
Всего: 13



quest_id | quest_type | quest_value |        quest_text                                     |                 parent_id
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1                    main                                Откуда вы о нас узнали?                                0
2                    main                                Где вы были?                                                   0
3                    main                                Порекомендуете ли вы нас друзьям?             0 
4                 checkbox                            Газеты                                                             1 
5                 checkbox                            Интернет                                                        1 
6                 checkbox                            Телевидение                                                  1 
7                 checkbox                            Другое                                                             1
8                    radio                               А я был здесь                                                   2
9                checkbox                            Франция                                                          8
10              checkbox                            Англия                                                              8
11                  radio                              Нигде не был                                                    2
12                  radio                              Да                                                                     3
13                  radio                              Нет                                                                   3


Я бы пошел в этом направлении.

Это сообщение отредактировал(а) capitan - 17.9.2009, 11:27
PM MAIL WWW ICQ   Вверх
bugsb
Дата 14.9.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



capitan, интересный вариант, вместо двух таблиц использовать одну...
но у таблицы с вопросами есть еще дополнительные поля (количество проголосовавших и т.д.) они будут пустыми у строк с полем type=main

а как это все потом выводить? я не очень хорошо понимаю как эту всю иерархию строить....
и в админке надо будет как то запрещать пользователю создавать родительский ответ с чекбоксом и с радио. И к чекбоксу подуровни нельзя радио приделывать и вот много подобных нюансов.
PM MAIL   Вверх
bugsb
Дата 15.9.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.9.2009

Репутация: нет
Всего: нет



capitan, сделал так как Вы посоветовали, вот что у меня получилось http://itay.ru/quest/

все нормально, кроме последнего вопроса... не знаю как автоматизировать вывод... надеюсь кто-нибудь поможет.

вот этой функцией я делаю вывод 

Код

// Параметры: переменная, куда будем формировать контент $content (по ссылке), массив из которого формируем (должен быть в специально форме)
function printChildMenu(&$content, $menu) {
    // начинаем обход массива $menu в цикле по записям
    foreach($menu as $value) {
        // определяем тип
        if($value['quest_type']==0) $type = "<b>{$value['quest_text']}</b>";
        elseif($value['quest_type']==1) {
            $type = "<input type=\"radio\" name=\"variant[{$value['parent_id']}]\" id=\"{$value['quest_id']}\" /> <label for=\"{$value['quest_id']}\">{$value['quest_text']}</label>";
            $onclick = "onclick=\"choose(this, event);\"";
        }
        elseif($value['quest_type']==2) $type = "<input type=\"checkbox\" name=\"variant[{$value['parent_id']}]\" id=\"{$value['quest_id']}\" /> <label for=\"{$value['quest_id']}\">{$value['quest_text']}</label>";
        
        
        // если у текущего элемента нет детей
        if(count($value['child'])==0)
            $content.="<li {$onclick}>{$type}</li>"; // заносим элемент списка li
        // если у текущего элемента есть дети
        else {
            $content.="<li {$onclick}>{$type}<ul>"; // заносим элемент списка li и открываем список детей
            printChildMenu($content, $value['child']); // (рекурсивный вызов) обходим детей элемента для формирования списка
            $content.="</ul></li>"; // заносим конец списка детей.     
        }
    }    
}


не работает последний вопрос из-за $onclick = "onclick=\"choose(this, event);\"";, но если я это уберу, то у меня не будет работать второй вопрос.

вопрос решили с помощью исправления JS

Это сообщение отредактировал(а) bugsb - 15.9.2009, 20:16
PM MAIL   Вверх
gcc
Дата 16.9.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



я хотел сделать много разширенное анкетирование... такое как vkontakte.ru, сделать большой конструктор голосования
(и чтобы можно было выбрать свой вариант еще)

а есть ли где пример MySQL запросов, статьи? нужно будет перебирать структуры, чтобы отправить все данные в шаблон smarty или template?

=====

я пока придумал вариант выбрать из форм данные, потом сериализации структуру через JSON (или пл другому http://ru.wikipedia.org/wiki/Сериализация и сохранить в MySQL само голосование и ответы, так же... (может перевести в MIME тип)

потом сделать выборку и десериализации, и отправить прямо в шаблон...

тип таблицы:

id int
vo bigtext


только недостаток: что поиск сделать не получиться, так как все сериализации... скорее всего поиск нужен будет...



Это сообщение отредактировал(а) gcc - 16.9.2009, 14:28
PM WWW ICQ Skype GTalk Jabber   Вверх
Ипатьев
Дата 16.9.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 3
Всего: 37



непонятно, при чем здесь MySQL запросы.
непонятно, при чем здесь вопрос про "немного расширенное анкетирование".
вроде бы, есть правило, один топик - один вопрос?
PM MAIL   Вверх
gcc
Дата 16.9.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



автор говориn по-моиму про RDBMS (MySQL)
вопрос такой же... 
про анкетирование...


Это сообщение отредактировал(а) gcc - 16.9.2009, 14:46
PM WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.