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

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

Clive
fonte
É 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;
  }
}
keopx
fonte
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;
  }
}
keopx
fonte