Ich habe einmal für eine Website eine Längenbeschränkung für ein Feld festgelegt. Und jetzt möchte der Kunde mehr Zeichen in dieses Feld einfügen.
Ich kann die maximale Größe von Drupal nicht ändern, da die folgende Fehlermeldung angezeigt wird:
Es gibt Daten für dieses Feld in der Datenbank. Die Feldeinstellungen können nicht mehr geändert werden.
Es muss jedoch eine Lösung geben. Soll ich es in der Datenbank ändern (das Feld ein durch die implementierten Feld Sammlungen Modul)?
Antworten:
Die Lösung von Dylan Tack ist die einfachste, aber ich persönlich erkunde gerne die inneren Bereiche der Datenbank von Drupal, um zu sehen, wie die Dinge dort unten verwaltet werden.
Angenommen, Sie haben ein Textfeld, dessen Computername aus 10 Zeichen besteht, die Sie auf 25 erweitern möchten:
Jetzt machen wir eine kleine Herzoperation.
Ändern Sie die Definitionen der Datentabellenspalten:
Ändern Sie die Definitionsspalte . Diese Spalte ist sehr schwierig, da sie in einem BLOB gespeichert ist. Dies kann Sie jedoch nicht davon abhalten, dies zu tun.
Dies ist ein mit PHP serialisiertes Array. Der interessante Teil ist
s:10:"max_length";s:2:"10";
, dass dieses Array eine benannte Eigenschaft hatmax_length
(der Name ist eine 10-stellige Zeichenfolge - daher das "s"). Der Wert ist 10 (die eine 2-stellige Zeichenfolge ist). Es ist ziemlich einfach, nicht wahr?Das Ändern des Werts ist so einfach wie das Ersetzen des
s:2:"10"
Teils durchs:2:"25"
. Seien Sie vorsichtig: Wenn Ihr neuer Wert länger ist, müssen Sie den "s" -Teil anpassen. Wenn Sie beispielsweise 100 eingeben, ists:3:"100"
100 gleich 3.Setzen wir diesen neuen Wert in die DB zurück und vergessen Sie nicht, den gesamten String beizubehalten.
???
PROFITIEREN!
PhpMyAdmin hat übrigens einige Einstellungen, mit denen BLOB-Spalten direkt geändert werden können , aber warum sollten Sie den einfachen Weg wählen ?
PS: Dies kann Ihnen auch das Leben retten, wenn Sie PHP-Code in Views einfügen und aufgrund eines Fehlers in Ihrem Code eine WSOD erhalten.
quelle
ALTER TABLE
nicht heißenSELECT TABLE
. Sie können es auch sauberer machen wie:ALTER TABLE field_data_field_text MODIFY field_text_value
... (ÄNDERN ist wie ÄNDERN, wenn Sie den Namen nicht ändern möchten . Und Sie tun es nicht.)quelle
Dies scheint eine Einschränkung des aktuellen Textbausteins zu sein. text_field_settings_form () hat folgenden Kommentar: " @todo : Wenn $ has_data, fügen Sie einen Validate-Handler hinzu, der nur eine Erhöhung von max_length zulässt."
Als vorübergehende Problemumgehung können Sie
'#disabled' => $has_data
in modules / field / modules / text / text.module in Zeile 77 einen Kommentar abgeben.Ich konnte kein vorhandenes Problem für diesen speziellen Fall finden, aber Sie könnten es auf # 372330 erwähnen .
quelle
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
Sie auch L282 auskommentierenmodules/field/modules/field_sql_storage/field_sql_storage.module
.core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
diesen Ausnahmebedingungen mit dem Text "Der SQL-Speicher kann das Schema für ein vorhandenes Feld nicht ändern" auskommentieren. Über die Linien 1312 und 1403.Drupal 7
Quelle: http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
Drupal 8
Hier ist die von @Christopher vorgeschlagene Version derselben Funktion :
quelle
drush updb --entity-updates
die Felder, die wir mit dieser Funktion durchlaufen haben, als aktualisierungsbedürftig markiert wurden. Es würde dann versuchen, das Feldschema in mysql erneut zu aktualisieren. Für uns würde dies dann scheitern, da dort bereits Felddaten vorhanden waren. Dies verhinderte die Ausführung anderer Update-Aufgaben.Versuchen Sie dies ... dies aktualisiert den Felddatentyp von TEXT auf LONG_TEXT und die maximale Textlänge
max_length
von 4000 auf 4000. Ich hoffe, dies hilft.quelle
D8
core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
diesen Ausnahmebedingungen mit dem Text "Der SQL-Speicher kann das Schema für ein vorhandenes Feld nicht ändern". Über die Linien 1312 und 1403./admin/config/development/configuration/single/export
. Der Konfigurationstyp ist "Feldspeicher" und wählen Sie das betreffende Feld aus. Kopieren Sie die Konfiguration./admin/config/development/configuration/single/import
. . Der Konfigurationstyp ist "Feldspeicher". Fügen Sie die Konfiguration ein. Ändern Sie die Länge.Beachten Sie (wie Sie wahrscheinlich bereits wissen), dass vorhandene Daten abgeschnitten werden, wenn Sie die Länge verkürzen.
quelle
In Drupal 7 habe ich in phpmyadmin Änderungen an 2 Tabellen vorgenommen und den Cache aktualisiert.
quelle