Làm cách nào tôi có thể xóa các mục khỏi danh sách giá trị được phép của trường chọn có dữ liệu cho các giá trị?


16

Tôi đã tạo một loại nội dung có trường tùy chọn danh sách / chọn và tôi đã nhập các cặp khóa | giá trị cần thiết cho danh sách chọn để hoạt động.

Dữ liệu đã được nhập và đã được quyết định rằng các điều khoản nhất định không còn được áp dụng và chúng nên bị xóa.

Tuy nhiên, khi cố gắng xóa các điều khoản đã nói, tôi gặp phải lỗi sau:

Allowed values list: some values are being removed while currently in use.

Rõ ràng, trong cuộc sống của một dự án, các giá trị sẽ thay đổi. Cách thực tế để loại bỏ các mục một khi các nút được liên kết với các điều khoản được liệt kê là gì?

Đây là về điều gần nhất mà tôi có thể tìm thấy:

https://drupal.org/node/1653012

Nó tham khảo một plugin d6 và một số thủ thuật vá lỗi mà tôi không muốn phải dùng đến. Nếu cuối cùng tôi phải sử dụng bản vá để loại bỏ kiểm tra xác thực trên trường đó, liệu có bất kỳ tác hại nào trong việc để các mục đó mồ côi trên các nút mà chúng được liên kết không?

Cập nhật, tôi đã gặp lại vấn đề này với một khách hàng của chính phủ, trong 7 năm qua có một trang web Drupal đã có 50 tiểu bang và vùng lãnh thổ trong danh sách chọn lọc. Bây giờ, chính sách đã thay đổi và các lãnh thổ không còn cần thiết phải được đưa vào. Có thể xóa các mục khỏi danh sách chọn là điều quan trọng và do đó tôi sẽ cung cấp tiền thưởng.

Tôi đang tìm kiếm một giải pháp an toàn để có thể xóa các mục khỏi danh sách chọn. Điều tôi không biết là liệu giải pháp đó có nên cập nhật bất kỳ nút nào không vì tôi không chắc các giá trị trường được lưu trữ liên quan đến tổng nội dung của nút như thế nào.

Tôi hài lòng với một giải pháp SQL thuần túy để chạy trong MySQL; hoặc, tôi đang tìm kiếm một mô-đun.


3
Rõ ràng, trong cuộc sống của một dự án, các giá trị sẽ thay đổi. Tôi sẽ tranh luận rằng - các giá trị cho một danh sách chọn tĩnh nên được xác định khi bắt đầu dự án. Nếu bạn cần nó linh hoạt, bạn nên sử dụng một tham chiếu thuật ngữ thay vì một danh sách tĩnh. Danh sách tĩnh dành cho những thứ như tình dục (nam / nữ), trừ khi chúng ta có sự thay đổi nghiêm trọng về mọi thứ, không có khả năng thay đổi bất cứ lúc nào sớm. Và nếu có, nó sẽ được thêm vào, không bị xóa . Bất cứ khi nào tôi mắc phải 'lỗi' này, tôi luôn tìm ra cách tốt nhất để rút lui là chạy các truy vấn thủ công trên dữ liệu
Clive

1
Bạn có muốn làm cho danh sách này năng động? năng động trong sáng tạo và xóa.
M ama D

1
Vâng tôi đoán đó chỉ là ý kiến ​​sau đó - nhà sản xuất ô tô sẽ luôn là loại nút hoặc từ vựng cho bất kỳ trang web nào tôi sẽ xây dựng. Vì nhà sản xuất là một danh mục xe hơi (hoặc danh mục xe hơi mà ai đó sửa chữa), nên nó có ý nghĩa nhất đối với tôi như là một phân loại đối với tôi chứ không phải là một loại nội dung. Nhưng tôi biết rằng không giúp đỡ ... Tôi sẽ cảnh giác với việc rời khỏi dữ liệu đứa trẻ mồ côi trong DB, nó rất khó để nói những gì tác động có thể có mà không biết chính xác những gì đang được cài đặt trên trang web của bạn và làm thế nào nó được cấu hình
Clive

1
Có gì sai với lượt xem_bulk_operations?
donquixote

1
heh, chưa có câu trả lời nào trong số này có bất kỳ câu trả lời nào: /
tenken

Câu trả lời:


7

Tôi đã làm một cái gì đó như thế này gần đây với cách tiếp cận sau đây.

  1. Thêm các giá trị mới được phép.
  2. Thêm một cài đặt để định cấu hình giá trị "hoạt động".
  3. Lọc các giá trị "không hoạt động" khỏi màn hình trên biểu mẫu.

