He establecido una vez en un sitio web un límite de longitud a un campo. Y ahora el cliente quiere poner más personajes en ese campo.
No puedo cambiar el tamaño máximo de Drupal porque recibo el siguiente mensaje de error:
Hay datos para este campo en la base de datos. La configuración del campo ya no se puede cambiar.
Sin embargo, debe haber una solución. ¿Debo cambiarlo en la base de datos (el campo es uno implementado por el módulo Field-collections )?
Respuestas:
La solución Dylan Tack es la más fácil, pero personalmente disfruto explorando los barrios internos de la base de datos de Drupal para ver cómo se manejan las cosas allí.
Entonces, suponiendo que tiene un campo de texto cuyo nombre de máquina es field_text de 10 caracteres que desea aumentar a 25:
Ahora hagamos una pequeña cirugía de corazón.
Modifique las definiciones de columnas de las tablas de datos:
Cambie la columna de definición , esta es muy complicada porque está almacenada en un BLOB , pero eso no es algo que lo detenga por hacerlo.
Esta es una matriz serializada de PHP , lo interesante es que
s:10:"max_length";s:2:"10";
significa que esta matriz tiene una propiedad llamadamax_length
(cuyo nombre es una cadena de 10 caracteres, de ahí la "s") cuyo valor es 10 (que es una cadena de 2 caracteres). Es bastante fácil, ¿no?Cambiar su valor es tan fácil como reemplazar la
s:2:"10"
pieza pors:2:"25"
. Tenga cuidado: si su nuevo valor es más largo, debe adaptar la parte "s", por ejemplo, poner 100 serás:3:"100"
como 100 longitud es 3.Volvamos a poner este nuevo valor en la base de datos, no olvides mantener toda la cadena.
???
¡LUCRO!
Por cierto, PhpMyAdmin tiene alguna configuración para permitir la modificación directa de las columnas BLOB , pero ¿por qué seguir el camino fácil?
PD: Esto también puede salvarle la vida al poner un código PHP en las vistas y obtener un WSOD debido a un error en su código.
fuente
ALTER TABLE
noSELECT TABLE
. Además, puede hacerlo más limpio como:ALTER TABLE field_data_field_text MODIFY field_text_value
... (MODIFICAR es como CAMBIAR cuando no desea cambiar el nombre . Y no lo hace.)fuente
Esto parece ser una limitación del módulo de texto actual. text_field_settings_form () tiene este comentario: " @todo : Si $ has_data, agregue un controlador de validación que solo permita que aumente la longitud máxima".
Como solución temporal, puede comentar
'#disabled' => $has_data
en modules / field / modules / text / text.module, alrededor de la línea 77.No pude encontrar un problema existente para este caso específico, pero podría mencionarlo en el # 372330 .
fuente
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
también necesita comentar L282modules/field/modules/field_sql_storage/field_sql_storage.module
.core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
excepciones de lanzamiento con el texto "El almacenamiento SQL no puede cambiar el esquema de un campo existente". Acerca de las líneas 1312 y 1403.Drupal 7
Fuente: http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
Drupal 8
Aquí está la versión de la misma función propuesta por @Christopher :
fuente
drush updb --entity-updates
los campos que ejecutamos a través de esta función, se marcaría como una actualización. Luego intentaría actualizar el esquema de campo nuevamente en mysql. Para nosotros, esto fallaría ya que ya había datos de campo allí. Esto impedía que se ejecutaran otras tareas de actualización.Pruebe esto ... esto actualizará el tipo de datos de campo de TEXT a LONG_TEXT y actualizará la
max_length
longitud de texto de 4000 a la longitud máxima de texto ... espero que esto ayude.fuente
D8
core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
excepciones de lanzamiento con el texto "El almacenamiento SQL no puede cambiar el esquema de un campo existente". Sobre las líneas 1312 y 1403./admin/config/development/configuration/single/export
. El tipo de configuración es "Almacenamiento de campo" y elija el campo en cuestión. Copia la configuración./admin/config/development/configuration/single/import
. . El tipo de configuración es "Almacenamiento de campo". Pega la configuración. Cambia la longitud.Nota (como probablemente ya sepa), si acorta la longitud, los datos existentes se truncarán.
fuente
En Drupal 7, realicé modificaciones en 2 tablas en phpmyadmin y actualicé el caché.
fuente