Establecer mediante programación el valor predeterminado para un campo

10

En Drupal 6, podríamos usar PHP para establecer valores predeterminados, pero el mismo código no se puede usar con Drupal 7.

Estoy tratando de hacer esto hook_form_alter(), pero el código no 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
fuente

Respuestas:

17

Suponiendo que su función de modificación de formulario se esté ejecutando (lo que puede confirmar con esa llamada dsm()), en realidad hay 2 niveles más de matriz a los que debe ir para acceder al elemento de campo:

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

En Drupal 7 tiene una matriz de valores para cada idioma al que se ha traducido el campo (de modo que los campos con cardinalidad múltiple / ilimitada pueden ser atendidos), y debajo de cada uno de ellos está en la matriz las diferentes columnas de campo. En la mayoría de los casos, esto será 'valor' pero no siempre (por ejemplo, un campo de imagen tiene una columna de identificación de archivo, columna alternativa, etc.)

Espero que ayude

Clive
fuente
Es una profundidad más :)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79
2
Esta respuesta no funcionará para todos los widgets; depende de cómo especifiquen su valor. Por ejemplo, con un campo de referencia de entidad, use: $ form ['field_name'] ['und'] [0] ['target_id'] ['# default_value'] = $ default
Renee
@Renee Muy cierto; hay una explicación más detallada aquí
Clive
1
Los valores de campo siempre tienen un idioma @Mouneer, si no tiene un sitio multilingüe, LANGUAGE_NONEdebe usar el predeterminado
Clive
1
De hecho, podría haber explicado que un poco mejor @Mouneer :) Encontrará el idioma actual en el formulario en alguna parte (creo que tal vez $form['#entity']->languagepero tendría que verificarlo, para que pueda usarse en lugar de una constante. Código de recuperación también usaría el lenguaje actual según lo determinado por el $languageglobal, pero hay métodos API para ayudar con eso de todos modos ( field_get_itemso incluso mejor el EntityMetadataWrapperproporcionado por el módulo de entidad)
Clive
0

Esto correcto:

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

Esto funciona bien:

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
fuente