Adicionando espaço reservado HTML5 a todos os formulários drupal

22

Estou tentando adicionar o atributo placeholder a todos os campos de texto do meu site, mas não estou tendo sorte.

Eu criei um módulo que substitui 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"]);
        }
    }
}

Devo dizer que também estou usando o módulo de formulário da web.

Josua Pedersen
fonte

Respostas:

14

Como estou usando o módulo webform, eu poderia apenas colocar o tema no modelo global (webform-form.tpl.php) e colocá-lo na minha pasta de temas. Não há necessidade de complicar as coisas com um módulo.

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

Coloquei isso no topo do arquivo de modelo.

Josua Pedersen
fonte
3
Isso pode gerar algum erro de "índice indefinido" ao executar o loop foreach, lembre-se de verificar se o índice isset () é #
1613 Matteo
10

Altere ligeiramente para ....

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 no escopo foreach, o tipo de valor não é uma referência.


EDITAR:

Acabei de experimentar o código a seguir e consegui iterar recursivamente todo o formulário para os campos de texto editarem seus atributos.

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
fonte
Obrigado pela ajuda! Deveria ter descoberto isso sozinho. Como não está resolvendo o meu problema original, não posso premiá-lo com uma resposta correta.
Josua Pedersen
4

Você provavelmente poderia fazer isso com hook_form_alterou hook_form_FORM_ID_alteradicionando o atributo "placeholder"

por exemplo, não testado, mas algo como:

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

Localize o elemento de formulário oculto no HTML do formulário da web chamado form_idpara obter o ID do formulário correto para o form_alternome da função.

David Thomas
fonte
vou ter que fazer módulo para isso?
1
Você pode criar um módulo ou configurá-lo no template.php do seu tema, alterando mymodule pelo nome da máquina do modelo.
mariomc
Esse código também funcionará para o D6?
Bala
4

Uma abordagem melhor ao código 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']);
   }
 }
}
Sohail
fonte
+1, esse código está funcionando muito bem, eu apenas copiei e colei no meu módulo personalizado, com o drupal 6, mas recebi este aviso de erro: Argumento inválido fornecido para foreach () em C: \ wamp \ www \ r4launch \ sites \ all \ modules \ advanced \ advanced.module na linha 16.
Bala
1
Eu o resolvi colocando dentro da condição if. if (isset ($ form_state [ 'webform'])) {acima código vai aqui ..}
Bala
3

No seu código, você altera a variável $valueque nunca se associa novamente à variável $form, qual é passada por referência.

De maneira clara, você faz algumas alterações, mas não as envia de volta ao Drupal.

Além disso, você pode fazer assim (não testei, mas, em teoria, deveria funcionar).

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

Eu estava com preguiça de adicionar um cheque fieldsete adicionar espaço reservado às crianças. Mas acho que você pode mudar muito facilmente.

yvan
fonte
3

Uma ligeira melhoria na solução de arquivo de modelo do @ Josua: esse código também adicionará texto de espaço reservado aos campos de email do formulário da 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"]);
    } 
}
Steven B
fonte
Para ser um verdadeiro aprimoramento, você deve fazer duas coisas: 1) verificar o índice a ser definido 2) usar uma sintaxe melhor para verificar os diferentes casos
Matteo
2

usando hook_form_alter tente isso

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
fonte
1

Para quem usa uma versão mais antiga ou desatualizada do módulo Webform do Drupal , é importante notar que o suporte ao espaço reservado foi adicionado no 7.x-4.x branch(junho de 2013).

Portanto, a funcionalidade de espaço reservado HTML5 agora é uma opção nativa interna, juntamente com classes CSS personalizadas para componentes e vários outros recursos solicitados há muito tempo.

Aqui está uma captura de tela de como a nova funcionalidade aparece:

Configurações do Drupal Webform Component mostrando suporte a marcadores HTML5

rjb
fonte
0

Na maioria dos casos, eu acho, só se deseja adicionar atributos de espaço reservado em alguns formulários.

Se você deseja adicionar espaço reservado a todos os formulários da web, faça o seguinte:

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
fonte
0

Basta usar o módulo: Dicas do Webform

É exatamente o que você precisa. É fácil de gerenciar e não é necessário código personalizado. Este módulo também fornece suporte para navegadores herdados que não suportam o atributo de espaço reservado.

ANDiTKO
fonte