J'ai défini une fois sur un site Web une limite de longueur pour un champ. Et maintenant, le client veut mettre plus de caractères dans ce champ.
Je ne peux pas changer la taille maximale de Drupal car je reçois le message d'erreur suivant:
Il existe des données pour ce champ dans la base de données. Les paramètres de champ ne peuvent plus être modifiés.
Cependant, il doit y avoir une solution. Dois-je le changer dans la base de données (le champ est celui implémenté par le module Collections de champs )?
Réponses:
La solution Dylan Tack est la plus simple, mais personnellement, j'aime explorer les bases internes de la base de données de Drupal pour voir comment les choses se gèrent.
Donc, en supposant que vous ayez un champ de texte dont le nom d'ordinateur est field_text de 10 caractères, vous voulez passer à 25:
Faisons maintenant une petite opération du coeur.
Modifiez les définitions de colonnes des tables de données:
Changez la colonne de définition , celle-ci est très délicate car elle est stockée dans un BLOB , mais ce n'est pas quelque chose qui vous arrêtera pour cela.
Ceci est un tableau PHP sérialisé , la partie intéressante est
s:10:"max_length";s:2:"10";
, cela signifie que ce tableau a une propriété nomméemax_length
(dont le nom est une chaîne de 10 caractères - d'où le "s") dont la valeur est 10 (qui est une chaîne longue de 2 caractères). C'est assez facile, n'est-ce pas?Changer sa valeur est aussi simple que de remplacer la
s:2:"10"
pièce pars:2:"25"
. Attention: si votre nouvelle valeur est plus longue, vous devez adapter la partie "s", par exemple, mettre 100 sera égals:3:"100"
à 100, longueur 3.Remettons cette nouvelle valeur dans la base de données, n'oubliez pas de conserver la chaîne entière.
???
PROFIT!
Au fait, PhpMyAdmin a quelques réglages pour permettre la modification directe des colonnes de BLOB , mais pourquoi aller facilement?
PS: Cela peut aussi vous sauver la vie lorsque vous insérez du code PHP dans des vues et obtenez un WSOD à cause d’une erreur dans votre code.
la source
ALTER TABLE
nonSELECT TABLE
. En outre, vous pouvez le rendre plus propre comme:ALTER TABLE field_data_field_text MODIFY field_text_value
... (ACTUALISATION est comme le changement quand vous ne voulez pas changer le nom et vous ne..)la source
Cela semble être une limitation du module de texte actuel. text_field_settings_form () a ce commentaire: " @todo : Si $ has_data, ajoute un gestionnaire de validation qui autorise uniquement l'augmentation de max_length.".
En guise de solution de contournement temporaire, vous pouvez commenter
'#disabled' => $has_data
dans modules / field / modules / text / text.module, autour de la ligne 77.Je n'ai pas trouvé de problème existant pour ce cas spécifique, mais vous pouvez le mentionner sur # 372330 .
la source
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
vous devez également commenter L282modules/field/modules/field_sql_storage/field_sql_storage.module
.core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
cette exception avec le texte "Le stockage SQL ne peut pas changer le schéma d'un champ existant". À propos des lignes 1312 et 1403.Drupal 7
Source: http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
Drupal 8
Voici la version de la même fonction proposée par @Christopher :
la source
drush updb --entity-updates
nous avons rencontré des problèmes: lorsque vous exécutiez les champs que nous avons gérés via cette fonction, ils étaient marqués comme nécessitant une mise à jour. Il essaierait alors de mettre à jour le schéma de champ à nouveau dans mysql. Pour nous, cela échouerait car il y avait déjà des données de terrain. Cela empêchait l'exécution d'autres tâches de mise à jour.Essayez ceci ... cela mettra à jour le type de données de champ de TEXT à LONG_TEXT et mettra à jour la
max_length
longueur de texte allant de 4000 à la longueur maximale ... espérons que cela vous aidera.la source
D8
core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
cette exception avec le texte "Le stockage SQL ne peut pas changer le schéma d'un champ existant". À propos des lignes 1312 et 1403./admin/config/development/configuration/single/export
. Le type de configuration est "Stockage sur le terrain" et choisissez le champ en question. Copiez la configuration./admin/config/development/configuration/single/import
. . Le type de configuration est "Stockage sur le terrain". Collez la configuration. Changer la longueur.Remarque (comme vous le savez probablement déjà), si vous réduisez la longueur, les données existantes seront tronquées.
la source
Dans Drupal 7, j'ai apporté des modifications à 2 tables de phpmyadmin et actualisé le cache.
la source