ví dụ:

/**
 * Admin settings form
 */
function MODULE_admin_settings(){

  $form = array();

  // Select active preferences for display
  $field = field_info_field('field_preferences');
  $preferences = list_allowed_values($field);
  $form['field_preferences_active'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Active preferences'),
    '#options' => $preferences,
    '#description' => t('Select the preferences available for user selection.'),
    '#default_value' => variable_get('field_preferences_active', array()),
  );

  return system_settings_form($form);

}

/**
 * Implements hook_field_attach_form
 */
function MODULE_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {

  // Filter out inactive preferences
  if(isset($form['field_preferences'])){
    $preferences = variable_get('field_preferences_active', array());
    foreach($preferences as $key => $preference){
      // If this preference isn't checked, but is set in the field values, unset it.
      if(empty($preference) && isset($form['field_preferences'][LANGUAGE_NONE]['#options'][$key])){
        unset($form['field_preferences'][LANGUAGE_NONE]['#options'][$key]);
      }
    }
  }

}

Bằng cách này, dữ liệu kế thừa được lưu giữ để tham khảo, biểu mẫu xác thực và tính toàn vẹn dữ liệu còn nguyên vẹn.


1
Tùy chọn này về cơ bản là không mô tả (nghĩa là ẩn nội dung thay vì xóa) và có lẽ là điểm khởi đầu tốt nhất cho đến khi bạn có thể xác định hướng hành động tốt nhất để xử lý bất kỳ thực thể nào có các tùy chọn lỗi thời.
mpdon Arena

3

Như tôi biết, tất cả dữ liệu của các trường được lưu trữ trong 2 bảng: field_data_field_FIELDNAME và field_Vvision_field_FIELDNAME. Và tôi đã tìm thấy xác nhận suy nghĩ của mình ở đây: /programming//a/7773117/1300562

Vì vậy, để xóa các giá trị trường không cần thiết, bạn cần xóa các giá trị này khỏi các bảng được đề cập ở trên và sau đó xóa chúng khỏi danh sách các giá trị được phép.

Bước 1.

$values_to_remove = array('value1', 'value2'); // an array of unnecessary values
$fieldname = 'FIELDNAME'; // name of your field. For example,
                          // 'territory' for field with machine name 'field_territory'
$entity_type = 'node'; // it's 'node' in your case, but it can be 'taxonomy_term' or something else

db_delete('field_data_field_' . $fieldname)
  ->condition('entity_type', $entity_type)
  ->condition('field_' . $fieldname . '_value', $values_to_remove)
  ->execute();

db_delete('field_revision_field_' . $fieldname)
  ->condition('entity_type', $entity_type)
  ->condition('field_' . $fieldname . '_value', $values_to_remove)
  ->execute();

Bước 2.
Xóa các cặp khóa | giá trị không cần thiết trên trang cài đặt trường và gửi biểu mẫu để lưu các thay đổi.
Bộ nhớ cache sẽ tự động bị xóa sau đó, nhưng nếu bạn vẫn có thể thấy các giá trị trường bị xóa trên các trang nút, hãy xóa bộ đệm theo cách thủ công.

PS Gần đây tôi gặp phải vấn đề tương tự, và bây giờ tôi thích sử dụng các trường loại "Tham chiếu thuật ngữ" hoặc (thậm chí tốt hơn) "Tham chiếu thực thể" thay vì danh sách các giá trị văn bản. Khi sử dụng trường tham chiếu, bạn có thể tạo từ vựng riêng cho từng trường và chỉ cần tạo / chỉnh sửa / xóa thuật ngữ bất cứ lúc nào.


Nếu trường đang lặp lại, thì các truy vấn đó sẽ không điều chỉnh deltas cho dữ liệu còn lại.
mpdon Arena

1

Trước hết hãy kiểm tra xem bạn có bất kỳ giá trị được phép nào được chỉ định trong trường không? Nếu bạn làm như vậy, thì một tùy chọn khác sẽ không được xác nhận. Vì vậy, hãy thử xóa các giá trị khỏi tab Cài đặt trường trước.

Ngoài ra, bạn có 2 tùy chọn:


1.

Xóa tất cả các giá trị mà bạn đã đưa vào danh sách giá trị được phép mà tài khoản người dùng đang sử dụng. Ví dụ: bạn có thể chạy truy vấn SQL để tìm:

SELECT * FROM field_data_field_MYFIELDNAME WHERE entity_type = 'user' and value = 'MY VALUE'

