Поле необмежених значень - як приховати зайве поле під редагуванням вузла


9

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

Поле з необмеженими значеннями - Новий вузол

Це добре, чудово. Але коли я редагую існуючий вузол, я отримую НЕЗАЄМНЕ пусте додаткове значення для мене: Поле з необмеженими значеннями - Редагувати вузол

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

Чи є якимось способом запобігти нав'язливому додаванню цього "зайвого" поля?


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

Чи можна "додати" нове порожнє поле в цей гачок?
Fidelix

Теоретично ви могли. Щось подібне $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];може спрацювати.
tim.plunkett

У цьому рішенні є проблема. Якщо немає значення, а 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]);

        }
      }
    }

  }
}

Я просто думав, що ви можете перевірити кардинальність, читаючи верхню відповідь, тоді побачив, що ви це зробили!
jowan sebastian

Щоб не видаляти єдине введення поля (якщо поле не обов'язкове):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
цитуйтеБро

2

Ви можете написати власний модуль за допомогою гачок_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;
}

0

якщо з точки зору запуску наразі це неможливо, альтернативою може бути наступний Jquery. Цей код видалить лише першу ціль, коли завантажується сторінка, і вилучить ціль лише тоді, коли користувач додасть файли, тож у вас не буде проблем, коли у вас вже є файли:

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

(поставити перед bodyзакриваючим тегом сторінки.tpl.php)

Згідно з моїм тестом, зображення завантажуються без проблем, і коли ви редагуєте вузол, всі файли відображаються у списку.

Примітка: у цьому прикладі "field_test_file" - це ім'я поля CCK, тому не забудьте змінити ім'я поля вашого cck.


Мій коментар щодо вашого рішення CSS все ще стоїть: навіщо робити це, коли ви могли це зробити за допомогою PHP? Дивіться drupal.stackexchange.com/questions/10481/…
tim.plunkett

Здрастуйте, Тіме, я можу зрозуміти вашу точку зору, і я згоден у деяких випадках. Якщо я не помиляюся, я думаю, що поля файлів CCK використовують JavaScript для показу нових полів, і це гарне рішення (Якщо ви вимкнете цю функцію або не маєте JavaScript, спосіб резервного / php можливий як друга альтернатива). Крім того, я вважаю, що добре знати альтернативи, щоб вирішити ту саму вимогу.
cigotete
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.