Създаване на гъвкави въпросници в Drupal 7
Статията предлага корекция за модулаWebform, който често се използва в Drupal CMF за създаване на проучвания и въпросници. Пачът ви позволява да зададете няколко условия за компонентите на формуляра чрез административния интерфейс, както и да управлявате логиката на тяхната съвместна работа.
Вярвам, че всеки уеб разработчик рано или късно се изправя пред задачата да създаде въпросник или въпросник. Разбира се, в наше време не е толкова трудно да се намери някакво готово решение и е добре, че тук имаме много възможности:
- Можете да намерите и използвате някакъв мощен и независим продукт, където всъщност в сайта е интегрирана готова система.
- Втората опция е да използвате една от голямото разнообразие от тематични услуги, катоSurveyMonkeyилиWufoo.
Всяка от опциите, изброени по-горе, има своите предимства и недостатъци, върху които няма да се спирам, а ще предложа да се обмисли решение, което според мен е полезно за всички разработчици, използващи Drupal в работата си.
Динамично анкетиране.
Да предположим, че сме изправени пред задачата да създадем няколко сложни и динамични въпросника, в които самите въпроси се задават в зависимост от отговорите на потребителите на предишните страници и където трябва да предоставим на крайния администратор на сайта удобен интерфейс за редактиране на самите въпроси и логиката на тяхната работа. Нека посочим изискванията към продукта:
- Необходим е механизъм за създаване и редактиране на въпросници през административния интерфейс;
- Необходимо е въпросите да могат да се показват постепенно на няколко страници;
- Необходимо е въпросите да могат да се показват само когато са изпълнени определени условия;
- Условията могат да бъдат от следните видове: „избранинякои от изброените стойности", "някои от изброените стойности не са избрани";
- Може да има няколко условия наведнъж;
- При комбиниране на условия могат да се използват оператори И/ИЛИ.
Ето пример за такъв въпросник:

Има три страници с въпроси и една с резултати. Страница 2 може изобщо да не се покаже на потребителя, ако потребителят е отговорил с"ДА"на първите два въпроса. Броят на въпросите на третата страница, където потребителят винаги получава, варира в зависимост от отговорите на първите два въпроса, само условията вече са комбинирани чрез"ИЛИ". Страницата с резултати винаги показва текстово съобщение с благодарност. Освен това, ако на потребителя е показана страница 2 и той е отговорил с „да“ на третия въпрос, тогава се показва допълнителен текст.
Създаване на гъвкав профил в Drupal.
ИнсталирайтеDrupalи модулWebform. След това отидете на страницата за добавяне на материали [Add content -> Webform/node/add/webform), където посочваме името на нашия въпросник и въвеждаме неговото описание. След като запазите новия възел, върнете се на страницата му за редактиране и изберете разделаУеб формуляр. В този раздел ще прикачим към формуляра всички необходими компоненти, отговарящи за въпросите и страниците на въпросника.

За обозначаване на въпроси ще използваме кодиране според шаблона “question_X”, където X е поредният номер на въпроса. За простота използваме едни и същи опции за отговор (Опции) навсякъде и кодираме според изискванията на компонента типИзбор(ключова изходна_стойност).

Имайте предвид, че за редица компоненти, като се започне от втората страница, е възможно да се посочи условие (условни правила), но само едно.
Разширяване на възможностите на Webform
Нека решим задачата за модифициране на поведението на модулаWebformмалко грубо и нетипично за Drupal, като направим няколко промени директно, за да спестим време. В бъдеще ще бъде възможно да ги отделите отделно и да създадете отделен модул. Първо променяме интерфейса. Нека увеличим броя на възможните условия, показани на страницата с настройки на компонента, от 1 на 10. Самите елементи в Drupal винаги отговарят за някаква функция, която връща структурата на API на Forms. За да намерите точното му име, е достатъчно да определите стойността на елементаinput[name="form_id"], намиращ се във формуляра в HTML от страна на клиента, например с помощта на Firebug.

В този случай стойността е"webform_component_edit_form". Тази функция се намира във файла"/webform/includes/webform.components.inc".
На ред 529 започва кодът, отговарящ за условията. Сега трябва да го модифицираме, без да нарушаваме функционалността на функциите, които обработват въвеждането на формуляра по време на изпращане (напр.webform_component_edit_form_validate,webform_component_edit_form_submit). При отстраняване на грешки в кода може да забележите, че всички допълнителни конфигурации на компоненти се съхраняват в полето Extra в таблицата с компоненти.

