Рейтинг:2

Why can't some fields be moved within details element?

флаг us

I am trying to move 2 form fields to the advanced sidebar: dismissible and status. Status was already part of the meta container and setting #group='meta' on dismissable also placed it there; but these weren't in the proper order. Nothing I do seems to have any impact on:

  • dismissible
  • standard meta fields: published, author, revision log
  • status

Both dismissible and status are fields added by the Sitewide Alert module which defines the entity which this is the edit form for.

I gave up trying to move my 2 fields (together) so I created my own details block as:

  $form['alert_settings'] = [
    '#type' => 'details',
    '#group' => 'advanced',
    '#weight' => -99,  
    '#title' => t('Alert settings'),
    '#tree' => TRUE,
    '#access' => TRUE,
    '#open' => TRUE,
  ];

and then assigned both fields #group='alert_settings'. This works fine as it creates a new details group which is placed at the top of the right sidebar. Perfect, except I want status to be the top item in this block, followed by dismissible.

No matter which of the status #weight options I set (or dismissable ones); I can't change the order of these.

I have tried:

  $form['status']['#weight'] = -99;
  $form['status']['widget']['#weight'] = -99;
  $form['status']['widget']['value']['#weight'] = -99;

What am I missing here?

Рейтинг:2
флаг cn

В конечном итоге кажется, что этот код в EntityFormDisplay::processForm():

// Назначить веса, настроенные в форме display.
foreach ($this->getComponents() as $name => $options) {
  если (isset($элемент[$имя])) {
    $element[$name]['#weight'] = $options['weight'];
  }
}

Этот метод является #процесс обратный вызов для формы, которая запускается после хуков изменения формы, поэтому ваши изменения теряются.

Вы можете добавить свой собственный обратный вызов процесса и изменить веса там, но может быть немного чище изменить его на уровне компонента с помощью hook_entity_form_display_alter(), например:

function MODULE_entity_form_display_alter(\Drupal\Core\Entity\Display\EntityFormDisplayInterface $form_display, массив $context) {
  если ($context['entity_type'] == 'sitewide_alert') {
    $status = $form_display->getComponent('status');
    // 'dismissible' устанавливается на вес базового поля, -10.
    $status['вес'] = -11;
    $form_display->setComponent('статус', $статус);
  }
}

Кстати, $form['статус']['#вес'] был бы правильным выбором, если бы обратный вызов процесса не переопределял его.

liquidcms avatar
флаг us
Это работает. Спасибо за это.Никогда раньше не использовал этот хук, но обязательно запомню его, поскольку я несколько раз сталкивался с этой проблемой, когда элементы боковой панели не перемещались.
флаг cn
Нет проблем, я отследил источник проблемы и обновил ответ, если вам интересно. Кажется, что это хоть как-то «по замыслу»
liquidcms avatar
флаг us
Спасибо за добавленную информацию. Также неудивительно, что модуль закодировал что-то, чтобы вызвать что-то странное. Мне потребовалось некоторое время, чтобы понять, почему я не могу сделать сущность доступной для поля, когда кто-то указал, что в модуле есть код, явно блокирующий создание сущности для поля (без веской причины).
флаг cn
Я тоже видел этот вопрос, провел 20 минут в замешательстве, копаясь в коде, прежде чем 4k4, к счастью, разобрался с ним и внес немного здравого смысла. Я бы никогда не подумал искать то, что оказалось проблемой. Как ни странно, проблема с _this_ вопросом не в этом модуле, код переопределения веса находится в ядре.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.