필드 이름을 입력하는 동안 간격을 두었습니다. 이제 기계 이름이 내가 원하는 것이 아닙니다. 나는 그것이 단지 성가심이라는 것을 알고 있습니다. 그러나 필드가 만들어지면 필드의 컴퓨터 이름을 변경할 수있는 방법이 있는지 궁금합니다.
나는 이것이 내 질문의 두 번째 부분으로 인도한다고 가정한다. 필드를 만들었고 더 이상 사용하지 않는 경우 필드를 삭제하거나 데이터베이스에서 수행해야하거나 UI 어딘가에서 수행 할 수 있습니까?
필드 이름을 입력하는 동안 간격을 두었습니다. 이제 기계 이름이 내가 원하는 것이 아닙니다. 나는 그것이 단지 성가심이라는 것을 알고 있습니다. 그러나 필드가 만들어지면 필드의 컴퓨터 이름을 변경할 수있는 방법이 있는지 궁금합니다.
나는 이것이 내 질문의 두 번째 부분으로 인도한다고 가정한다. 필드를 만들었고 더 이상 사용하지 않는 경우 필드를 삭제하거나 데이터베이스에서 수행해야하거나 UI 어딘가에서 수행 할 수 있습니까?
답변:
즉, 컴퓨터 이름을 변경할 수 없습니다. 이론적으로는 가능하지만 데이터베이스에 약간의 혼란이 필요합니다. 방금 필드를 만든 경우 필드를 제거하고 새 필드를 만드는 것이 훨씬 쉽습니다.
기본적으로 field_config
및의 모든 항목 이름을 바꾸는 field_config_instance
것이지만 필드를 사용하기 시작하면 시스템 이름이 100 개의 다른 위치에 저장됩니다. 보기 설정, 패널 설정, 기능 등을 살펴본 후 변경하는 것은 재미 있지 않습니다 .
필드 삭제는에서 수행 admin/structure/types/manage/[machine_name_of_content_type]/fields
할 수 있습니다 . 모든 콘텐츠 유형 의 ' 필드 관리 '탭을 통해 액세스 할 수 있습니다 .
내 절차는 drush를 사용하여 필드를 먼저 복제 한 다음 DB 쿼리를 사용하여 필드 데이터를 새 필드 테이블에 복사하는 것입니다. 복제 된 필드의 내용을 확인한 후 원래 필드를 삭제합니다.
필자는 복제 필드의 drush 방법이 항상 내가 직접 만들 수있는 복제 코드만큼 신뢰할 수 있고 데이터 복사 쿼리가 매우 간단하고 원본을 삭제하기 전에 새 필드를 확인해야한다고 생각하기 때문에 이렇게합니다. .
drush field-clone field_my_field field_my_field_clone
field_my_field_clone
예 :INSERT field_my_field_clone SELECT * FROM field_my_field;
field_my_field_clone
.admin/structure/types/manage/my-content-type/fields
drush field-delete xxx
있으며 당신은 또한 drush sql-query
neubreed가 제안한 것처럼 할 수 있습니다 . @zkent, 기존 뷰, 패널 등에서 새 필드를 다시 연결해야합니다.
Drupal 7에서는 Field Rename 모듈을 사용할 수 있습니다 . Drupal 6에서는 CCK 필드 이름 변경 모듈을 사용할 수 있습니다 .
실제로 새 컴퓨터 이름으로 새 필드와 인스턴스를 만들고 모든 이전 필드 데이터를 새 필드에 복사하고 마지막으로 이전 인스턴스를 삭제하는 업데이트 스크립트를 작성했습니다.
// 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);
방금이 작업을 수행해야했지만 너무 어렵지는 않지만 사이트는 매우 간단합니다.
이 시도:
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
([NEW MACHNIE NAME] 및 [OLD MACHINE NAME]을로 교체 field_your_field_names
)
/admin/reports/fields/views-fields
// 필드 스토리지 테이블 이름을 변경합니다. 여기에서 이전 테이블의 이름을 새 이름으로 변경합니다.
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();
mysql에서 바이올린을 피하고 싶지 않다면 Field value copy라고 쓴 drush 스크립트를 사용해 볼 수 있습니다.
새 필드를 먼저 설정 한 다음 전화해야합니다.
drush fieldcopy OLDFIELDNAME NEWFIELDNAME
이전 필드를 삭제하면 기존 데이터가 새 필드로 이동합니다.
db_change_field () 함수를 사용하면 도움이 될 수 있습니다.
데이터베이스의 SQL 파일을 sed
내보내고 명령 행 을 사용하여 변경하려는 모든 용어를 바꾸고 데이터베이스를 다시 가져 오십시오.