Campo de valores ilimitados: cómo ocultar el campo adicional en la edición de nodo

9

Al crear un nuevo nodo, tengo este campo de valores ilimitados con el botón "Agregar nuevo elemento".

Campo Valores ilimitados - Nuevo nodo

Eso está bien, maravilloso. Pero cuando edito un nodo existente, obtengo un valor adicional vacío NO DESEADO agregado para mí: Campo Valores ilimitados - Editar nodo

Mi caso real es con un gran campo compuesto, pero pensé que usar este pequeño campo como ejemplo sería más fácil de entender.

¿Hay alguna manera de evitar que este campo "extra" se agregue intrusivamente?

Fidelix
fuente
2
Para aclarar, ¿desea que no se presente ningún campo vacío después de la edición? Entonces, para agregar otro campo, ¿se verían obligados a usar el botón "Agregar otro elemento"?
tim.plunkett
Sí, lo entendiste perfectamente.
Fidelix
@Fidelix, ¿encontró un módulo para hacer esto, o solo un código personalizado en este momento?
David Barratt
@DavidBarratt solo código personalizado, me temo.
Fidelix

Respuestas:

10

Esto funcionaría para todos los formularios de edición de nodos:

/**
 * Implements hook_form_BASE_FORM_ID_alter().
 */
function MYMODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  $field_name = 'field_YOURFIELD';

  if (empty($form[$field_name])) {
    return;
  }

  $field_language = $form[$field_name]['#language'];
  $max_delta = $form[$field_name][$field_language]['#max_delta'];
  unset($form[$field_name][$field_language][$max_delta]);
}
tim.plunkett
fuente
¿Es posible "Agregar" un nuevo campo vacío en este gancho?
Fidelix
Teóricamente, podrías. Algo así $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];podría funcionar.
tim.plunkett
Hay un problema en esta solución. Si no hay ningún valor y el delta máximo es 0 y hace clic en agregar otro elemento, no agregará un campo adicional. luego, cuando haga clic nuevamente en agregar otro elemento, se agregará un campo adicional. Significa hacer doble clic en agregar otro elemento si el nodo no tiene valor en ese campo.
Ahmad el
3

Esto funcionaría para todos los formularios de edición de nodos sin siquiera especificar los nombres de campo.

/**
 * Implements hook_form_NODE_FORM_alter().
 */
function MY_MODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['#node']->nid) && $form['#node']->nid > 0) {
    $form_fields = array_keys($form);

    foreach ($form_fields as $index => $field_name) {
      if (substr($field_name, 0, 6) == "field_") { // Check if the field is a custom field
        $field_language = $form[$field_name]['#language'];
        if (isset($form[$field_name][$field_language]['#cardinality']) && 
            $form[$field_name][$form[$field_name]['#language']]['#cardinality'] == -1) {

          if (empty($form[$field_name])) {
            continue;
          }

          $max_delta = $form[$field_name][$field_language]['#max_delta'];
          unset($form[$field_name][$field_language][$max_delta]);

        }
      }
    }

  }
}
Vikas
fuente
¡Estaba pensando que podría verificar la cardinalidad leyendo la respuesta principal y luego vi que lo hizo!
jowan sebastian
Para evitar eliminar la única entrada de campo (si el campo no es obligatorio):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quotesBro
2

Puede escribir su propio módulo con un hook_form_FORM_ID_alter para eliminar el campo no deseado. Algo como...

function my_module_form_FORM_ID_alter(&$form, &$form_state, $form_id) {
  // Do checks here to make sure this is an existing node...

  // Get the index of the last input element in this field
  $last_index = $form['field_field_name'][LANGUAGE_NONE]['#max_delta'];
  // Get rid of the last input element
  unset($form['field_field_name'][LANGUAGE_NONE][$last_index]);
  // Move back the last index so that any new elements are added correctly
  $form['field_field_name'][LANGUAGE_NONE]['#max_delta'] = $last_index-1;
}
nmc
fuente
0

si desde una perspectiva de back-end no es posible por ahora, una alternativa podría ser la siguiente Jquery. Este código eliminará solo el primer destino cuando se cargue la página, y solo eliminará el destino cuando el usuario agregue archivos, por lo que no tendrá problemas cuando ya tenga archivos:

<script>
if(!$('div.filefield-file-info').length){
$('table#field_test_file_values tr.even:eq(0)').remove();
}
</script>

(poner antes de la bodyetiqueta de cierre de su page.tpl.php)

Según mi prueba, las imágenes se cargan sin problemas, y cuando edita el nodo, se enumeran todos los archivos.

nota: para este ejemplo, 'field_test_file' es el nombre del campo CCK, así que recuerde cambiar de acuerdo con el nombre de su campo cck.

cigotete
fuente
Mi comentario sobre su solución CSS sigue en pie: ¿por qué hacer esto cuando podría hacerlo con PHP? Consulte drupal.stackexchange.com/questions/10481/…
tim.plunkett el
Hola Tim, puedo entender tu punto de vista, y estoy de acuerdo en algunos casos. Si no me equivoco, supongo que los campos del archivo CCK están usando javascript para mostrar nuevos campos, y es una buena solución (si deshabilita esta función o no tiene javascript, la forma backend / php es posible como segunda alternativa). Además, creo que es bueno conocer alternativas para resolver el mismo requisito.
cigotete