Jak zmienić nazwę komputera pola po jego utworzeniu

18

Podczas wpisywania nazwy pola rozdzieliłem się i teraz nazwa maszyny nie jest taka, jak chciałem. Wiem, że to tylko irytacja. ale zastanawiam się, czy istnieje jakiś sposób na zmianę nazwy maszyny pola po jego utworzeniu.

Przypuszczam, że prowadzi mnie to do drugiej części mojego pytania. jeśli utworzyłem pole i nie jest ono już używane, jak mogę je usunąć, czy trzeba to zrobić z bazy danych, czy można to zrobić gdzieś w interfejsie użytkownika.

użytkownik379468
źródło

Odpowiedzi:

15

Krótko mówiąc, nie można zmienić nazwy komputera. Teoretycznie jest to oczywiście możliwe, ale będzie wymagało sporo bałaganu w bazie danych. Jeśli dopiero co utworzyłeś pole, znacznie łatwiej je usunąć i utworzyć nowe.

Podstawą byłaby zmiana nazwy wszystkich pozycji field_configi field_config_instance, ale jak tylko zaczniesz korzystać z pola, nazwy komputerów zostaną zapisane w stu różnych miejscach. Widoki config, Panele config, funkcje i więcej, a wtedy, zmieniając go to nie zabawa.

Usuwanie pól można wykonać w:, do admin/structure/types/manage/[machine_name_of_content_type]/fieldsktórego można przejść za pomocą karty „ Zarządzaj polami ” dowolnego typu zawartości.

Letharion
źródło
Ale czy pola nie pozostają w bazie danych, na przykład utworzyłem nowe pole z nazwą poppera, ale kiedy idę dodać nowe pole do typu zawartości, stara nazwa pola nadal pojawia się jako opcja ... Być może nie rozumiem dokładnie, jak działają pola.
user379468,
1
Istnieje funkcja, której nie zbadałem zbyt wiele, która z czasem usuwa pola i ich zawartość. Powodem jest zapobieganie zatrzymywaniu się witryny podczas usuwania pól z tysiącami wpisów. Jeśli pole nie jest nigdzie używane, oczekiwałbym, że zniknie przy następnym uruchomieniu crona.
Letharion
Próbowałem zrobić sed -i -es / old_field / new_field / na kodzie strony i zrzucie bazy danych. Niestety coś poszło nie tak i po przywróceniu miejsca zrzutu nie działało poprawnie. Wszelkie pomysły, jak to zrobić we właściwy sposób?
Dmitry Vyal
1
@Dmitry Vyal: Nazwa pola jest przechowywana w kilku miejscach w szeregowej tablicy - zastąpienie jednego łańcucha innym łańcuchem o innej długości przerwałoby unserialize () tablicy i prawdopodobnie przerwałoby następny bootstrap lub Drupal.
Charlie Schliesser
@Charlie S: Dzięki, zajmę się tym w przyszłości.
Dmitry Vyal
16

Moja procedura polega na użyciu drush, aby najpierw sklonować pole, a następnie skopiować dane pola z zapytaniami DB do nowej tabeli pól. Po zweryfikowaniu zawartości sklonowanego pola usuwam oryginalne pole.

Robię to w ten sposób, ponieważ uważam, że metoda dronowania klonowania pól zawsze będzie co najmniej tak niezawodna, jak każdy kod do klonowania, który sam stworzę, zapytanie o kopię danych jest dość proste i muszę sprawdzić nowe pole przed usunięciem oryginalnego .

  1. drush field-clone field_my_field field_my_field_clone
  2. Wstaw wiersze field_my_field_clone, np.INSERT field_my_field_clone SELECT * FROM field_my_field;
  3. Sprawdź zawartość field_my_field_clone.
  4. Usuń pole za pomocą interfejsu użytkownika, np. admin/structure/types/manage/my-content-type/fields
klucz
źródło
1
To jest świetne! Dla 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
Nie wiedziałem, że istnieje polecenie „drush field-clone”! Niesamowite :)
Lovau,
Co z widokami, panelami itp.? Ręczne poprawki?
zkent
jeśli korzystasz z drush, możesz bezpośrednio usunąć pole za pomocą drush field-delete xxxi możesz również polubić, drush sql-queryjak sugeruje neubreed. @zkent, będziesz musiał ponownie połączyć nowe pole w istniejących widokach, panelach itp.
xaa
6

Napisałem skrypt aktualizacji, który faktycznie tworzy nowe pole i instancję z nową nazwą komputera, kopiuje wszystkie stare dane pola do nowej i na koniec usuwa starą instancję.

// 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);
Елин Й.
źródło
2

Po prostu musiałem to zrobić i uznałem, że nie jest to zbyt trudne, ale moja strona jest dość prosta.

Spróbuj tego:

  1. Utwórz nowe pole o właściwej nazwie.
  2. Uruchom następujące zapytania w 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

(zamień [NEW MACHNIE NAME] i [OLD MACHINE NAME] z field_your_field_names)

  1. Zaktualizuj wszystkie związane z tym widoki, aby korzystać z nowego pola i wszystkich innych modułów wskazujących na to konkretne pole (w tym miejscu sytuacja może stać się brzydka, jeśli witryna jest skomplikowana). Tutaj możesz zobaczyć wszystkie widoki wykorzystujące stare pole:/admin/reports/fields/views-fields
  2. Wyczyść pamięć podręczną witryny
tmsimont
źródło
2

// Zmień nazwy tabeli przechowywania pól. Tutaj zmieniamy nazwę starej tabeli na nową.

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

// Zmień nazwy pól w tabelach field_config i 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();
ankieta sneha
źródło
1

Z powyższą odpowiedzią na drush field-klon możesz zrobić ostatni krok MySQL z Drush również (przykład 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"
neubreed
źródło
0

Jeśli nie chcesz się bawić w mysql, możesz wypróbować napisany przeze mnie skrypt drush o nazwie Field value copy.

Najpierw musisz skonfigurować nowe pole, a następnie zadzwonić

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

Spowoduje to przeniesienie istniejących danych do nowego pola. Po zakończeniu usuń stare pole.

Pontus Nilsson
źródło
-3

Wyeksportuj plik SQL bazy danych, użyj wiersza polecenia, sedaby zastąpić wszystkie wystąpienia terminu do zmiany, i ponownie zaimportuj bazę danych.

gvi
źródło
1
Zanotowałem swój komentarz, ponieważ takie podejście spowoduje spustoszenie w instalacji Drupala, ponieważ w bazie danych jest kilka miejsc, w których nazwy pól są serializowane w PHP. Aby uzyskać więcej informacji na ten temat, zobacz komentarze @CharlieS (i innych) pod zaakceptowaną odpowiedzią powyżej.
hargobind