ฉันจะเปลี่ยนชื่อเครื่องของเขตข้อมูลได้อย่างไรเมื่อสร้างแล้ว


18

ฉันเว้นระยะขณะที่พิมพ์ชื่อฟิลด์และตอนนี้ชื่อเครื่องไม่ใช่สิ่งที่ฉันต้องการให้เป็น ฉันรู้ว่ามันเป็นเรื่องน่ารำคาญ แต่ฉันสงสัยว่าจะมีวิธีในการเปลี่ยนชื่อเครื่องของฟิลด์เมื่อสร้างขึ้นหรือไม่

ฉันคิดว่าสิ่งนี้ทำให้ฉันเข้าไปในส่วนที่สองของคำถามของฉัน ถ้าฉันสร้างเขตข้อมูลและไม่ได้ใช้งานอีกต่อไปฉันจะลบทิ้งได้อย่างไรจะต้องทำสิ่งนี้จากฐานข้อมูลหรือจะทำที่ใดที่หนึ่งใน UI ได้

คำตอบ:


15

กล่าวโดยย่อคุณไม่สามารถเปลี่ยนชื่อเครื่องได้ ในทางทฤษฎีเห็นได้ชัดว่าเป็นไปได้ แต่จะต้องค่อนข้างยุ่งกับฐานข้อมูล หากคุณเพิ่งสร้างเขตข้อมูลมันจะง่ายกว่าที่จะเอาออกและสร้างขึ้นใหม่

พื้นฐานจะเปลี่ยนชื่อรายการทั้งหมดในfield_configและfield_config_instanceแต่ทันทีที่คุณเริ่มใช้ฟิลด์ชื่อเครื่องจะถูกเก็บไว้ในที่ต่างๆ ชมการตั้งค่า, จอการตั้งค่า, คุณสมบัติและมากขึ้นและจากนั้นเปลี่ยนมันเป็นไม่สนุก

การลบฟิลด์สามารถทำได้ใน: admin/structure/types/manage/[machine_name_of_content_type]/fieldsซึ่งคุณสามารถเข้าถึงผ่านแท็บ" จัดการฟิลด์ " ในประเภทเนื้อหาใด ๆ


แต่ฟิลด์ไม่ยังคงอยู่ในฐานข้อมูลตัวอย่างเช่นฉันสร้างฟิลด์ใหม่ด้วยชื่อ popper อย่างไรก็ตามเมื่อฉันไปเพิ่มฟิลด์ใหม่ให้กับประเภทเนื้อหาชื่อฟิลด์เก่าจะยังคงปรากฏเป็นตัวเลือก .. บางทีฉันอาจไม่เข้าใจวิธีการทำงานของทุ่งอย่างแน่นอน
379468

1
มีฟังก์ชั่นการใช้งานที่ฉันไม่ได้ตรวจสอบมากนักซึ่งจะลบฟิลด์และเนื้อหาในช่วงเวลาหนึ่ง เหตุผลคือเพื่อป้องกันไม่ให้เว็บไซต์บดขยี้การหยุดชะงักเมื่อลบเขตข้อมูลที่มีหลายพันรายการ หากไม่มีการใช้สนามใดผมคาดว่ามันจะหายไปในการวิ่ง cron ครั้งต่อไป
Letharion

ฉันพยายามทำ sed -i -es / old_field / new_field / ในรหัสไซต์และการถ่ายโอนฐานข้อมูล น่าเสียดายที่มีบางอย่างผิดปกติและหลังจากไซต์การคืนค่าถ่ายโอนข้อมูลทำงานผิดปกติ ความคิดใด ๆ วิธีที่จะทำอย่างถูกต้อง?
Dmitry Vyal

1
@Dmitry Vyal: ชื่อเขตข้อมูลจะถูกเก็บไว้ในสถานที่ไม่กี่แห่งในอาร์เรย์แบบอนุกรม - การแทนที่หนึ่งสตริงด้วยสตริงอื่นที่มีความยาวแตกต่างกันจะทำให้ unserialize () ของอาเรย์นั้นแตกและอาจแตก bootstrap หรือ Drupal ต่อไป
Charlie Schliesser

@ Charlie S: ขอบคุณจะดูแลมันในอนาคต
Dmitry Vyal

16

ขั้นตอนของฉันคือการใช้ Drush เพื่อโคลนฟิลด์ก่อนจากนั้นคัดลอกข้อมูลภาคสนามด้วยการสืบค้น DB ลงในตารางฟิลด์ใหม่ หลังจากที่ฉันตรวจสอบเนื้อหาของสนามโคลนฉันจะลบสนามเดิม

