Campo de valores ilimitados - como ocultar campos extras na edição de nós

9

Ao criar um novo nó, tenho esse campo de valores ilimitados com o botão "Adicionar novo item".

Campo Valores Ilimitados - Novo Nó

Tudo bem, maravilhoso. Mas quando edito um nó existente, recebo um valor extra vazio INDESEJADO para mim: Campo Valores Ilimitados - Nó de Edição

Meu caso real é com um grande campo composto, mas pensei que usar esse campo pequeno como exemplo seria mais fácil de entender.

Existe alguma maneira de impedir que este campo "extra" seja adicionado de forma intrusiva?

Fidelix
fonte
2
Para esclarecer, você deseja que não haja campos vazios na edição? Então, para adicionar outro campo, eles seriam forçados a usar o botão "Adicionar outro item"?
tim.plunkett
Sim, você entendeu perfeitamente.
Fidelix
@Fidelix, você encontrou um módulo para fazer isso ou apenas código personalizado neste momento?
David Barratt
@DavidBarratt apenas código personalizado, receio.
Fidelix

Respostas:

10

Isso funcionaria para todos os formulários de edição de nós:

/**
 * 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
fonte
É possível "Adicionar" um novo campo vazio neste gancho?
Fidelix
Teoricamente, você poderia. Algo como $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];pode funcionar.
tim.plunkett
Há um problema nesta solução. Se não houver valor e o delta máximo for 0 e você clicar em adicionar outro item, ele não adicionará campo extra. quando você clicar novamente em adicionar outro item, ele adicionará um campo extra. Isso significa que é necessário clicar duas vezes em adicionar outro item se o nó não tiver valor nesse campo.
Ahmad
3

Isso funcionaria para todos os formulários de edição de nó sem especificar os nomes dos campos.

/**
 * 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
fonte
Eu só estava pensando que você poderia verificar a cardinalidade lendo a resposta superior e depois viu que conseguiu!
Jowan sebastian
Para evitar a remoção a única entrada de campo (se o campo não é obrigatório):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quotesBro
2

Você pode escrever seu próprio módulo com um hook_form_FORM_ID_alter para remover o campo indesejado. 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
fonte
0

se de uma perspectiva de back-end não for possível no momento, uma alternativa pode ser o seguinte Jquery. Esse código removerá apenas o primeiro destino quando a página for carregada e somente o destino será adicionado quando o usuário adicionar arquivos, para que você não tenha problemas quando já tiver arquivos:

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

(coloque antes da bodytag de fechamento do seu page.tpl.php)

De acordo com o meu teste, as imagens são carregadas sem problemas e, quando você edita o nó, todos os arquivos são listados.

note: neste exemplo 'field_test_file' é o nome do campo CCK, então lembre-se de alterar de acordo com o nome do seu campo cck.

cigotete
fonte
Meu comentário sobre sua solução CSS ainda permanece: por que fazer isso quando você pode fazer isso com PHP? Veja drupal.stackexchange.com/questions/10481/…
tim.plunkett
Olá Tim, posso entender seu ponto de vista e concordo em alguns casos. Se não estiver errado, acho que os campos do arquivo CCK estão usando javascript para mostrar novos campos e é uma boa solução (se você desabilitar esse recurso ou não tiver javascript, a maneira de back-end / php é possível como segunda alternativa). Além disso, acho bom conhecer alternativas para resolver o mesmo requisito.
cigotete