Ustawiłem kiedyś na stronie internetowej limit długości pola. A teraz klient chce umieścić więcej znaków w tym polu.
Nie mogę zmienić maksymalnego rozmiaru z Drupala, ponieważ pojawia się następujący komunikat o błędzie:
W tym polu znajdują się dane dla tego pola. Ustawienia pola nie mogą być już zmieniane.
Jednak musi być rozwiązanie. Czy powinienem to zmienić w bazie danych (pole jest zaimplementowane przez moduł Field-collections )?
Odpowiedzi:
Rozwiązanie Dylan Tack jest najłatwiejsze, ale osobiście lubię odkrywać wewnętrzne totemy bazy danych Drupala, aby zobaczyć, jak tam są zarządzane.
Zakładając, że masz pole tekstowe, którego nazwa maszyny to tekst_tekstowy zawierający 10 znaków, które chcesz zwiększyć do 25:
Teraz zróbmy małą operację serca.
Zmień definicje kolumn tabel danych:
Zmień kolumnę definicji , ta jest bardzo trudna, ponieważ jest przechowywana w BLOBIE , ale to nie jest coś, co powstrzyma cię przed zrobieniem tego.
Jest to szeregowa tablica PHP , co ciekawe
s:10:"max_length";s:2:"10";
, oznacza to, że tablica ma właściwość o nazwiemax_length
(której nazwa to ciąg 10 znaków - stąd „s”), której wartość wynosi 10 (czyli ciąg 2 znaków). To całkiem proste, prawda?Zmiana jego wartości jest tak prosta, jak wymiana
s:2:"10"
części przezs:2:"25"
. Uważaj: jeśli twoja nowa wartość jest dłuższa, musisz dostosować część „s”, na przykład wstawienie 100 będzie równe 100,s:3:"100"
gdy długość wynosi 3.Umieśćmy tę nową wartość z powrotem w DB, nie zapomnij zachować całego łańcucha.
???
ZYSK!
Nawiasem mówiąc, PhpMyAdmin ma pewne ustawienia pozwalające na bezpośrednią modyfikację kolumn BLOB , ale dlaczego iść w prosty sposób?
PS: Może to również uratować Ci życie, gdy umieszczasz jakiś kod PHP w widokach i otrzymujesz WSOD z powodu błędu w kodzie.
źródło
ALTER TABLE
nie”SELECT TABLE
. Możesz też uczynić go czystszym, jak:ALTER TABLE field_data_field_text MODIFY field_text_value
... (MODYFIKUJ jest jak ZMIANA, gdy nie chcesz zmieniać nazwy . A ty nie.)źródło
Wydaje się, że jest to ograniczenie bieżącego modułu tekstowego. text_field_settings_form () ma następujący komentarz: „ @todo : Jeśli $ has_data, dodaj poprawny moduł obsługi, który pozwala tylko na zwiększenie maksymalnej długości.”.
Aby tymczasowo obejść ten
'#disabled' => $has_data
problem, możesz komentować w module / field / modules / text / text.module, wokół linii 77.Nie mogłem znaleźć istniejącego problemu dla tego konkretnego przypadku, ale możesz wspomnieć o nim na # 372330 .
źródło
Attempt to update field Serial No failed: field_sql_storage cannot change the schema for an existing field with data..
FieldUpdateForbiddenException: cannot change the schema for an existing field with data
musisz również skomentować L282modules/field/modules/field_sql_storage/field_sql_storage.module
.core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
tym wyjątku wyrzucenia tekstem „Pamięć SQL nie może zmienić schematu dla istniejącego pola”. O liniach 1312 i 1403.Drupal 7
Źródło: http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
Drupal 8
Oto wersja tej samej funkcji zaproponowanej przez @Christopher :
źródło
drush updb --entity-updates
pól, które przeszliśmy przez tę funkcję, oznaczono by jako wymagające aktualizacji. Następnie spróbuje ponownie zaktualizować schemat pola w mysql. Dla nas to się nie powiedzie, ponieważ były tam już dane z pola. Zapobiegało to uruchomieniu innych zadań aktualizacji.Spróbuj ... zaktualizuje to typ danych pola z TEKSTU na DŁUGI_TEKST i zaktualizuje
max_length
tekst z 4000 do maksymalnej długości tekstu ... mam nadzieję, że to pomoże.źródło
D8
core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
tego wyjątku z tekstem „Pamięć SQL nie może zmienić schematu dla istniejącego pola”. O liniach 1312 i 1403./admin/config/development/configuration/single/export
. Typ konfiguracji to „Pamięć pola” i wybierz odpowiednie pole. Skopiuj konfigurację./admin/config/development/configuration/single/import
. . Typ konfiguracji to „Storage Field”. Wklej konfigurację. Zmień długość.Uwaga (jak zapewne już wiesz), jeśli skrócisz długość, istniejące dane zostaną obcięte.
źródło
W Drupal 7 dokonałem modyfikacji 2 tabel w phpmyadmin i odświeżyłem pamięć podręczną.
źródło