생성 된 필드의 시스템 이름을 변경하는 방법


18

필드 이름을 입력하는 동안 간격을 두었습니다. 이제 기계 이름이 내가 원하는 것이 아닙니다. 나는 그것이 단지 성가심이라는 것을 알고 있습니다. 그러나 필드가 만들어지면 필드의 컴퓨터 이름을 변경할 수있는 방법이 있는지 궁금합니다.

나는 이것이 내 질문의 두 번째 부분으로 인도한다고 가정한다. 필드를 만들었고 더 이상 사용하지 않는 경우 필드를 삭제하거나 데이터베이스에서 수행해야하거나 UI 어딘가에서 수행 할 수 있습니까?

답변:


15

즉, 컴퓨터 이름을 변경할 수 없습니다. 이론적으로는 가능하지만 데이터베이스에 약간의 혼란이 필요합니다. 방금 필드를 만든 경우 필드를 제거하고 새 필드를 만드는 것이 훨씬 쉽습니다.

기본적으로 field_config및의 모든 항목 이름을 바꾸는 field_config_instance것이지만 필드를 사용하기 시작하면 시스템 이름이 100 개의 다른 위치에 저장됩니다. 보기 설정, 패널 설정, 기능 등을 살펴본 후 변경하는 것은 재미 있지 않습니다 .

필드 삭제는에서 수행 admin/structure/types/manage/[machine_name_of_content_type]/fields할 수 있습니다 . 모든 콘텐츠 유형 의 ' 필드 관리 '탭을 통해 액세스 할 수 있습니다 .


그러나 필드가 여전히 데이터베이스에 남아 있지는 않습니다. 예를 들어, popper 이름으로 새 필드를 만들었지 만 콘텐츠 형식에 새 필드를 추가하면 이전 필드 이름이 여전히 옵션으로 나타납니다. 아마도 필드가 어떻게 작동하는지 정확히 이해하지 못할 수도 있습니다.
user379468

1
내가 많이 조사하지 않은 기능이 있는데, 시간이 지남에 따라 필드와 그 내용을 삭제합니다. 그 이유는 수천 개의 항목이있는 필드를 삭제할 때 사이트가 중단되는 것을 방지하기 위함입니다. 필드가 어디에도 사용되지 않으면 다음 cron 실행에서 사라질 것으로 예상됩니다.
Letharion

사이트 코드 및 데이터베이스 덤프에서 sed -i -es / old_field / new_field /를 시도했습니다. 불행히도, 문제가 발생하여 덤프 복원 사이트가 고장난 후. 올바른 방법으로 생각하는 아이디어가 있습니까?
Dmitry Vyal

1
@Dmitry Vyal : 필드 이름은 직렬화 된 배열의 몇 군데에 저장됩니다. 한 문자열을 다른 길이의 다른 문자열로 바꾸면 배열의 unserialize ()가 중단되고 다음 부트 스트랩 또는 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 * FROM field_data_field_my_field; INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field;
joelpittet

"drush field-clone"명령이 있는지 몰랐습니다! 최고 :)
Lovau

뷰, 패널 등은 어떻습니까? 수동 수정?
zkent

만약 당신이 drush를 사용한다면 당신은 direclty를 사용하여 필드를 삭제할 수 drush field-delete xxx있으며 당신은 또한 drush sql-queryneubreed가 제안한 것처럼 할 수 있습니다 . @zkent, 기존 뷰, 패널 등에서 새 필드를 다시 연결해야합니다.
xaa


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

([NEW MACHNIE NAME] 및 [OLD MACHINE NAME]을로 교체 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 필드 클론 응답을 사용하면 Drush를 사용하여 마지막 MySQL 단계를 수행 할 수도 있습니다 (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"



-3

데이터베이스의 SQL 파일을 sed내보내고 명령 행 을 사용하여 변경하려는 모든 용어를 바꾸고 데이터베이스를 다시 가져 오십시오.


1
필드 이름이 PHP로 직렬화되는 데이터베이스에는 몇 개의 위치가 있기 때문에이 방법은 Drupal 설치에 혼란을주기 때문에 귀하의 의견을 줄였습니다. 이에 대한 자세한 내용은 위의 허용 된 답변 아래 @CharlieS (및 기타)의 의견을 참조하십시오.
hargobind 14
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.