ฉันทำอย่างนี้เพราะฉันคิดว่าวิธีการ drush ของการโคลนฟิลด์จะมีความน่าเชื่อถือเท่ากับรหัสการโคลนใด ๆ ที่ฉันอาจสร้างขึ้นเองแบบสอบถามการคัดลอกข้อมูลค่อนข้างง่ายและฉันจะตรวจสอบฟิลด์ใหม่ก่อนที่จะลบต้นฉบับ .

  1. drush field-clone field_my_field field_my_field_clone
  2. แทรกแถวเข้าไปfield_my_field_cloneเช่นINSERT field_my_field_clone SELECT * FROM field_my_field;
  3. field_my_field_cloneตรวจสอบเนื้อหาของ
  4. ลบฟิลด์โดยใช้ UI เช่น admin/structure/types/manage/my-content-type/fields

1
มันเยี่ยมมาก! สำหรับ D7: INSERT field_data_field_my_field_clone SELECT * จาก field_data_field_my_field INSERT field_revision_field_my_field_clone เลือก * จาก field_revision_field_my_field;
joelpittet

ฉันไม่รู้ว่ามีคำสั่ง "drush field-clone"! ดีเลิศ :)
Lovau

แล้วมุมมองพาเนลและอื่น ๆ ล่ะ? แก้ไขด้วยตนเองหรือไม่
zkent

หากคุณกำลังใช้ drush คุณสามารถลบฟิลด์ด้วย drush field-delete xxxและคุณอาจชอบdrush sql-queryตามที่แนะนำโดย neubreed @zkent คุณจะต้องเชื่อมโยงฟิลด์ใหม่ในมุมมองพาเนลและอื่น ๆ ที่มีอยู่
xaa

10

ใน Drupal 7 คุณสามารถใช้โมดูลField Rename ใน Drupal 6 คุณสามารถใช้โมดูลการเปลี่ยนชื่อฟิลด์ CCK


1
ขณะนี้มีโมดูล Drupal 7 เวอร์ชันนี้ที่drupal.org/project/field_rename
Darrell Duane

มันได้ผล. เพียงจำไว้ว่าให้ใช้ความยาวชื่อต่ำกว่าค่าสูงสุด
Francisco Corrales Morales

6

ฉันเขียนสคริปต์การอัปเดตซึ่งสร้างฟิลด์และอินสแตนซ์ใหม่ด้วยชื่อเครื่องใหม่คัดลอกข้อมูลฟิลด์เก่าทั้งหมดไปยังใหม่และสุดท้ายลบอินสแตนซ์เก่า

// 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

ฉันต้องทำสิ่งนี้และพบว่าไม่ยากเกินไป แต่เว็บไซต์ของฉันค่อนข้างเรียบง่าย

ลองสิ่งนี้:

  1. สร้างเขตข้อมูลใหม่ด้วยชื่อที่ถูกต้อง
  2. เรียกใช้แบบสอบถามเหล่านี้ใน 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

(สลับ [ชื่อ Machnie ใหม่] และ [ชื่อเครื่องจักรเก่า] ด้วยfield_your_field_names)

  1. อัปเดตมุมมองใด ๆ ที่เกี่ยวข้องเพื่อใช้ฟิลด์ใหม่และโมดูลอื่น ๆ ที่ชี้ไปที่ฟิลด์เฉพาะนั้น (นี่คือสิ่งที่อาจดูน่าเกลียดถ้าไซต์ของคุณซับซ้อน) คุณสามารถดูมุมมองใด ๆ ที่ใช้เขตข้อมูลเก่าของคุณได้ที่นี่:/admin/reports/fields/views-fields
  2. ล้างแคชของไซต์

2

// เปลี่ยนชื่อตารางที่จัดเก็บข้อมูลของฟิลด์ ที่นี่เรากำลังเปลี่ยนชื่อของตารางเก่าด้วยชื่อใหม่

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

// เปลี่ยนชื่อฟิลด์ในตาราง field_config และ 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

ด้วยคำตอบของ drush field-clone ด้านบนคุณสามารถทำขั้นตอน MySQL กับ Drush ได้เช่นกัน (ตัวอย่าง 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

หากคุณไม่ต้องการเล่นกลใน mysql คุณสามารถลองสคริปต์ drush ที่ฉันเขียนชื่อ Field value copy

คุณจะต้องตั้งค่าฟิลด์ใหม่ของคุณก่อนแล้วจึงโทร

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

การดำเนินการนี้จะย้ายข้อมูลที่มีอยู่ไปยังเขตข้อมูลใหม่เมื่อลบเขตข้อมูลเก่าแล้ว



-3

ส่งออกไฟล์ SQL ของฐานข้อมูลของคุณใช้บรรทัดคำสั่งsedเพื่อแทนที่คำที่เกิดขึ้นทั้งหมดเพื่อเปลี่ยนและนำเข้าฐานข้อมูลของคุณอีกครั้ง


1
Downvoted ความคิดเห็นของคุณเนื่องจากวิธีการนี้จะสร้างความเสียหายให้กับการติดตั้ง Drupal ของคุณเนื่องจากมีบางสถานที่ในฐานข้อมูลที่ชื่อเขตข้อมูลเป็น PHP ต่อเนื่อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้โปรดดูความคิดเห็นจาก @CharlieS (และอื่น ๆ ) ภายใต้คำตอบที่ยอมรับด้านบน
hargobind
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.