텍스트 입력 필드에 양식 자리 표시 자 추가


22

일반 양식을 변환하고 자리 표시자를 모듈로 추가하는 방법이 있습니까, 아니면 양식 템플리트 또는 jQuery로 수행해야합니까?

답변:


31

그것은 HTML5 자리 표시 자이므로 속성에 요소로 추가하면 HTML5 지원 브라우저가 그에 따라 반응합니다.

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

이와 같은 짧은 재귀 함수는 양식의 모든 텍스트 필드에 대해 자리 표시자를 자동으로 추가하려는 경우에 유용합니다 (이 예의 필드 제목을 기준으로).

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]);
  }
}

그런 다음 양식 변경 기능에서

MYMODULE_auto_placeholders($form);

이 방법은 #process함수에 추가 된 텍스트 (예 : 이미지 필드의 alt 및 제목 텍스트 필드)를 제외하고 양식의 거의 모든 텍스트 필드에 적용됩니다 .


결과 : 오류 : bla_auto_placeholders ()에서 정의되지 않은 함수 element_children ()을 호출합니다 (테마 /custom/BLA/bla.theme의 605 행).
Thomas

15

나는 Clive의 대답을 시도했다.

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

그러나 놀랍게도 텍스트 필드 자체가 아닌 텍스트 필드 래퍼에 자리 표시자를 얻었습니다. 그런 다음 다음과 같이 변형을 시도해 보았습니다.

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');
  }
}

감사! 나는 조금 미쳐 가기 시작했다-이것에 대해 생각조차하지 않았다.
Mike Crittenden

"some_element"란 무엇입니까? 요소의 ID입니까? 어떻게 찾을 수 있습니까?
sokratis

@sokratis는 dpm ($ form)으로 요소의 ID를 얻을 수 있으며 $ form 배열의 첫 번째 수준에 나타납니다. 다음은 주석 양식을 변경하는 실제 예입니다. <code> function MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form [ 'subject'] [ '# 속성 '] ['placeholder '] = t ('제목 ​​'); $ form [ 'comment_body'] [ 'und'] [0] [ 'value'] [ '# attributes'] [ 'placeholder'] = t ( '콘텐츠'); }} </ code>
Henry

15

다음 코드와 같이 양식 필드 요소의 #attributes 배열에 자리 표시자를 추가하면됩니다.

   $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#attributes' => array(
        'placeholder' => t('My placeholder text'),
      ),
    );

2
thx, 이것은 Drupal 8에서 나를 위해 일했습니다.
No Sssweat

D8에서 잘 작동했습니다.
dresh

5

이것을 우연히 발견하고 Clive의 대답은 자동으로 자리 표시자를 추가하는 것이 좋았다고 생각했습니다.

drupal 8에서 올바르게 적용하려면 약간의 변경이 필요하므로 여기에 거의 동일한 대답이 있지만 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]);
  }
}

0

양식 인스턴스를 대상으로하려면 hook_form_FORM_ID_alter를 직접 사용하십시오. 조건을 사용하는 것보다 더 깔끔 할 수 있습니다. 검색 양식 블록 인스턴스 만 타겟팅하는 솔루션.

function eyecare_form_search_block_form_alter(&$form, $form_state) {
  $form['keys']['#attributes']['placeholder'] = t('Search');
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.