모든 드루팔 양식에 HTML5 자리 표시 자 추가


22

내 웹 사이트의 모든 텍스트 필드에 자리 표시 자 속성을 추가하려고하는데 운이 없습니다.

재정의하는 모듈을 만들었습니다. hook_form_alter

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    foreach ($form as $key => $value) {
        if ("textfield" == $value["#type"]){
            $value['#attributes']["placeholder"] = t($value["#title"]);
        }
    }
}

webform 모듈도 사용하고 있다고 말해야합니다.

답변:


14

webform 모듈을 사용하고 있기 때문에 전역 webform 템플릿 (webform-form.tpl.php)을 테마로하고 테마 폴더에 넣을 수 있습니다. 모듈과 복잡 할 필요가 없습니다.

foreach ($form["submitted"] as $key => $value) {
    if ("textfield" == $value["#type"]) {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    } 
}

나는 이것을 템플릿 파일의 맨 위에 놓았다.


3
foreach는 루프를 수행 할 때이 확인하는 것을 잊지 일부 "정의되지 않은 인덱스"오류를 생성 할 수 있습니다 인덱스는 isset ()의 경우
마테오

10

약간 변경하십시오 ....

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    foreach ($form as $key => $value) {
        if ("textfield" == $value["#type"]){
            $form[$key]['#attributes']["placeholder"] = t($value["#title"]);
        }
    }
}

$value foreach 범위에서 값 유형은 참조가 아닙니다.


편집하다:

방금 다음 코드를 실험했으며 텍스트 필드의 속성을 편집하기 위해 전체 양식을 반복적으로 반복했습니다.

function add_placeholder(&$form){
    foreach($form as $key => $val){
        if(substr($key,0,1) == '#' && $form[$key] == 'textfield'){
            $form['#attributes'] = array('placeholder' => t('some text'));
        }else if(is_array($form[$key])){
            add_placeholder($form[$key]);
        }
    }
}

당신의 도움을 주셔서 감사합니다! 저 자신을 발견했을 것입니다. 원래 문제를 해결하지 못했기 때문에 정답으로 수여 할 수 없습니다.
Josua Pedersen

4

"placeholder" 속성 을 사용 hook_form_alter하거나 사용 hook_form_FORM_ID_alter하여 추가 할 수 있습니다.

예를 들어, 테스트되지 않았지만 다음과 같습니다.

/**
 * Implements hook_form_FORM_ID_alter
 */
function mymodule_form_webform_client_form_12_alter(&$form, &$form_state) {
  drupal_set_message('<pre>'.print_r($form,1).'</pre>'); // debug form
  $form['submitted']['my_form_component']['#attributes'] = array('placeholder' => 'placeholder 1');
}

함수 이름에 form_id대한 올바른 양식 ID를 얻기 위해 이름이 지정된 웹 양식 HTML에서 숨겨진 양식 요소를 찾으십시오 form_alter.


이것을 위해 모듈을 만들어야합니까?

1
템플릿의 머신 이름으로 mymodule을 변경하여 테마의 template.php에서 모듈을 설정하거나 설정할 수 있습니다.
mariomc

이 코드는 D6에서도 작동합니까?
Bala

4

Josua Pedersen의 코드에 대한 더 나은 접근 방식 :

foreach ($form['submitted'] as $key => $value) {
 if (isset($form['submitted'][$key])) {
   $types = array('textfield', 'webform_email', 'textarea');

   if (isset($value['#type']) && in_array($value['#type'], $types)) {
     $form['submitted'][$key]['#attributes']['placeholder'] = t($value['#title']);
   }
 }
}

+1,이 코드는 훌륭하게 작동하며 방금 drupal 6과 함께 사용자 정의 모듈에 복사하여 붙여 넣었지만 다음 오류 경고가 표시됩니다 .C : \ wamp \ www \ r4launch \ sites \ all에서 foreach ()에 잘못된 인수가 제공되었습니다. 16 행의 \ modules \ advanced \ advanced.module
Bala

