Dodanie symbolu zastępczego HTML5 do wszystkich formularzy drupal

22

Próbuję dodać atrybut zastępczy do wszystkich pól tekstowych w mojej witrynie, ale nie mam szczęścia.

Stworzyłem moduł, który zastępuje 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"]);
        }
    }
}

Powinienem powiedzieć, że używam również modułu formularza internetowego.

Josua Pedersen
źródło

Odpowiedzi:

14

Ponieważ korzystam z modułu internetowego, mógłbym po prostu utworzyć szablon globalnego szablonu internetowego (webform-form.tpl.php) i umieścić go w folderze motywów. Nie musisz komplikować rzeczy za pomocą modułu.

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

Umieszczam to na górze pliku szablonu.

Josua Pedersen
źródło
3
Może to generować błąd „niezdefiniowany indeks” podczas wykonywania pętli foreach, pamiętaj, aby sprawdzić, czy indeks isset ()
Matteo
10

Nieznacznie zmień na ...

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 we wszystkich zakresach jest typ wartości, a nie odniesienie.


EDYTOWAĆ:

Właśnie eksperymentowałem z następującym kodem i udało mi się rekurencyjnie iterować całą formę dla pól tekstowych w celu edycji ich atrybutów.

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]);
        }
    }
}
Shoaib Nawaz
źródło
Dzięki za pomoc! Sam powinienem to zauważyć. Ponieważ nie rozwiązuje to mojego pierwotnego problemu, nie mogę udzielić prawidłowej odpowiedzi.
Josua Pedersen
4

Prawdopodobnie możesz to zrobić za pomocą hook_form_alterlub hook_form_FORM_ID_alteri dodając atrybut „symbol zastępczy”

np. niesprawdzone, ale coś takiego:

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

Znajdź ukryty element formularza o nazwie HTML formularza internetowego, form_idaby uzyskać poprawny identyfikator formularza dla form_alternazwy funkcji.

David Thomas
źródło
czy będę musiał zrobić do tego moduł?
1
Możesz zrobić moduł lub ustawić go w szablonie template.php kompozycji, zmieniając moduł mim przez nazwę maszyny szablonu.
mariomc
Czy ten kod będzie działał również dla D6?
Bala
4

Lepsze podejście do kodu Josua Pedersena:

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']);
   }
 }
}
Sohail
źródło
+1, ten kod działa świetnie, właśnie skopiowałem i wkleiłem w moim niestandardowym module z Drupalem 6, ale dostałem ostrzeżenie o błędzie: Podano niepoprawny argument dla foreach () w C: \ wamp \ www \ r4launch \ sites \ all \ moduły \ zaawansowane \ zaawansowane. moduł w linii 16.
Bala
1
Rozwiązałem to, umieszczając wewnątrz warunek if. if (isset ($ form_state ['webform'])) {powyższy kod idzie tutaj ..}
Bala
3

W swoim kodzie zmieniasz zmienną, $valuektóra nigdy nie zostanie skojarzona ze zmienną $form, która jest przekazywana przez odwołanie.

Oczywiście wprowadzasz pewne zmiany, ale nie odsyłasz ich z powrotem do Drupala.

Możesz to zrobić w ten sposób (nie testowałem tego, ale teoretycznie powinno działać).

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

Byłem po prostu leniwy, aby dodać czek fieldseti dodać symbol zastępczy do dzieci. Ale myślę, że możesz to bardzo łatwo zmienić.

Yvan
źródło
3

Nieznaczne ulepszenie rozwiązania pliku szablonu @ Josua: Ten kod doda również tekst zastępczy do funkcji e-mail w formularzu internetowym.

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"]);
    } 
}
Steven B.
źródło
Aby być prawdziwym ulepszeniem, powinieneś zrobić 2 rzeczy: 1) sprawdź indeks, który chcesz ustawić 2) użyj lepszej składni, aby sprawdzić różne przypadki
Matteo
2

używając hook_form_alter spróbuj tego

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.'));
}
}
Mohamed Ibrahim
źródło
1

Dla każdego, kto korzysta ze starszej lub nieaktualnej wersji modułu Webform firmy Drupal , warto zauważyć, że obsługa symboli zastępczych została dodana w 7.x-4.x branch(czerwiec 2013 r.).

Zatem funkcja zastępcza HTML5 jest teraz natywną, wbudowaną opcją wraz z niestandardowymi klasami CSS dla komponentów i kilkoma innymi długo oczekiwanymi funkcjami.

Oto zrzut ekranu przedstawiający nową funkcjonalność:

Drupal Webform Component Settings pokazujący obsługę symboli zastępczych HTML5

rjb
źródło
0

Wydaje mi się, że w większości przypadków można dodawać atrybuty zastępcze tylko w niektórych formularzach.

Jeśli chcesz dodać symbol zastępczy do wszystkich formularzy internetowych, możesz to zrobić w następujący sposób:

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;
      } 
    }
  }
}
rosell.dk
źródło
0

Wystarczy użyć do tego modułu: Wskazówki do formularza internetowego

To jest dokładnie to, czego potrzebujesz. Jest łatwy w zarządzaniu i nie ma potrzeby dostosowywania kodu. Ten moduł zapewnia także obsługę starszych przeglądarek, które nie obsługują atrybutu zastępczego.

ANDiTKO
źródło