hoặc tạo chế độ xem người dùng cho bạn biết tài khoản người dùng nào có giá trị bạn muốn xóa khỏi danh sách giá trị được phép.


2.

Nếu bạn không muốn xóa các giá trị khỏi các trường, điều này có thể đạt được bằng cách hack.

Cảnh báo, đây không phải là giải pháp được đề xuất cho sản xuất và bạn nên biết những gì bạn đang làm!

  1. Tìm và chỉnh sửa các mô-đun / trường / field.module
  2. Tìm hàm field_has_data () và thêm return TRUE;vào dòng đầu tiên của hàm.

    function field_has_data($field) {
      return FALSE; // HACK !!!
      $query = new EntityFieldQuery();
    
  3. Lưu lại trường với các giá trị bạn muốn.
  4. Loại bỏ hack ngay khi bạn làm điều đó.

0

Tôi nghĩ rằng bạn thực sự có thể làm điều này bằng cách sử dụng mô-đun Lượt xem hoạt động hàng loạt .

  1. thêm một tùy chọn mới trên lĩnh vực mà bạn muốn thay thế. ví dụ: na | NA
  2. tạo nút Xem để liệt kê chứa với trường đó
  3. thêm các trường "Hoạt động hàng loạt: Nội dung" trên Chế độ xem đó
  4. kiểm tra "Sửa đổi giá trị thực thể" và "hiển thị mã thông báo có thể sử dụng" (chọn Tất cả trên giá trị hiển thị)
  5. Thêm trường bạn muốn thay đổi trên Tiêu chí bộ lọc và "phơi bày" bộ lọc đó
  6. đặt đường dẫn url trên Chế độ xem đó
  7. Chuyển đến trang xem đó và thay đổi
  8. Bây giờ, sử dụng các tính năng phơi sáng và hoạt động để thay đổi tùy chọn trường
  9. Làm xong

0

Đây là một cải tiến cho câu trả lời HL mà tôi nghĩ là tốt nhất:

Để tổng hợp, bạn cần gán các giá trị mới cho nội dung có các giá trị "cũ" được gán cho trường đã chọn của bạn.

Ngoài các hoạt động hàng loạt lượt xem , bạn sẽ cần cài đặt và kích hoạt mô-đun Quản trị lượt xem . Với mô-đun này, bạn đã có chế độ xem bên ngoài với các hoạt động hàng loạt được bật (chỉ cần xem quản trị / nội dung sau khi được bật). Sau đó:

1) Chuyển đến chế độ quản trị / cấu trúc / lượt xem chỉnh sửa "Quản trị: Nút"

2) Thêm hiển thị trang mới cho chế độ xem bằng nút "Thêm -> Trang" ở trên cùng

3) Gán đường dẫn đến màn hình mới: Ví dụ quản trị viên / nội dung / tùy chỉnh

4) Thêm bộ lọc mới cho trường chọn của bạn: Chọn toán tử "là một trong" và sau đó chọn tất cả các tùy chọn bạn muốn xóa

5) Lưu chế độ xem

6) Chuyển đến quản trị viên / nội dung / tùy chỉnh Bây giờ bạn thấy tất cả nội dung bạn cần chỉnh sửa hàng loạt (thay đổi giá trị cho trường bạn chọn)

7) Chọn tất cả các hàng bằng cách nhấp vào hộp kiểm đầu tiên ở bên trái của bảng (nếu có nhiều hơn một trang, cũng chọn một nút có nội dung "Chọn tất cả các hàng X trong chế độ xem này")

8) Chọn thao tác "thay đổi giá trị" và nhấn "Thực thi"

9) Đối với trường bạn chọn, chọn một giá trị mới để ghi đè lên giá trị bạn muốn xóa

10) Chọn hộp kiểm cho trường chọn đó

11) Nhấp vào Tiếp theo và bạn đã hoàn tất


0

Có vẻ như vấn đề Drupal của bạn dựa trên vấn đề dữ liệu sâu hơn: Điều gì xảy ra với các thực thể hiện đang sử dụng các giá trị danh sách không dùng nữa? Câu hỏi này nằm ở gốc của thông báo lỗi mà Drupal đang gửi cho bạn.