Следователно няма да е голяма работа, ако го разширим, като просто клонираме елементите 10 пъти. Ще направим магическото число 10 слаба константа, тоест ще го дефинираме чрез функциятаvariable_getна Drupal, за да имаме хипотетична възможност да направим административен интерфейс за промяна на тази стойност. Заменете целия код, представляващ условните компоненти, със следното:
Да направим проверка. Да отидем на страницата с персонализирани настройки на компонента,намиращи се на всяка страница с изключение на първата. Вижда се, че броят на условните компоненти се е увеличил. Нека добавим още една допълнителна настройка към тази форма - избор на алгоритъм, чрез който се изчислява крайният резултат от изпълнението на условията, ако има няколко от тях наведнъж. Нека имаме два алгоритъма:ИиИЛИ. За да направите това, след предишния код веднага добавете следното:
Сега имаме няколко условия наведнъж и настройваме алгоритъма за комбинирането им, което вече е добре, но само от страна на административния интерфейс. При обработката на крайния клиент webfom, когато потребителят попълни полетата, остава старият код, който може да работи с максимум едно условие и не знае нищо за комбинирани алгоритми. Остава да намерим този код. Нека отидем на страницата с формуляра от страна на клиента (просто като щракнете върху Преглед) и потърсете съответнияinput[name="form_id"].
Стойността му еwebform_client_form_1и при търсене точно на тази функция резултатът е плачевен. Но, както знаете, в Drupal има начин да зададете правилата за съвпадение заform_idна крайната функция чрезhook_forms()и ако намерите подходящата кука, тогава тя има индикация за обратно извикванеwebform_client_formи тази функция има място да бъде:
Няма нищо в тази функция (и в стандартното обратно извикване за изпращане -webform_client_form_submit), което да обработва условия, но ако анализирате нейния код, можете да видите предефинирането на обратните извиквания за изпращане чрез:
Нека да отидем на функциятаwebform_client_form_pagesи да намерим извикването_webform_client_form_rule_checkв нея, което връща TRUE или FALSE и контролира дали компонентът да се показва или пропуска. И точно това ни трябва. Във функцията_webform_client_form_rule_checkсе предава аргументът$component, който е конфигурацията на някакъв компонент на уеб формуляр. От него получаваме информация за алгоритъма и всички дължими условия:
Също така задаваме флаг в самото начало, който в крайна сметка ще определи (в зависимост от избрания алгоритъм) дали да покаже компонента или не:
Следващата задача е да разширите действителния код за потвърждение, който започва веднага след:
Нека процедираме по следния начин: ще изпълним всяко условие на свой ред, ще фиксираме резултата от проверката в масив, който след това ще анализираме според алгоритъма. Ако се използва алгоритъмът“ИЛИ”, тогава наличието на поне един положителен резултат прави целия израз положителен, ако алгоритъмът“И”, тогава обратното, един отрицателен резултат прави целия израз отрицателен. За да направите това, заменете кода за потвърждение със следното:
И веднага дефинираме изчислението на резултата от алгоритъма:
Извикването на „drupal_alter“ ще позволи на други модули да заменят резултата, ако е необходимо, което винаги трябва да се има предвид, когато се разработват модули за Drupal.
Сега разполагаме с всичко необходимо за прилагане на въпросника, който е представен по-горе в статията. За да направите това, като се върнете на страницата със списъка с компоненти на уеб формуляри в административния интерфейс, задайте правилата за компонентаpage_2:
- Въпрос 1 е един от [да]
- Въпрос 2 е един от [да]
- Нека уточним алгоритъма "И".

На страница 3 от правилото само въпрос 4 има показване (според схемата) Да ги конфигурираме:
- Въпрос 1 е един от [да]
- Въпрос 2 не е един от [не]
- Нека уточним алгоритъма "ИЛИ".
Страница с резултати 4 показва само допълнителна информациякогато отговорът на третия въпрос е да. Нека дефинираме правило за последния компонент:
- Въпрос 3 е един от [да].
След всички стъпки, описани в статията, можете спокойно да отидете на страницата на формуляра от страна на клиента и да се уверите, че всичко работи както се изисква.