Категория:
Опубликовано:
Добавляем псевдо-поле в форму
Система полей в Drupal - шикарна, и бесспорно является одной из его визитных карточек.
Поля есть, буквально, для всего что может понадобится. Ну, а если и нет - то всегда можно сделать ;)
Но, все же, есть случаи, когда поле как бы и нужно, но полем оно быть не должно (например - для вывода какой-либо информации). И для этих случаев есть экстра-поля, которые также называют псевдо-полями.
Рассмотрим как добавить псевдо-поле в форму юзера Drupal 8.
Все, в принципе, по аналогии с 7кой...
Берем hook_entity_extra_field_info
, и в нем описываем всю магию:
/**
* Implements hook_entity_extra_field_info().
*/
function MYMODULE_entity_extra_field_info()
{
$extra = [];
/** @var \Drupal\user\UserInterface $bundle */
foreach (\Drupal\user\Entity\User::loadMultiple() as $bundle) {
$extra['user']['user']['form']['pseudo_field_name'] = [
'label' => t('Field name'),
'description' => t('Field description'),
'weight' => 0,
'visible' => TRUE,
];
}
return $extra;
}
Далее, альтерим форму:
/**
* Implements hook_form_alter().
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
*/
function MYMODULE_form_user_form_alter(&$form, FormStateInterface $form_state, $form_id)
{
$weight = $fd = \Drupal::entityTypeManager()
->getStorage('entity_form_display')
->load('user.user.default'); // Получаем конфиг юзера
$user = $form_state->getFormObject();
$form['pseudo_field_name'] = [
// Получаем вес поля из конфига юзера
'#weight' => $weight->get('content')['pseudo_field_name']['weight'],
'content' => MyClassForPseodoFieldView::viewMethod($user),
];
}
Все.
ЗЫ - Если бы ноде поле цепляли, и отображали бы во вью моде - нужно было бы выводить в hook_ENTITY_TYPE_view
Ссылки по теме:
Делитесь полезными материалами в социальных сетях.