API на полето
Публикувано на 14.04.2012 г. в секцията Drupal
Този API ще ви позволи да работите с полета. Позволява ви да създавате нови типове полета. В повечето случаи вградените типове полета са достатъчни за потребителски нужди, но можете лесно да добавите свои собствени, ако е необходимо.
Ще работим сFieldAPI в нов модул. Нека го наречемtest_fields. Нека използваме още една възможност на модулите - зависимостта на един модул от друг. Например един модул изисква друг модул, за да работи. Нека направим нашия втори модул зависим от първия. За да направите това, добавете ред сdependencies към файлаinfo.
Проверете модула в списъка с модули.

Както можете да видите, модулът за работа с полета зависи от тестовия модул. И двата модула са в един пакет и са групирани.
Вече знаете как да създадете модул. Нека добавим още един файл към модула -install. Този файл ще се стартира само при първото инсталиране на модула. Името му също трябва да съвпада с името на модула и да има разширениеinstall. Нека добавим следната функция към него.
Име на файлtest_fields.install
Този код ще извикаhook_field_schema, което ще запази място в базата данни за поле с имеtextf. Ще използваме това име в следващите функции. Това поле ще бъде от тип integer.
Новото поле трябва да се покаже в конфигурацията на полето на възела.

При добавяне на ново поле трябва да се появи нашето ново поле. Първо, нека дефинираме типа на полето. Нека поставим следната функция във файлаtest_fuields.module.
Сега ще бъде възможно да добавите поле като "Изберете пол " към материала. Стойността на елементаdefault_widget наtextf_widget показва, че типът на приспособлението ще бъде именувантекстf. Ще работим с него малко по-късно. Тази джаджа ще отговаря за това какъв тип поле ще има във формата за добавяне на възел.
Сега трябва да дадем описание на полето, така че потребителят да разбере какъв тип поле добавя към материала - поле за въвеждане, текстово поле, падащ списък и т.н. Можете да въведете всичко тук.
Нека наречем нашето поле switch и в полетоfieldtypes ще посочим нашето име -textf, от което сме започнали да пишем модула.
Вече е налично ново поле за възел.

Полето също се нуждае от изходен формат.
За това използвамеhook_field_formatter_info. Нека Drupal извежда M/F или Male/Female. Нека напишем следната функция.
textf_formatter е нашият формат за въвеждане по подразбиране, който посочихме във функциятаtest_fields_field_info.

Сега в настройките за показване на полето можем да изберем как да се показва стойността на полето.
След това нека решим как ще изглежда елементът на формуляра на страницата за добавяне на възел. Нека да са два радиобутона. За да направим това, използвамеhook_field_widget_form и помним за създаването на формуляри в Drupal. Нека напишем следната функция.
След това ще създадем два изходни формата - пълен и кратък, за които говорихме по-рано. Използвамеhook_field_formatter_view.
Сега можете да проверите как работи всичко, като отворите възел.
И последната стъпка е опция, когато полето не е попълнено. За това трябва да използватеhook_field_is_empty, което ще върне true.
Това е напълно достатъчно, за да създадете свои собствени полета. Чувствайте се свободни да експериментирате с по-сложни полета. Четенето на документацията ще ви позволи лесно да разширите/промените този код.
13 коментара
Гост 2015/10/22
Администратор 2015/10/23
Значи тази кука не е работила за вас? Добавя се за инсталиране и сигурни ли сте, че сте активирали модула за първи път? Заради експеримента можете да опитате да деактивирате модула, след това в раздела за изтриване - изтрийте модула и го активирайте отново - тогава тази кука трябва да работи.
Гост 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)
тогава всички нормални списъчни полета имат масив, например: (Масив, 1 елемент) стойност => Стойността и това поле има$item е само една стойност, низ.
Самото поле на widget се показва нормално, стойността се запазва, но някои модули, напр. условните_поля не работят с това поле точно поради тази причина.
Не става как да го оправя. Моля, кажете ми, ако имате време.
Администратор 2013/08/04
За съжаление, не мога да ви кажа за поведението на модула condition_fields. Като опция - дебъгвайте този модул, вижте с какви данни работи, какви масиви са му необходими и опитайте да повторите необходимата структура.
Гост 2013/08/04
Благодаря за отговора! Правилно ли разбирам, че тази структура е формирана в hook_field_widget_form? Не работи това, което трябва да се направи. Имам нужда от масива, който влиза в $items. условни_полета незавършени, бета. Но имам и други проблеми.
Администратор 2013/08/05
Бих казал, че всъщност има чист API за формуляр, който отговаря само за показването на формуляра. Самите черва ще бъдат в други куки. Отстраняване на грешки. Инсталирайте XDebug + PhpStorm - много удобно.
Гост 2012/10/15
Но как мога да го направя тук, така че ако избера мъжки пол, да ми се покаже определена снимка? Кажете ми как да пиша правилно в този случай?
Администратор 2012/10/16
Можете да се фокусирате върху стойността на полето в шаблона на възел (node.tpl.php). Например:
Гост 2012/10/12
Благодаря, спасено. И тогава Томлинсън някак хаотично пише за полетата.