Field API

Опубліковано 2012.04.14 у розділі Drupal

Дане API дозволить працювати з полями. Воно дозволяє створювати нові типи полів. У більшості випадків вбудованих типів полів цілком вистачає для потреб користувача, але при необхідності можна легко додати свої.

Роботу зFieldAPI будемо здійснювати у новому модулі. Назвемо йогоtest_fields. Використовуємо ще одну можливість модулів залежність одного модуля від іншого. Наприклад, для роботи одного модуля потрібен інший модуль. Зробимо наш другий модуль залежним від першого. Для цього додамо доinfo файл рядок зdependencies.

Перевіряємо модуль у списку модулів.

модуля

Як бачите, модуль для роботи з полями залежить від тестового модуля. Обидва модулі знаходяться в одному пакеті та згруповані.

Створювати модуль ви вже вмієте. Додамо до модуля ще один файл –install. Цей файл запуститься лише при першому встановленні модуля. Його ім'я також має збігатися з ім'ям модуля та мати розширенняinstall. Додамо до нього наступну функцію.

Ім'я файлуtest_fields.install

Цей код викличеhook_field_schema, який зарезервує місце в БД для поля з ім'ямtextf. До цього імені ми звертатимемося до таких функцій. Це поле буде типу integer.

Нове поле має відображатись у конфігуруванні полів ноди.

field

Додавання нового поля має з'явитися наше нове поле. Спочатку визначимо тип поля. Помістимо у файлtest_fuields.module наступну функцію.

Тепер можна буде додати до матеріалу поле типу «Вибір підлоги ». Значення елементаdefault_widget, що дорівнюєtextf_widget говорить про те, що тип віджету буде називатисяtextf. З ним ми працюватимемо трохи пізніше. Цей віджет буде відповідати за те, який тип буде поле у ​​формі додавання ноди.

Тепер потрібно дати опис полю, щоб користувач розумів поле якого типу він додає до матеріалу - поле введення, текстову область, список, що випадає і т.д. Можна вписати сюди все, що завгодно.

Назвемо наше поле перемикачем і полеfieldtypes вкажемо наше ім'я -textf, з якого ми починали написання модуля.

Тепер є нове поле для ноди.

модуль

Також для поля потрібний формат виведення.

Для цього використовуємоhook_field_formatter_info. Нехай Drupal виводитиме М/Ж або Чоловік/Жінка. Напишемо таку функцію.

textf_formatter – це наш дефолтний формат введення, який ми вказали у функціїtest_fields_field_info.

field

Тепер у налаштуваннях відображення полів ми можемо вибрати, як буде відображатися значення поля.

Далі визначимося – як виглядатиме елемент форми на сторінці додавання ноди. Нехай це буде два радіобутони. Для цього використовуємоhook_field_widget_form і згадаємо про створення форм Drupal. Напишемо таку функцію.

Далі створимо два формати висновку – повний та короткий, про які ми говорили раніше. Використовуємоhook_field_formatter_view.

Тепер можна перевірити, як все це працює, відкривши ноду.

І завершальний крок – це варіант, коли поле не заповнено. Для цього потрібно використовуватиhook_field_is_empty, який поверне true.

Цього цілком достатньо для створення власних полів. Ви можете поекспериментувати, створюючи складніші поля. Читання документації дозволить вам легко розширити/модифікувати цей код.

13 Коментарів
Гість 2015/10/22
Адмін 2015/10/23

Тобто, у вас цей хук не спрацював? Він доданий до install і ви точно вперше включили модуль? Заради експерименту можете спробувати вимкнути модуль, потім у вкладці видалити - видалити модуль і знову включити - тоді цей хук повинен спрацювати.

Гість 2015/10/23

Усе спрацювало. Просто після цього додавання не побачите відразу поле в редагуванні типу матеріалу - а у вас за текстом здається що це так. Поле з'явиться лише після _field_info(), наскільки я зрозумів

Адмін 2015/10/23

А ну так. Щоб одразу з'явилося – це потрібно програмно створювати тип матеріалу із набором полів.

Гість 2014/01/23

підкажіть будь ласка, а чому у мене на етапі створення файлу інсталяція та включення модуля не створюється автоматично поле custom_fields як на 3 скріншоті? і чи можна реалізувати модуль так що якщо ти його вмикаєш просто додавалася автоматично поле і на сторінці створення ноди воно вже було включене, без можливості вибирати віджет і тип виводу (повно, коротко)? підкажіть, як це реалізувати?

Адмін 2014/01/24

Перед увімкненням модуля всі хуки були написані? Чи може десь є незначна помилка? З приводу автоматичного додавання - впринципі можна. Можна спробувати зачепитися заhook_enable, який спрацює при включенні модуля, і в ньому вже кодом додати поле до ноди.

Гість 2013/08/03

Дуже дякую за відмінний матеріал. Розбираюся потихеньку з API У мене питання, вибачаюсь, якщо дурне. Я створюю віджет. Допустимо:

Так от, якщо в list_field_is_empty() подивитися dsm($item)

то у всіх нормальних полів-списків - це масив, наприклад: (Array, 1 element) value => Значення а у цього поля в$item просто одне значні,рядок.

Саме поле з віджетом нормально відображається, значення зберігається, але деякі модулі, наприклад. conditional_fields не працюють із цим полем саме з цієї причини.

Ніяк не дійде, як це виправити. Підкажіть, будь ласка, якщо буде час.

Адмін 2013/08/04

Про особливості поведінки модуля condition_fields, на жаль, не зможу підказати. Як варіант - побалакати цей модуль, подивитися з якими даними він працює, якого виду масиви йому потрібні і постаратися повторити необхідну структуру.

Гість 2013/08/04

Спасибі за відповідь! А я правильно розумію, що ця структура формується у hook_field_widget_form? Не виходить, що треба зробити. Той масив, який потрапляє у $items мені потрібний. condition_fields недороблений, бета. Але в мене та інші проблеми виявляються

Адмін 2013/08/05

Я сказав би, що в ньому фактично в чистому вигляді Form API, що відповідає тільки за виведення форми. Самі кишки будуть в інших хуках. Дебажіть. Поставте XDebug + PhpStorm – дуже зручно.

Гість 2012/10/15

а як тут зробити, що б якщо я вибираю стать чоловічої, у мене відображалася певна картинка? Підкажіть, як правильно прописати в такому випадку?

Адмін 2012/10/16

Можна орієнтуватися на значення поля шаблону ноди (node.tpl.php). Наприклад:

Гість 2012/10/12

Дякую, виручив. А то у Томлінсона якось сумбурно написано про поля.