将HTML5占位符添加到所有drupal表单


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模块。

Answers:


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()
Matteo

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

您可以使用hook_form_alterhook_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为Webform的HTML中找到隐藏的表单元素,以获取form_alter函数名称的正确表单ID 。


我需要为此做模块吗?

1
您可以执行一个模块或在主题的template.php中进行设置,并通过模板的计算机名称更改mymodule。
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的模板文件解决方案有一点改进:此代码还将在Webform电子邮件字段中添加占位符文本。

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模块的旧版本或过时版本的用户,值得注意的,在7.x-4.x branch(2013年6月)中添加了占位符支持。

因此,HTML5占位符功能现在是本机的内置选项,以及组件的自定义CSS类和其他长期要求的功能。

这是新功能显示方式的屏幕截图:

显示HTML5占位符支持的Drupal Webform组件设置


0

我猜在大多数情况下,只希望在某些表单上添加占位符属性。

如果要将占位符添加到所有Web表单,则可以这样进行:

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提示

它正是您所需要的。它易于管理,无需自定义代码。此模块还为不支持占位符属性的旧版浏览器提供支持。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.