Рейтинг:0

Как я могу изменить форму входа в блоке входа, но не на странице входа?

флаг tr

Как мне использовать крючок_form_alter() изменить блок входа пользователя, но не страницу формы входа пользователя? Все, что я пробовал, либо изменяет обе сущности, либо не работает, даже не используя следующие хуки.

функция mymodule_form_user_login_block_form_alter(&$form, &$form_state, $form_id) {
  // ¦
}
функция mymodule_form_alter(&$form, &$form_state, $form_id) {
  если ($form_id == 'user_login_block') {
    // ¦
  }
}
Рейтинг:2
флаг fr

Это действительно зависит от того, чего вы пытаетесь достичь. Форма входа пользователя имеет идентификатор формы user_login_form. Эта форма с этим идентификатором формы может отображаться либо в блоке входа пользователя, либо в /пользователь страница. Он не отображается дважды на одной и той же странице — если вы находитесь на /пользователь тогда блок не будет показан. Для меня, если вы хотите изменить эту форму входа, вам определенно следует изменить ее в обоих местах, где она появляется. В этом случае используйте hook_form_FORM_ID_alter() что в данном случае hook_form_user_login_form_alter().

Если вы просто хотите изменить стиль своего блока, вы можете использовать CSS и указать #block-userlogin элемент или, точнее, #block-userlogin #user-login-form элемент.

Или вы можете изменить плагин блока, используя крюк_блок_альтер ().

Или вы можете создать свой собственный блок, чтобы показать свою собственную форму входа.

Или же ...

Опять же, это действительно зависит от того, что вы пытаетесь сделать, изменяя только блок.

флаг tr
Поскольку я не хочу изменять страницу входа в /user, простое указание идентификатора формы не сработает. Мои изменения более сложны, чем позволяет CSS, поэтому мне нужно иметь возможность использовать модуль. Похоже, hook_block_alter() может быть моим лучшим маршрутом. Любые ресурсы о том, как я могу использовать это для блокировки входа в систему?
флаг tr
Я не уверен, что hook_block_alter() будет работать, так как мне нужно изменить фактические элементы формы. Я предполагаю, что hook_block_alter() просто изменяет сборку блока? Я правильно это интерпретирую?
флаг fr
Ну, еще раз, я предостерегаю вас подумать об этом - если вы собираетесь добавлять информацию или добавлять элементы формы в форму входа в систему в одном месте, вам действительно следует делать это во всех местах.Чтобы увидеть, будет ли hook_block_alter() делать то, что вы хотите, реализуйте его и распечатайте массив $definitions, чтобы увидеть, что у вас есть для изменения. В худшем случае вам, возможно, придется создать собственный объект формы, чтобы заменить содержимое user_login_form внутри блока.
флаг fr
Также см. https://api.drupal.org/api/drupal/core%21modules%21block%21block.api.php/group/block_api/9.3.x для других альтернатив.
флаг tr
Блок входа отображается в заголовке. Мне нужно, чтобы alter() изменил некоторые элементы-оболочки в полях формы и внес некоторые пользовательские изменения в текст заполнителя и т. д. Я не добавляю новые поля формы. Мне определенно нужно, чтобы тема блока выглядела иначе, чем страница входа пользователя. Один имеет горизонтальную компоновку, а другой - вертикальную. Вот почему я прошу об этом. Я знаю, что мне нужно сделать. Я просто не знаю, как нацелить этот user_login_block. Похоже, что это невозможно без пользовательского создания формы, что, честно говоря, отстой.
Рейтинг:1
флаг us

Форма, используемая в форме входа и на странице входа, реализована Drupal\пользователь\форма\UserLoginForm учебный класс. Это означает, что идентификатор формы для регистрации крючок_form_alter() или же hook_form_FORM_ID_alter() одинаково в обоих случаях.

Реализация hook_block_view_BASE_BLOCK_ID_alter(), можно изменить вывод рендеринга для блока, включая блок входа в систему.

function mymodule_block_view_user_login_block_alter (массив & $ build, \ Drupal \ Core \ Block \ BlockPluginInterface $ block) {
  // Изменить форму входа, которая хранится в $build['user_login_form'].
  // В этом примере изменяется размер полей имени и пароля.
  $build['user_login_form']['name']['#size'] = 18;
  $build['user_login_form']['pass']['#size'] = 18;
}

Идентификатор плагина для блока входа указан в аннотации к ПользовательЛогинБлок учебный класс. Содержание $сборка массив возвращается из UserLoginBlock::build().

  $form = \Drupal::formBuilder()->getForm('Drupal\user\Form\UserLoginForm');
  unset($form['name']['#attributes']['autofocus']);

  unset($form['name']['#description']);
  unset($form['name']['#attributes']['aria-describedby']);
  unset($form['pass']['#description']);
  unset($form['pass']['#attributes']['aria-describedby']);
  $form['имя']['#размер'] = 15;
  $form['pass']['#size'] = 15;

  $placeholder = 'form_action_p_4r8ITd22yaUvXM6SzwrSe9rnQWe48hz9k1Sxto3pBvE';
  $form['#attached']['заполнители'][$заполнитель] = [
    '#ленивый_строитель' => [
      '\Drupal\user\Plugin\Block\UserLoginBlock::renderPlaceholderFormAction',
      [],
    ],
  ];
  $form['#action'] = $заполнитель;

  $элементы = [];
  if (\Drupal::config('user.settings')->get('register') != UserInterface::REGISTER_ADMINISTRATORS_ONLY) {
    $items['create_account'] = [
      '#тип' => 'ссылка',
      '#title' => $this->t('Создать новую учетную запись'),
      '#url' => Url::fromRoute('user.register', [], [
        'атрибуты' => [
          'title' => $this->t('Создать новую учетную запись пользователя.'),
          'класс' => [
            'создать-аккаунт-ссылку',
          ],
        ],
      ]),
    ];
  }
  $items['request_password'] = [
    '#тип' => 'ссылка',
    '#title' => $this->t('Сбросьте пароль'),
    '#url' => Url::fromRoute('user.pass', [], [
      'атрибуты' => [
        'title' => $this->t('Отправить инструкции по сбросу пароля по электронной почте.'),
        'класс' => [
          'запрос-пароль-ссылка',
        ],
      ],
    ]),
  ];
  возвращаться [
    'user_login_form' => $ форма,
    'user_links' => [
      '#theme' => 'item_list',
      '#items' => $items,
    ],
  ];
флаг tr
Это похоже на то, что я после! Спасибо! Я попробую это и скоро сообщу.

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

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