Dodawanie symboli zastępczych formularzy do pól wprowadzania tekstu

22

Czy istnieje sposób na konwersję zwykłego formularza i dodawanie symboli zastępczych za pomocą modułu, czy należy to zrobić za pomocą szablonu formularza lub jQuery?

chrisjlee
źródło

Odpowiedzi:

31

Jest to symbol zastępczy HTML5, możesz po prostu dodać go jako atrybut do dowolnego elementu, a przeglądarki obsługujące HTML5 zareagują odpowiednio:

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

Taka krótka funkcja rekurencyjna może być przydatna, jeśli chcesz automatycznie dodawać symbole zastępcze dla każdego pola tekstowego w formularzu (na podstawie tytułu pola w tym przykładzie):

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

Następnie w formularzu zmień funkcję po prostu wywołaj

MYMODULE_auto_placeholders($form);

Ta metoda będzie działać dla prawie każdego pola tekstowego w formularzu, z wyjątkiem tych, które są dodawane w #processfunkcjach (na przykład pola tekstowe alt i tytuł pola obrazka).

Clive
źródło
Wynik: Błąd: wywołanie niezdefiniowanej funkcji element_children () w bla_auto_placeholder () (wiersz 605 motywów / custom / BLA / bla.theme).
Thomas,
15

Próbowałem odpowiedzi Clive'a:

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

Ale ku mojemu zdziwieniu umieściłem symbol zastępczy w polu tekstowym, a nie samo pole tekstowe. Potem wypróbowałem następującą odmianę, zadziałała!

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');
  }
}
Henz
źródło
Dzięki! Zaczynałem trochę zwariować - nawet o tym nie myślałem.
Mike Crittenden,
Co to jest „some_element”? Czy identyfikator elementu? Jak to znaleźć?
sokratis
@sokratis można uzyskać identyfikatory elementów do dpm ($ form), pojawiają się one na pierwszym poziomie tablicy $ form. Oto przykład zmiany formy komentarza: <kod> funkcja MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form ['subject'] ['# atrybuty ”] [„ placeholder ”] = t („ Subject ”); $ form ['comment_body'] ['und'] [0] ['value'] ['# atrybuty'] ['placeholder'] = t ('Content'); }} </code>
Henry
15

Wystarczy dodać symbol zastępczy w tablicy #attributes dla elementu pola formularza, na przykład w poniższym kodzie.

   $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#attributes' => array(
        'placeholder' => t('My placeholder text'),
      ),
    );
neelmeg
źródło
2
dzięki, działało to dla mnie w Drupal 8.
No Sssweat 19.04.16
działał ładnie w D8.
dresh,
5

Natknąłem się na to i pomyślałem, że odpowiedź Clive'a wydawała się miła automatycznie dodawać symbole zastępcze.

Trzeba kilka drobnych zmian, aby zrobić to poprawnie w Drupal 8, więc oto prawie ta sama odpowiedź, ale odpowiednia dla Twojego motywu 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
źródło
0

Jeśli chcesz celować bezpośrednio do instancji formularza, użyj hook_form_FORM_FORM_ID_alter. Może być ładniejszy niż przy użyciu warunkowych. Moje rozwiązanie do kierowania tylko na instancję bloku formularza wyszukiwania.

function eyecare_form_search_block_form_alter(&$form, $form_state) {
  $form['keys']['#attributes']['placeholder'] = t('Search');
}
Dr.ifle
źródło