Как правильно указать source для machine name

Как правильно указать source для machine name

Что такое machine name в курсе, я думаю, многие. Его мы можем встретить, например, при создании нового словаря таксономии.
Словарь таксономии
Form API предоставляет нам специальный тип machine_name. Все хорошо, если вы используете первый уровень иерархии, т.е. есть такая структура

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$form['text'] = array(
 '#type'  => 'textfield',
 '#title' => t('Text'),
 '#description' => t('Human-readable name.'),
 '#default_value' => '',
 '#required' => TRUE,
 '#maxlength' => 64,
);
 
$form['machine_name'] = array(
 '#type' => 'machine_name',
 '#title' => t('Name'),
 '#title_display' => 'invisible',
 '#size' => 15,
 '#description' => t('A unique machine-readable name containing letters, numbers, and underscores.'),
 '#maxlength' => 26,
 '#machine_name' => array(
   'source' => array('text'),
   'exists' => '_MY_CALLBACK_FOR_CHECKING_MACHINE_NAME',
   'standalone' => TRUE,
   'label' => '',
 ),
);

Но если структура древовидная (вложенная), то возникает вопрос как правильно указать имя источника (текстового поля) для элемента machine_name. Например,

1
2
3
4
5
6
7
8
9
10
11
12
13
$form['profile'] = array(
 '#type' => 'fieldset',
 '#title' => t('Settings'),
);
 
$form['profile']['text'] = array(
 '#type'  => 'textfield',
 '#title' => t('Text'),
 '#description' => t('Human-readable name.'),
 '#default_value' => '',
 '#required' => TRUE,
 '#maxlength' => 64,
);

В приведенном примере выше родительским элементом является fieldset с ключом 'profile', а элемент к которому прицеплено machine_name - текстовое поле с ключом 'text'. Поэтому мы указываем массив, состоящий из ключей элементов в той последовательности, в которой они находятся в иерархической структуре.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$form['profile']['machine_name'] = array(
 '#type' => 'machine_name',
 '#title' => t('Name'),
 '#title_display' => 'invisible',
 '#size' => 15,
 '#description' => t('A unique machine-readable name containing letters, numbers, and underscores.'),
 '#maxlength' => 26,
 '#machine_name' => array(
   'source' => array('profile', 'text'),
   'exists' => '_MY_CALLBACK_FOR_CHECKING_MACHINE_NAME',
   'standalone' => TRUE,
   'label' => '',
 ),
);

Ниже приведено изображение вышеописанной формы.
Форма с элементом machine_name

Дополнительная информация по статье

  1. Form API machine_name- описание machine_name на официальном сайте.