Hãy xem xét kỹ hơn ví dụ về tiểu bang / lãnh thổ của bạn. Khách hàng của bạn đã sử dụng một hệ thống xử lý các trạng thái và lãnh thổ theo cùng một cách trong nhiều năm và đã xây dựng một nhóm lớn các nút chứa cả trạng thái và lãnh thổ. Rồi một ngày, các quyền hạn quyết định rằng các lãnh thổ cần được xử lý khác nhau và việc thả xuống để gán vùng sẽ không còn chứa các lãnh thổ. Tuyệt quá. Chỉ cần tạo chế độ xem sử dụng các bộ lọc tiêu chuẩn để hiển thị danh sách tất cả các nút lãnh thổ và sử dụng Chế độ xem hàng loạt để thay đổi tất cả các giá trị khu vực của chúng thành ... điều gì ... có thể là trạng thái thứ 51 khác? Số phận của các lãnh thổ là một câu hỏi rất nghiêm trọng. Giải pháp của bạn phải bao gồm một phương pháp để bảo tồn hoặc di chuyển trạng thái lãnh thổ. Bạn có thể cần tạo một trường danh sách mới gọi là 'Lãnh thổ'

Bạn sẽ cần sử dụng Quy tắc với Xem hoạt động hàng loạt để thực hiện các thay đổi này. Nếu bạn không biết nhiều về các quy tắc, vui lòng dành chút thời gian để tìm hiểu về cách chúng hoạt động. Các quy tắc cung cấp cho bạn khả năng thao tác thông tin dựa trên các kích hoạt, điều kiện và hành động. Sau khi tìm hiểu về các quy tắc, bạn có thể thấy rằng các câu trả lời bạn đang tìm kiếm sẽ tự trình bày bằng trực giác. Về cơ bản, Bạn sẽ cần tạo một quy tắc, được kích hoạt bởi Hoạt động hàng loạt, sẽ nhắm mục tiêu tất cả các lãnh thổ và xóa, gán lại, đổi tên hoặc tách chúng ra khỏi phần chính của thông tin. Quy tắc phải có khả năng lưu trữ trạng thái lãnh thổ theo một cách nào đó đồng thời, đặt trạng thái thả xuống trạng thái thành trạng thái 'khác' hoặc 'Không áp dụng'. Đây có thể là tất cả những gì cần thiết. Nếu không thì...

Sau khi hoàn thành việc gán lại, đây là một thao tác đơn giản để thay đổi trường danh sách ban đầu và xóa tên lãnh thổ. Tuy nhiên, nếu hệ thống vẫn không cho phép bạn thay đổi danh sách, bạn có thể cần tạo trường danh sách mới, sau đó sử dụng Quy tắc và hoạt động hàng loạt của Chế độ xem để xem lại tất cả các giá trị trạng thái hiện tại và gán lại chúng vào danh sách mới. Các quy tắc có thể hoạt động với Lượt xem Hoạt động hàng loạt để nhắm mục tiêu tất cả các nút có liên quan và hành động dựa trên chúng dựa trên các giá trị trường. Đặt giá trị của trường danh sách mới dựa trên giá trị của trường danh sách hiện có cho một nhóm các nút là dễ dàng khi bạn sử dụng Quy tắc.

Cũng nên nhớ, nếu Drupal gây rắc rối cho bạn với một thao tác, hãy luôn xóa bộ đệm trước khi xem xét một giải pháp thay thế khó khăn.


0

Tôi cho rằng khách hàng của bạn muốn giữ nội dung kế thừa theo giá trị ban đầu của nó, nghĩa là thay đổi danh sách chọn sẽ hủy hiệu quả mọi dữ liệu trước đó. Nếu đó không phải là một mối quan tâm, thì bất kỳ câu trả lời nào khác có thể sẽ hoạt động. Tuy nhiên, nếu thực sự, bạn không thể thay đổi danh sách chọn mà không mất lịch sử dữ liệu đó. Tôi có thể đi một con đường đơn giản hơn nhiều, để cho phép dữ liệu lịch sử, đồng thời làm cho trang web có thêm một chút bằng chứng trong tương lai - Tôi sẽ đề xuất sử dụng quyền của trường:

* thiết lập trường mới cho danh sách chọn đó bằng cách sử dụng phân loại thay vì dữ liệu tĩnh

* đặt quyền cho trường cho danh sách chọn hiện tại là XEM, nhưng không phải EDIT bởi bất kỳ ai trừ quản trị viên

Với điều này, trường cũ sẽ vẫn có thể xem và tìm kiếm được (thêm một tiêu đề mới chỉ phản ánh nó là di sản) nhưng không thể chỉnh sửa. Điều này tất nhiên phụ thuộc rất nhiều vào các tìm kiếm tùy chỉnh, lượt xem, v.v ... có thể cần phải điều chỉnh.

