J'essaie d'ajouter l'attribut d'espace réservé à tous les champs de texte de mon site Web, mais je n'ai pas de chance.
J'ai créé un module qui remplace 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"]);
}
}
}
Je dois vous dire que j'utilise également le module webform.
Parce que j'utilise le module de formulaire Web, je pourrais simplement créer un thème pour le modèle de formulaire Web global (webform-form.tpl.php) et le mettre dans mon dossier de thème. Pas besoin de compliquer les choses avec un module.
foreach ($form["submitted"] as $key => $value) {
if ("textfield" == $value["#type"]) {
$form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
}
}
Je mets cela en haut du fichier modèle.
Modifiez-le légèrement en ....
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
dans la portée foreach est un type de valeur et non une référence.
Je viens d'expérimenter avec le code suivant et j'ai réussi à itérer récursivement l'ensemble du formulaire pour que les champs de texte modifient leurs attributs.
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]);
}
}
}
Vous pourriez probablement le faire avec hook_form_alter
ou hook_form_FORM_ID_alter
et en ajoutant l'attribut "placeholder"
par exemple, non testé, mais quelque chose comme:
/**
* 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');
}
Recherchez l'élément de formulaire masqué dans le HTML du formulaire Web nommé form_id
pour obtenir l'ID de formulaire correct pour le form_alter
nom de la fonction.
Une meilleure approche du code de 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']);
}
}
}
Une légère amélioration de la solution de fichier de modèle de @ Josua: ce code ajoutera également du texte d'espace réservé aux feilds de messagerie Web.
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"]);
}
}
Dans votre code, vous modifiez la variable $value
qui ne sera plus jamais associé à la variable $form
, lequel est passé par référence.
En clair, vous apportez quelques modifications mais ne les renvoyez pas à Drupal.
De plus, vous pouvez le faire comme ça (je ne l'ai pas testé mais en théorie ça devrait marcher).
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;
}
}
}
}
}
J'étais juste paresseux pour ajouter un chèque pour fieldset
et ajouter un espace réservé aux enfants. Mais je suppose que vous pouvez le changer très facilement.
en utilisant hook_form_alter essayez ceci
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.'));
}
}
Pour toute personne utilisant une version plus ancienne ou obsolète de module Webform de Drupal , il convient de noter que le support d'espace réservé a été ajouté dans le 7.x-4.x branch
(Juin 2013).
Ainsi, la fonctionnalité d'espace réservé HTML5 est maintenant une option native intégrée, avec des classes CSS personnalisées pour les composants et plusieurs autres fonctionnalités demandées depuis longtemps.
Voici une capture d'écran de l'apparence de la nouvelle fonctionnalité:
Dans la plupart des cas, je suppose que l'on ne voudrait ajouter que des attributs d'espace réservé sur certains formulaires.
Si vous souhaitez ajouter un espace réservé à tous les formulaires Web, vous pouvez le faire comme ceci:
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;
}
}
}
}
Utilisez simplement le module pour cela: Webform Hints
C'est exactement ce dont vous avez besoin. C'est facile à gérer et il n'y a pas besoin de code personnalisé. Ce module prend également en charge les navigateurs hérités qui ne prennent pas en charge l'attribut d'espace réservé.