Làm cách nào để thay đổi tên máy của một trường sau khi nó được tạo


18

Tôi tách ra trong khi gõ tên trường và bây giờ tên máy không phải là tên tôi muốn. Tôi biết đó chỉ là một sự phiền toái. nhưng tôi tự hỏi liệu có cách nào để thay đổi tên máy của một trường sau khi nó được tạo không.

Tôi cho rằng điều này dẫn tôi đến phần thứ hai của câu hỏi của tôi. nếu tôi đã tạo một trường và nó không còn được sử dụng nữa, làm cách nào để xóa nó, điều này có phải được thực hiện từ cơ sở dữ liệu hay có thể được thực hiện ở đâu đó trong UI.

Câu trả lời:


15

Nói tóm lại, bạn không thể thay đổi tên máy. Về lý thuyết, rõ ràng là có thể, nhưng nó sẽ đòi hỏi khá nhiều thứ lộn xộn với cơ sở dữ liệu. Nếu bạn chỉ tạo trường, việc xóa nó và tạo trường mới sẽ dễ dàng hơn nhiều.

Điều cơ bản sẽ là đổi tên tất cả các mục trên field_configfield_config_instance, nhưng ngay khi bạn bắt đầu sử dụng trường, tên máy sẽ được lưu trữ ở một trăm vị trí khác nhau. Xem cấu hình, Cấu hình bảng , Tính năng và nhiều hơn nữa, và sau đó, thay đổi nó không thú vị.

Xóa các trường có thể được thực hiện trên : admin/structure/types/manage/[machine_name_of_content_type]/fields, mà bạn có thể tiếp cận thông qua tab " Quản lý trường " trên bất kỳ loại nội dung nào.


Nhưng không phải các trường vẫn còn trong cơ sở dữ liệu, ví dụ, tôi đã tạo một trường mới với tên popper, tuy nhiên khi tôi thêm trường mới vào loại nội dung, tên trường cũ vẫn xuất hiện dưới dạng tùy chọn .. có lẽ tôi không hiểu chính xác cách thức hoạt động của các lĩnh vực.
dùng379468

1
Có một chức năng mà tôi chưa nghiên cứu nhiều, đó là xóa các trường và nội dung của chúng theo thời gian. Lý do là để ngăn chặn một trang web bị đình trệ khi xóa một trường có hàng ngàn mục nhập. Nếu trường không được sử dụng ở bất cứ đâu, tôi sẽ hy vọng nó sẽ biến mất trong lần chạy cron tiếp theo.
Letharion

Tôi đã cố gắng thực hiện một sed -i -es / old_field / new_field / trên một mã trang web và kết xuất cơ sở dữ liệu. Thật không may, một cái gì đó đã đi sai và sau khi các trang web phục hồi bãi thải bị trục trặc. Bất kỳ ý tưởng làm thế nào để làm điều đó đúng cách?
Dmitry Vyal

1
@Dmitry Vyal: Tên trường được lưu trữ ở một vài vị trí trong một mảng được tuần tự hóa - thay thế một chuỗi bằng một chuỗi khác có độ dài khác nhau sẽ phá vỡ unserialize () của mảng và có thể phá vỡ bootstrap hoặc Drupal tiếp theo.
Charlie Schliesser

@Charlie S: Cảm ơn, sẽ chăm sóc nó trong tương lai.
Dmitry Vyal

16

Quy trình của tôi là sử dụng drush để sao chép trường trước, sau đó sao chép dữ liệu trường bằng các truy vấn DB vào bảng trường mới. Sau khi tôi xác minh nội dung của trường nhân bản, tôi xóa trường ban đầu.

Tôi làm theo cách này bởi vì tôi nghĩ rằng phương pháp nhân bản của các trường nhân bản sẽ luôn đáng tin cậy như bất kỳ mã nhân bản nào tôi có thể tự tạo, truy vấn sao chép dữ liệu khá đơn giản và tôi phải kiểm tra trường mới trước khi xóa bản gốc .

  1. drush field-clone field_my_field field_my_field_clone
  2. Chèn hàng vào field_my_field_clone, vdINSERT field_my_field_clone SELECT * FROM field_my_field;
  3. Xác nhận nội dung của field_my_field_clone.
  4. Xóa trường bằng UI, vd admin/structure/types/manage/my-content-type/fields

1
Điều đó thật tuyệt! Đối với D7: INSERT field_data_field_my_field_clone CHỌN * TỪ field_data_field_my_field; INSERT trường_Vvision_field_my_field_clone CHỌN * TỪ trường numvision_field_my_field;
joelpittet

Tôi không biết đã có lệnh "drush field-clone"! Tuyệt vời :)
Lovau 2/03

Những gì về quan điểm, bảng, vv? Sửa hướng dẫn sử dụng?
zbest

nếu bạn đang sử dụng drush, bạn có thể xóa trường đó drush field-delete xxxvà bạn cũng có thể thích drush sql-querytheo đề xuất của neubreed. @zkent, bạn sẽ có te giới thiệu lại lĩnh vực mới trong các chế độ xem, bảng điều khiển hiện có, v.v.
xaa


6

Tôi đã viết một kịch bản cập nhật, thực sự tạo ra một trường và trường hợp mới với tên máy mới, sao chép tất cả dữ liệu trường cũ sang trường mới và cuối cùng xóa trường hợp cũ.

// Set variables
$old_name = 'field_old_name';
$new_name = 'field_new_name';
$entity_type = 'node';
$bundle = 'page';

// Get old field info
$old_field = field_info_field($old_name);

// Create new field
$new_field = $old_field;
$new_field['field_name'] = $new_name;

if (!field_info_field($new_name)) {
  field_create_field($new_field);
}
else {
  field_update_field($new_field);
}

// Get old field instance
$old_instance = field_info_instance($entity_type, $old_name, $bundle);
$new_instance = $old_instance;
$new_instance['field_name'] = $new_name;

if (!field_info_instance($entity_type, $new_name, $bundle)) {
  field_create_instance($new_instance);
}
else {
  field_update_instance($new_instance);
}

// Migrate old fields' data to the new ones
$field_data = db_select('field_data_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($data = $field_data->fetchAssoc()) {
  $data_new = array();
  foreach ($data as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $data_new[$column] = $value;
  }
  db_insert('field_data_' . $new_name)
    ->fields($data_new)
    ->execute();
}

// Migrate old fields' revision data to the new ones
$field_revision = db_select('field_revision_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($revision = $field_revision->fetchAssoc()) {
  $revision_new = array();
  foreach ($revision as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $revision_new[$column] = $value;
  }
  db_insert('field_revision_' . $new_name)
    ->fields($revision_new)
    ->execute();
}

// Delete old instance
field_delete_instance($old_instance);

// Purge fields
field_purge_batch(1000);

2

Tôi chỉ phải làm điều này, và thấy nó không quá khó, nhưng trang web của tôi khá đơn giản.

Thử đi:

  1. Tạo một lĩnh vực mới với tên thích hợp.
  2. Chạy các truy vấn này trong MySQL:
INSERT INTO field_data_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_data_[OLD MACHINE NAME]` cf
INSERT INTO field_revision_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_revision_[OLD MACHINE NAME]` cf

(trao đổi [TÊN MACHNIE MỚI] và [TÊN MÁY OLD] với field_your_field_names)

  1. Cập nhật mọi chế độ xem liên quan để sử dụng trường mới và bất kỳ mô-đun nào khác trỏ đến trường cụ thể đó (đây là nơi mọi thứ có thể trở nên xấu nếu trang web của bạn phức tạp). Bạn có thể thấy bất kỳ chế độ xem nào sử dụng trường cũ của bạn tại đây:/admin/reports/fields/views-fields
  2. Xóa bộ nhớ cache trang web

2

// Thay đổi tên bảng lưu trữ trường. Ở đây chúng tôi đang thay đổi tên của bảng cũ với tên mới.

db_rename_table($data_table_name, 'field_data_' . $new_field_name);
db_rename_table($revision_table_name, 'field_revision_' . $new_field_name);

// Thay đổi tên trường trong bảng field_config và field_instance_config.

db_update('field_config')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();

db_update('field_config_instance')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();

1

Với câu trả lời nhân bản trường drush ở trên, bạn có thể thực hiện bước MySQL cuối cùng với Drush (ví dụ D7):

drush sql-query "INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field"

drush sql-query "INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field"

0

Nếu bạn không muốn tìm hiểu thêm về mysql, bạn có thể thử tập lệnh drush tôi đã viết có tên là sao chép giá trị trường.

Bạn sẽ cần thiết lập trường mới của mình trước rồi gọi

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

Điều này sẽ di chuyển dữ liệu hiện có sang trường mới sau khi xóa xong trường cũ.



-3

Xuất tệp SQL của cơ sở dữ liệu của bạn, sử dụng dòng lệnh sedđể thay thế tất cả các lần xuất hiện của thuật ngữ để thay đổi và nhập lại cơ sở dữ liệu của bạn.


1
Đánh giá thấp nhận xét của bạn vì cách tiếp cận này sẽ tàn phá cài đặt Drupal của bạn vì có một vài vị trí trong cơ sở dữ liệu có tên trường được xê-ri hóa. Để biết thêm thông tin về điều này, hãy xem các bình luận từ @CharlieS (và những người khác) dưới câu trả lời được chấp nhận ở trên.
hargobind
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.