Тема на Drupal

Преди да говорим за промяна на външния вид на формуляри, нека се запознаем с основите на Drupal Forms API – програмния интерфейс, използван за генериране на формуляри. Използването на API за формуляри е малко по-сложно от създаването на HTML формуляри ръчно, тъй като изисква изучаване на логиката на неговата работа, но използването му е задължително, тъй като API за формуляри решава редица важни задачи:

  • всеки разработчик може да добавя или премахва елементи във формуляр, създаден от друг разработчик, без да променя изходния код;
  • всеки разработчик може да добави допълнителни функции за валидиране и обработка на въведени от потребителя данни, без да променя оригиналния формуляр;
  • Формулярите, създадени с помощта на API на формуляри, са защитени от атаки, свързани с изпращане от потребител на модифициран формуляр;
  • всеки разработчик може да промени външния вид на формуляр, без да променя неговия изходен код.

Всяка форма в Drupal е функция, която връща асоциативен масив. Този масив трябва да съдържа информация за всички елементи на формата, функции за валидиране (валидатори, валидатори) и обработка (подаватели, податели) на въведените данни. Тази функция трябва да се намира във файла на модула, разработката на модула беше обсъдена в предишната статия.

Забележка: готови решения

  • Теми, които ви позволяват да променяте цветовата схема през администраторския интерфейс: Pixture Reloaded, Dropshadow, Wabi, Garland (стандартна Drupal тема).
  • Дизайн теми с много настройки и региони: Deco, Acquia Marina.

Нека разгледаме един прост пример.

Горната функция генерира формуляр, състоящ се от текстово поле, падащ списък с три елемента и бутон за изпращане на данните. Името на товафункция - неговият уникален идентификатор ($form_id), който ще се използва за показване и модифициране на този формуляр от модули на трети страни. За да покажете формуляра на екрана, трябва да създадете страница чрез hook_menu, където ще бъде извикана функцията drupal_get_form, като вземете като параметър $form_id на формуляра, който трябва да се покаже на екрана:

Масивът, върнат от функцията test_form($form_state), не съдържа процедури за проверка на стойности и попълване на полета (структури), така че ядрото на Drupal, след като щракне върху бутона Изпращане във формуляра, ще се опита да намери и изпълни функциите form_id_validate и form_id_submit. В нашия случай, както лесно се досещате, това ще бъдат функции с имената test_form_validate и test_form_submit:

Функцията валидатор проверява стойността, избрана в падащия списък и, ако не е една, изпраща съобщение за грешка, посочващо кой елемент от формуляра е причинил грешката. Функцията за изпращане показва стойностите, въведени от потребителя. В реалния случай тази функция ще трябва да запази данните в базата данни.

Списък 4

Кодът на модула също ще бъде допълнен с функциите от листинг 5.

Списък 5

Тук е добавен валидатор, който валидира текста, въведен в текстовото поле; ако е по-малко от три знака, се генерира съобщение за грешка.

Когато създавате формуляри, винаги се препоръчва да използвате не стандартни валидатори и податели, а да ги декларирате изрично, тъй като в този случай програмистите на трети страни ще могат да допълват масивите #submit и #validate със свои собствени функции. Ако се използват стандартни валидатори и податели, тогава програмистите на трети страни могат само да заменят съществуващите функции със свои собствени и това не винаги е удобно.

Сега да се върнем към основната тема на статията - Drupal theming. функция drupal_get_form,след като получи $form_id като вход, идентификаторът на формуляра, който трябва да се покаже, той извиква функцията form_builder, която проверява правата за достъп на текущия потребител до всяко от полетата на формуляра и ако тези права са налични, показва стандартния HTML код за всеки елемент от формуляра. Всеки генериран елемент на формуляр има уникален атрибут id. Най-лесният начин да замените външния вид на елементите на формуляра е да създадете CSS файл, който описва стиловете на желаните елементи на формуляра. Ако това не е достатъчно, можете да добавите параметри #prefix и #suffix към елементите на формуляра, които ще съдържат HTML код, който се показва преди и след създадения елемент. Ако това не е достатъчно, можете да дефинирате параметъра #theme, който трябва да съдържа името на функцията за тематизиране, която да използвате.

Персоналните функции за тематизиране могат да бъдат зададени за цялата форма или за всеки от нейните елементи. По подразбиране Drupal се опитва да намери функцията theme_form_id за тематизиране на формуляр, така че използването на параметъра #theme не е задължително.

Всички функции, дефинирани от параметъра #theme, също трябва да бъдат декларирани чрез hook_theme (описание на тази кука беше дадено в предишната статия).

Нека променим външния вид на създаденото текстово поле. За да направите това, първо създайте имплементация на куката hook_theme:

След това променяме масива $form["example_text_field"], който е създаден във функцията test_form, като добавим параметъра #theme към него:

Сега можем да декларираме функцията theme_example_text_field_theme_function и да зададем всеки HTML код в нея, за да показва избрания елемент:

В допълнение, тази функция може да бъде отменена без промяна на кода на модула. За да направите това, във файла template.php, който се намира в папката с текущата тема, трябва да създадете копие на тази функция, като замените префикса на темата в нея с името на текущата тема.

Ако в изпълнениетоhook_theme използвайте параметъра на шаблона по следния начин:

тогава HTML кодът, отговорен за показването на елемента на уеб страницата в браузъра, може да бъде посочен не в изходния текст на функцията за оформяне на теми, а в отделен шаблонен файл със съответното име; в нашия пример това е example-text-field.tpl.php. Този подход е удобен, ако със сайта трябва да работят дизайнери, които нямат опит в уеб програмирането.

Ако се наложи да промените външния вид на целия формуляр, а не само на отделните му елементи, трябва да направите същото: да посочите стойността на параметъра #theme на формуляра, да декларирате функцията за тематизиране в hook_theme и накрая да я внедрите. Нека направим необходимите промени в нашия код. Функцията hook_theme ще изглежда така:

Изходният код за актуализираната функция test_form е показан в списък 6.

Списък 6

Нуждаем се и от самата функция за тематизиране на формуляра. Нека го дефинираме:

Както при всяка друга тематична функция, нейното съдържание може да бъде преместено във външен шаблон.

Е, сега остава да научите как да модифицирате съществуваща форма от външен модул. За да разрешите този проблем, трябва да използвате една от двете кукички: или hook_form_alter, през която преминават масиви от всички обработени форми и в която всеки масив може да се редактира, или hook_form_FORM_ID_alter, където FORM_ID трябва да бъде заменен с идентификатора на желаната форма. Само избраната форма минава през тази кука. И двете кукички получават масив от формуляри като вход (в нашия пример това е масив, генериран от функцията test_form), и всякакви параметри могат да бъдат добавени или премахнати от този масив: #theme, #prefix, #suffix, #submit, #validate и други.

Например, нека добавим контейнер към формата, който може да съдържа няколкополета. Преместете две полета в него и променете заглавието на едно от тях: