Definir programaticamente o valor padrão para um campo


10

No Drupal 6, poderíamos usar o PHP para definir valores padrão, mas o mesmo código não pode ser usado com o Drupal 7.

Estou tentando fazer isso hook_form_alter(), mas o código não funciona.

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"]['#default_value'] = $default;
      // …
      break;
  }
}

Respostas:


17

Supondo que sua função de alteração de formulário esteja realmente em execução (a qual você pode confirmar com essa chamada dsm()), na verdade, existem mais 2 níveis de matriz nos quais você precisa descer para acessar o elemento do campo:

$form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;

No Drupal 7, você tem uma matriz de valores para cada idioma para o qual o campo foi traduzido (para que campos com cardinalidade múltipla / ilimitada possam ser atendidos) e, em cada um deles, está na matriz para as várias colunas de campo diferentes. Na maioria dos casos, será 'valor', mas nem sempre (por exemplo, um campo de imagem possui uma coluna de identificação de arquivo, coluna alt etc.)

espero que ajude


É mais uma profundidade :)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79

2
Esta resposta não funcionará para todos os widgets; depende de como eles especificam seu valor. Por exemplo, com um campo de referência da entidade, use: $ form ['field_name'] ['und'] [0] ['target_id'] ['# default_value'] = $ default
Renee

@ Renee Muito verdadeiro; há uma explicação mais aprofundada aqui
Clive

1
Valores de campo sempre têm uma linguagem @Mouneer, se você não tem um site multilingue padrão LANGUAGE_NONEdeve ser usado
Clive

1
Na verdade, eu poderia ter explicado isso um pouco melhor no @Mouneer :) Você encontrará o idioma atual no formulário em algum lugar (acho que talvez, $form['#entity']->languagemas precisaria verificar, para que possa ser usado no lugar de uma constante.) também usar a linguagem atual, conforme determinado pelo $languageglobal, mas existem métodos API para ajudar com isso de qualquer maneira ( field_get_itemsou até melhor do EntityMetadataWrapperfornecido pelo módulo entidade)
Clive

0

Está correto:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;
      // …
      break;
  }
}

0

Isso funciona bem:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);
  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"][0]['value']['#default_value']=$default;
      break;
  }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.