1
if 조건 안에 배치하여 해결했습니다. if (isset ($ form_state [ 'webform'])) {위 코드는 여기에 있습니다.}
Bala

3

코드에서 변수 $value에 다시 연결될 때 절대로 변수를 변경하면 $form참조로 전달됩니다.

분명히, 약간의 변경은 있지만 Drupal로 다시 보내지 마십시오.

또한, 당신은 그렇게 할 수 있습니다 (테스트하지는 않았지만 이론적으로는 효과가 있습니다).

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $keys = element_children($form);
  foreach ($keys as $key) {
    if (in_array(array('textfield', 'textarea'), $form[$key]['#type'])) {
      if (!empty($form[$key]['#title'])) {
        $placeholder = array('placeholder' => t($form[$key]['#title']));
        if (is_array($form[$key]['#attributes'])) {
          $form[$key]['#attributes'] = array_merge($form[$key]['#attributes'], $placeholder);
        }
        else {
          $form[$key]['#attributes'] = $placeholder;
        }
      }
    }
  }
}

나는 fieldset아이들에게 자리 표시자를 추가하고 확인하는 것을 게으르다 . 그러나 나는 당신이 그것을 매우 쉽게 바꿀 수 있다고 생각합니다.


3

@Josua의 템플릿 파일 솔루션이 약간 개선되었습니다.이 코드는 또한 웹 양식 이메일 필드에 자리 표시 자 텍스트를 추가합니다.

foreach ($form["submitted"] as $key => $value) {
    if ("textfield" == $value["#type"]) {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    }
    if($value['#type'] == "webform_email") {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    } 
}

진정한 개선을 위해서는 다음 두 가지를 수행해야합니다. 1) 설정할 색인을 확인합니다. 2) 더 나은 구문을 사용하여 다른 사례를 확인합니다.
Matteo

2

hook_form_alter를 사용하여 이것을 시도하십시오

function mymodule_survey_builder_form_alter(&$form, &$form_state, $form_id) {    
 if ($form_id == 'form_builder_field_configure') {
        $form['title']['#attributes']=array('placeholder' => t('Please enter the Qustion(English) name here.'));
}
}

1

Drupal의 Webform 모듈의 구 버전 또는 구 버전을 사용하는 사람이라면 (2013 년 6 월) 에 자리 표시 자 지원 이 추가 되었다는 점에 주목할 가치가 7.x-4.x branch있습니다.

따라서 HTML5 자리 표시 자 기능은 이제 구성 요소 및 기타 오래 요청 된 여러 기능에 대한 사용자 지정 CSS 클래스와 함께 기본 제공되는 기본 옵션입니다.

다음은 새로운 기능이 어떻게 나타나는지에 대한 스크린 샷입니다.

HTML5 자리 표시 자 지원을 보여주는 Drupal Webform 구성 요소 설정


0

대부분의 경우 일부 양식에 자리 표시 자 속성 만 추가하려고합니다.

모든 웹 양식에 자리 표시자를 추가하려면 다음과 같이하십시오.

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  // If webform, add "placeholder" attributes to all textfields
  // got code here:http://drupal.stackexchange.com/questions/12706/adding-html5-placeholder-to-all-drupal-forms
  if (isset($form['#node']->type) && ($form['#node']->type == 'webform')) {
    foreach ($form["submitted"] as $key => $value) {
      switch ($value["#type"]) {
        case 'textfield':
        case 'textarea':
        case 'webform_email':
          $form["submitted"][$key]['#attributes']["placeholder"] = $value["#title"];
          break;
      } 
    }
  }
}

0

모듈을 사용하십시오. Webform 힌트

정확히 필요한 것입니다. 관리가 쉽고 사용자 정의 코드가 필요하지 않습니다. 이 모듈은 또한 자리 표시 자 속성을 지원하지 않는 레거시 브라우저를 지원합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.