Adicionando espaços reservados de formulário aos campos de entrada de texto

22

Existe uma maneira de converter um formulário regular e adicionar espaços reservados com um módulo, ou isso deve ser feito com um modelo de formulário ou com jQuery?

chrisjlee
fonte

Respostas:

31

Esse é um espaço reservado para HTML5, você pode adicioná-lo como um atributo a qualquer elemento, e os navegadores habilitados para HTML5 reagirão de acordo:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Uma função recursiva curta como essa pode ser útil se você desejar adicionar espaços reservados automaticamente para cada campo de texto em um formulário (com base no título do campo neste exemplo):

function MYMODULE_auto_placeholders(&$element) {
  if ( isset($element['#type']) && $element['#type'] == 'textfield') {
    // set placeholder
    $element['#attributes']['placeholder'] = $element['#title'];
    // hide label
    $element['#title_display'] = 'invisible';
  }
  foreach (element_children($element) as $key) {
    MYMODULE_auto_placeholders($element[$key]);
  }
}

Então, no seu formulário alter function basta chamar

MYMODULE_auto_placeholders($form);

Esse método funcionará para praticamente todos os campos de texto de um formulário, com exceção daqueles adicionados em #processfunções (como os campos de texto alt e title de um campo de imagem, por exemplo).

Clive
fonte
Resultado: Erro: Chame a função indefinida element_children () em bla_auto_placeholders () (linha 605 de temas / customizado / BLA / bla.theme).
Thomas Thomas
15

Tentei a resposta de Clive:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Mas, para minha surpresa, coloquei o espaço reservado no invólucro do campo de texto, não no próprio campo de texto. Então eu tentei uma variação da seguinte forma, funcionou!

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['und'][0]['value']['#attributes']['placeholder'] = t('Placeholder text');
  }
}
Henry
fonte
Obrigado! Eu estava começando a enlouquecer - nem pensei nisso.
Mike Crittenden
O que é o "some_element"? O ID do elemento? Como posso encontrar isso?
sokratis 27/05
@sokratis, você pode obter os IDs dos elementos por dpm ($ form), eles aparecem no primeiro nível da matriz $ form. A seguir, é apresentado um exemplo real de alteração do formulário de comentários: <code> function MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form ['subject'] ['# attribute '] [' placeholder '] = t (' Assunto '); $ form ['comment_body'] ['und'] [0] ['value'] ['# attribute'] ['placeholder'] = t ('Conteúdo'); }} </code>
Henry
15

Basta adicionar o espaço reservado na matriz #attributes para o elemento do campo de formulário, como no código a seguir.

   $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#attributes' => array(
        'placeholder' => t('My placeholder text'),
      ),
    );
neelmeg
fonte
2
thx, isso funcionou para mim em Drupal 8.
Não Sssweat
funcionou bem em D8.
precisa
5

Deparei com isso e achei que a resposta de Clive parecia agradável ao adicionar automaticamente espaços reservados.

Você precisa de algumas pequenas alterações para acertar no drupal 8, então aqui está a mesma resposta, mas adequada para o seu tema drupal 8.

/**
 * Implements hook_form_alter
 */
function THEME_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  add_placeholders($form);
}


/**
 * Add placeholders to suitable form elements -> textfield, password, email, textarea
 */
function add_placeholders(&$element) {
  if(isset($element['#type']) && in_array($element['#type'], ['textfield', 'password', 'email', 'textarea'])) {
    $element['#attributes']['placeholder'] = $element['#title'];
  }
  foreach(\Drupal\Core\Render\Element::children($element) as $key) {
    add_placeholders($element[$key]);
  }
}
frysch
fonte
0

Se você deseja direcionar uma instância de formulário diretamente, use hook_form_FORM_ID_alter. Pode ser mais organizado do que usar condicionais. Minha solução para segmentar apenas a instância do bloco de formulário de pesquisa.

function eyecare_form_search_block_form_alter(&$form, $form_state) {
  $form['keys']['#attributes']['placeholder'] = t('Search');
}
Dr.ifle
fonte