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?


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]);
}

É 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]);

        }
      }
    }

  }
}

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

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.


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
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.