'Thêm tiện ích phân loại thuật ngữ phân loại


8

Tôi đang cố gắng tạo một tiện ích trường tương tự như tiện ích tham chiếu thuật ngữ thông thường với một điểm khác biệt chính. Người dùng cần có thể thêm nhiều thuật ngữ phân loại mới cùng một lúc, điều này có thể chứng minh điều đó tốt hơn:

nhập mô tả hình ảnh ở đây

Tôi đã đến một điểm mà chức năng tương tự như những gì các mô-đun phân loại / tùy chọn / danh sách cung cấp (ví dụ: các hộp kiểm / radio được hiển thị, tiết kiệm, v.v.)

Đây là một chút quan trọng của mã tôi đang sử dụng hook_field_widget_form():

 $element += array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

Điều khiến tôi bận tâm ở đây là phần tử $ không phải là mảng biểu mẫu thông thường của bạn nên tôi không chắc cách thêm trường văn bản và nút - đặc biệt là khi giá trị của chúng không có nghĩa là được lưu. Cách tốt nhất để thêm các trường này vào widget của tôi là gì?

Đối với việc thêm Javascript cần thiết, tôi có nghĩ rằng mình nên sử dụng #ajax để gọi một hàm xây dựng lại #options cho các hộp kiểm không?

Cảm ơn trước!

EDIT - Câu hỏi ban đầu của tôi khá mơ hồ, đây là một số chi tiết khác về những gì tôi đã thử:

  $element += array(
    '#type' => 'fieldset',
    '#delta' => $delta,
  );

  $element['value'] = array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

  $element['text'] = array(
    '#type' => 'textfield',
    '#title' => t('Add another'),
    '#weight' => 5,
  );

Đây là sự kết hợp của nhiều ví dụ khác nhau mà tôi đã thấy và dường như giúp tôi gần gũi hơn. Vấn đề là khi tôi gửi biểu mẫu thực thể tôi gặp lỗi sau:

Lưu ý: Chỉ mục không xác định: tid in taxonomy_field_is_empty () (dòng 1402 của mô-đun \ taxonomy \ taxonomy.module).

Tôi đã xem xét kỹ hơn về chức năng này và nó hy vọng $itemsẽ có cấu trúc $item = array('tid', 2). Khi sử dụng đoạn mã trên dường như có một đồng bằng đến từ đâu đó và cấu trúc của $itemkết thúc là $item = array(0, array('tid', 2). Tôi không thể tìm ra '0' đến từ đâu?

EDIT KHÁC

Tôi đã có thể sửa lỗi trên bằng mã sau bằng cách thay đổi phần tử $ như vậy:

$element += array(
    '#type' => 'fieldset',
    '#process' => array('taxonomy_free_entry_ignore_parent'),
);

và thêm chức năng:

function taxonomy_free_entry_ignore_parent(&$form, &$form_state, $complete) {
  array_pop($form['#parents']);
  return $form;
}

Khi tôi lưu thực thể, tôi nhận được một tin nhắn cho tôi biết nó đã được lưu. Khi tôi kiểm tra bảng cho trường, nó sẽ không được lưu. Tôi đang làm gì sai?

Câu trả lời:


2

Tôi chắc chắn rằng bạn có thể làm điều này trong hook_field_widget_form()(mà tôi đoán là mã hiện tại của bạn ở đâu) chỉ bằng cách thêm một phần tử con vào phần tử hiện tại của bạn, ví dụ:

$element['text'] = array(
  '#type' => 'textfield',
  '#title' => 'Title',
  // etc...
);

Nếu nó không hoạt động tôi biết nó chắc chắn sẽ hoạt động nếu bạn sử dụng hook_field_widget_form_alter().

Ví dụ: dưới đây là một chức năng nhỏ cho phép alttrường cho loại trường Hình ảnh bằng cách sử dụng tiện ích Bộ chọn phương tiện (vì một số lý do không được bật theo mặc định):

function media_image_attributes_field_widget_form_alter(&$element, &$form_state, &$context) {
  if ($context['field']['type'] == 'image') {
    $element['alt'] = array(
      '#type' => 'textfield',
      '#title' => 'Image Description',
      '#weight' => 10000,
      '#default_value' => count($element['#default_value']) ? $element['#default_value']['alt'] : ''
    );
  }
}

Theo như chức năng ajax, tôi nghĩ bạn chắc chắn sẽ đi đúng hướng. Tôi nghĩ rằng mô-đun Ví dụ trường trong các ví dụ có một số mã mẫu có thể giúp ích.


Cảm ơn câu trả lời, tôi đã bình chọn nó vì nó đã cho tôi một số thông tin tốt để tiếp tục nhưng không trả lời được lắm! Kiểm tra chỉnh sửa của tôi để cung cấp thêm một số thông tin về những gì tôi đã thử nhờ câu trả lời của bạn.
splatio

@splat bạn đã có thể thực hiện một widget làm việc chưa? Bạn có sẵn sàng chia sẻ nó?
Joe Beuckman

Xin lỗi Joe, tôi đã không thể giải quyết vấn đề này và cuối cùng đã sử dụng một cách tiếp cận phức tạp khác! Nếu bạn làm việc đó, hãy đăng nó ở đây vì tôi sẽ quan tâm đến tương lai như thế nào. Tôi cũng vui vẻ chấp nhận nó như là câu trả lời.
splatio

@splatio Bạn có thể cung cấp một số thông tin về cách tiếp cận thay thế của bạn?
vfclists


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.