Tôi đề nghị điều này (lộn xộn như có thể nghe) bởi vì xóa dữ liệu đó, xóa lịch sử và cuối cùng có thể bị tàn phá trong thời gian dài. Bạn thậm chí có thể sử dụng css để ẩn trường cũ trong nút chỉnh sửa và một cái móc để ẩn nó cho nội dung mới (nơi nó không có giá trị được đặt). Theo cách này, nó sẽ chỉ hiển thị cho nội dung di sản đó.

Tất nhiên, sau đó bạn có thể tiến thêm một bước với mô-đun một lần tùy chỉnh để sao chép dữ liệu từ danh sách chọn cũ sang phân loại mới.


0

Một kịch bản drush đơn giản để giải cứu! Chúng tôi cập nhật dữ liệu trường và bảng sửa đổi trường và thay thế các giá trị cũ bằng các giá trị mới trước khi thay đổi cài đặt trường theo cách thủ công.

Nếu chúng ta có một cái gì đó như thế này trong cài đặt trường hiện tại của chúng tôi:

&date=today|today
&date=last2days|last2days

và muốn thay thế nó bằng cách sau:

date=today|today
date=last2days|last2days

Chúng tôi chạy tập lệnh drush trước và sau đó thay đổi cài đặt trường trong UI quản trị viên.

Lưu ý: Mã này dành cho một trường có tên máy field_foo_bar.

    $field_name = 'foo_bar';

    print "for {$field_name}...\n";

    replace_field("&date=today", "date=today", $field_name);

    replace_field("&date=last2days", "date=last2days", $field_name);

    function replace_field($old_value, $new_value, $field_name, $entity_type='node') {
      print "Replacing {$old_value} with {$new_value}...\n";
      $data_count = replace_options_data_field($field_name, $entity_type, $old_value, $new_value);
      $revision_count = replace_options_revision_field($field_name, $entity_type, $old_value, $new_value);
      print $data_count + $revision_count . " entries replaced.\n";
    }

    function replace_options_data_field($field_name, $entity_type, $old_value, $new_value) {
      $num_updated = db_update('field_data_field_' . $field_name)
        ->fields(array(
                   'field_' . $field_name . '_value' => $new_value,
                 ))
        ->condition('entity_type', $entity_type)
        ->condition('field_' . $field_name . '_value', $old_value)
        ->execute();
      return $num_updated;
    }

function replace_options_revision_field($field_name, $entity_type, $old_value, $new_value) {
  $num_updated = db_update('field_revision_field_' . $field_name)
    ->fields(array(
               'field_' . $field_name . '_value' => $new_value,
             ))
    ->condition('entity_type', $entity_type)
    ->condition('field_' . $field_name . '_value', $old_value)
    ->execute();
  return $num_updated;
}

0

Tôi đã sử dụng đề xuất thứ 2 của kenorb và nó đã hoạt động để cập nhật danh sách các giá trị trong trường Drupal 7.52, Profile2 7.x-1.3. Vì vậy, nếu bạn đang nhận được cảnh báo drupal: Danh sách các giá trị được cho phép: một số giá trị đang bị xóa trong khi đang sử dụng. Sau đây cho phép tôi xóa các giá trị khỏi trường (profile2), mà không xóa hoặc thay thế chúng trong cơ sở dữ liệu.

Trong thư mục gốc của lõi Drupal, có một thư mục được gọi là các mô-đun và tệp để chỉnh sửa được đặt tại: mô-đun / trường / trường.module. ĐÂY LÀ MỘT FILE CORE, bạn phải hoàn toàn hoàn nguyên các thay đổi của mình khi thực hiện cập nhật giá trị. Tôi đã lấy trang web ngoại tuyến, tạm thời thay thế khối mã sau trong (root drupal) /modules/field/field.module

function field_has_data($field) {
  $query = new EntityFieldQuery();
  $query = $query->fieldCondition($field)
    ->range(0, 1)
    ->count()
    // Neutralize the 'entity_field_access' query tag added by
    // field_sql_storage_field_storage_query(). The result cannot depend on the
    // access grants of the current user.
    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT');

  return (bool) $query
    ->execute() || (bool) $query
    ->age(FIELD_LOAD_REVISION)
    ->execute();
}

VỚI CHÍNH XÁC

function field_has_data($field) { 
    return FALSE; // hack 
    $query = new EntityFieldQuery();
}

Và drupal ngừng phàn nàn và tôi đã có thể thay đổi danh sách. (Trong trường hợp của tôi, đó là giảng viên trong danh sách các giá trị đã rời trường đại học, nhưng vẫn được liên kết với hồ sơ sinh viên, với tư cách là cố vấn, cố vấn của họ, v.v.)

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.