Поле неограниченных значений - как скрыть дополнительное поле при редактировании узла

9

При создании нового узла у меня есть это поле неограниченных значений с кнопкой «Добавить новый элемент».

Поле Неограниченные значения - Новый узел

Это нормально, замечательно. Но когда я редактирую существующий узел, я получаю НЕДОПУСТИМОЕ пустое дополнительное добавленное значение для меня: Поле Неограниченные значения - Редактировать узел

Мой реальный случай с большим составным полем, но я подумал, что использование этого небольшого поля в качестве примера будет проще для понимания.

Есть ли способ предотвратить навязчивое добавление этого «лишнего» поля?

Fidelix
источник
2
Чтобы уточнить, вы хотите, чтобы при редактировании не было пустого поля? Таким образом, чтобы добавить другое поле, они будут вынуждены использовать кнопку «Добавить другой элемент»?
tim.plunkett
Да, ты прекрасно это понял.
Fidelix
@Fidelix, вы нашли модуль для этого или только пользовательский код на данный момент?
Дэвид Барратт
Боюсь, @DavidBarratt только пользовательский код.
Fidelix

Ответы:

10

Это будет работать для всех форм редактирования узла:

/**
 * 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
источник
Можно ли «добавить» новое пустое поле в этот хук?
Fidelix
Теоретически, вы могли бы. Нечто подобное $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];может сработать.
Тим.плункетт
В этом решении есть проблема. Если значение отсутствует, а максимальная дельта равна 0, и вы нажимаете кнопку «Добавить еще один элемент», оно не будет добавлять дополнительное поле. затем, когда вы снова нажмете на добавить еще один элемент, он добавит дополнительное поле. Это означает двойной щелчок, необходимый для добавления другого элемента, если узел не имеет значения для этого поля.
Ахмад
3

Это будет работать для всех форм редактирования узла, даже не указывая имена полей.

/**
 * 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]);

        }
      }
    }

  }
}
Викас
источник
Я просто думал, что вы можете проверить кардинальность, прочитав верхний ответ, и увидел, что вы это сделали!
Джован Себастьян
Чтобы избежать удаления единственного поля ввода (если поле не требуется):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quotesBro
2

Вы можете написать свой собственный модуль с hook_form_FORM_ID_alter для удаления ненужного поля. Что-то вроде...

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
источник
0

если с точки зрения серверной части пока невозможно, альтернативой может быть следующий Jquery. Этот код удалит только первую цель при загрузке страницы, и удалит только цель, когда пользователь добавит файлы, поэтому у вас не будет проблем, когда у вас уже есть файлы:

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

(поместите перед bodyзакрывающим тегом вашего page.tpl.php)

Согласно моему тесту изображения загружаются без проблем, и при редактировании узла все файлы отображаются в списке.

примечание: в этом примере 'field_test_file' - это имя поля CCK, поэтому не забудьте изменить его в соответствии с именем вашего поля cck.

cigotete
источник
Мой комментарий о вашем решении CSS остается в силе: зачем это делать, если вы можете сделать это с помощью PHP? См. Drupal.stackexchange.com/questions/10481/…
tim.plunkett
Привет Тим, я могу понять твою точку зрения, и я согласен в некоторых случаях. Если я не ошибаюсь, я полагаю, что в полях файла CCK используется javascript для отображения новых полей, и это хорошее решение (если вы отключите эту функцию или не используете javascript, возможен способ backend / php, как и во втором варианте). Кроме того, я думаю, что полезно знать альтернативы для решения того же требования.
сигарета