Trường giá trị không giới hạn - cách ẩn trường bổ sung trên chỉnh sửa nút


9

Khi tạo một nút mới, tôi có trường giá trị không giới hạn này bằng nút "Thêm mục mới".

Trường giá trị không giới hạn - Nút mới

Điều đó thật tuyệt vời. Nhưng khi tôi chỉnh sửa một nút hiện có, tôi nhận được một giá trị bổ sung trống rỗng HIỂU được thêm cho tôi: Trường giá trị không giới hạn - Chỉnh sửa nút

Trường hợp thực tế của tôi là với một trường ghép lớn, nhưng tôi nghĩ sử dụng trường nhỏ này làm ví dụ sẽ dễ hiểu hơn.

Tôi có cách nào để ngăn trường "phụ" này không bị xâm nhập không?


2
Để làm rõ, bạn muốn không có trường trống nào được trình bày khi chỉnh sửa? Vì vậy, để thêm một lĩnh vực khác, họ sẽ buộc phải sử dụng nút "Thêm một mục khác"?
tim.plunkett

Vâng, bạn hiểu nó một cách hoàn hảo.
Fidelix

@Fidelix, bạn đã tìm thấy một mô-đun để làm điều này, hoặc chỉ mã tùy chỉnh tại thời điểm này?
David Barratt

@DavidBarratt chỉ có mã tùy chỉnh, tôi sợ.
Fidelix

Câu trả lời:


10

Điều này sẽ làm việc cho tất cả các hình thức chỉnh sửa nút:

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

Có thể "Thêm" một trường trống mới trong hook này không?
Fidelix

Về mặt lý thuyết, bạn có thể. Một cái gì đó như $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];có thể làm việc.
tim.plunkett

Có một vấn đề trong giải pháp này. Nếu không có giá trị và đồng bằng tối đa là 0 và bạn nhấp vào thêm một mục khác, nó sẽ không thêm trường bổ sung. sau đó khi bạn nhấp lại vào một mục khác thì nó sẽ thêm trường bổ sung. Nó có nghĩa là nhấp đúp yêu cầu khi thêm một mục khác ff nút không có giá trị đối với trường đó.
Ahmad

3

Điều này sẽ làm việc cho tất cả các hình thức chỉnh sửa nút mà không chỉ định tên trường.

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

        }
      }
    }

  }
}

Tôi chỉ nghĩ rằng bạn có thể kiểm tra cardinality đọc câu trả lời hàng đầu sau đó thấy bạn đã làm điều đó!
jowan sebastian

Để tránh xóa đầu vào trường duy nhất (nếu trường không bắt buộc):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
trích dẫnBro

2

Bạn có thể viết mô-đun của riêng mình bằng hook_form_FORM_ID_alter để xóa trường không mong muốn. Cái gì đó như...

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

nếu từ góc độ phụ trợ là không thể bây giờ, một sự thay thế có thể là Jquery sau đây. Mã này sẽ chỉ xóa mục tiêu đầu tiên khi được tải trang và sẽ chỉ xóa mục tiêu khi người dùng sẽ thêm tệp, do đó bạn sẽ không gặp vấn đề khi bạn đã có tệp:

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

(đặt trước bodythẻ đóng của trang.tpl.php của bạn)

Theo thử nghiệm của tôi, hình ảnh được tải lên mà không gặp vấn đề gì và khi bạn chỉnh sửa nút, tất cả các tệp được liệt kê.

lưu ý: với ví dụ này 'field_test_file' là tên của trường CCK, vì vậy hãy nhớ thay đổi theo tên của trường cck của bạn.


Nhận xét của tôi về giải pháp CSS của bạn vẫn đứng vững: tại sao phải làm điều này khi bạn có thể làm điều đó với PHP? Xem drupal.stackexchange.com/questions/10481/iêu
tim.plunkett

Xin chào Tim, tôi có thể hiểu quan điểm của bạn và tôi đồng ý trong một số trường hợp. Nếu không sai, tôi đoán rằng các trường tệp CCK đang sử dụng javascript để hiển thị các trường mới và là một giải pháp tốt (Nếu bạn tắt tính năng này hoặc không có javascript, cách phụ trợ / php có thể giống như cách thay thế thứ hai). Ngoài ra, tôi nghĩ rằng đó là tốt để biết các lựa chọn thay thế để giải quyết cùng một yêu cầu.
cigotete
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.