Eu defini uma vez para um site um limite de comprimento para um campo. E agora o cliente deseja colocar mais caracteres nesse campo.
Não consigo alterar o tamanho máximo do Drupal porque recebo a seguinte mensagem de erro:
Existem dados para este campo no banco de dados. As configurações de campo não podem mais ser alteradas.
No entanto, deve haver uma solução. Devo alterá-lo no banco de dados (o campo é implementado pelo módulo de coleções de campos )?
Respostas:
A solução Dylan Tack é a mais fácil, mas pessoalmente gosto de explorar as alas internas do banco de dados do Drupal para ver como as coisas são gerenciadas lá em baixo.
Portanto, supondo que você tenha um campo de texto cujo nome da máquina seja field_text de 10 caracteres, você deseja aumentar para 25:
Agora vamos fazer uma pequena cirurgia cardíaca.
Altere as definições das colunas das tabelas de dados:
Altere a coluna de definição , essa é muito complicada porque está armazenada em um BLOB , mas isso não é algo que o impedirá de fazer isso.
Esta é uma matriz serializada PHP , a parte interessante é que
s:10:"max_length";s:2:"10";
isso significa que essa matriz possui uma propriedade denominadamax_length
(cujo nome é uma sequência de 10 caracteres - daí o "s") cujo valor é 10 (que é uma sequência de 2 caracteres). É bem fácil, não é?Alterar seu valor é tão fácil quanto substituir a
s:2:"10"
peças:2:"25"
. Cuidado: se o seu novo valor for maior, você precisará adaptar a parte "s", por exemplo, colocar 100 será os:3:"100"
comprimento de 100 ser 3.Vamos colocar esse novo valor de volta no banco de dados, não esqueça de manter toda a string.
???
LUCRO!
A propósito, o PhpMyAdmin possui algumas configurações para permitir a modificação direta de colunas BLOB , mas por que seguir o caminho mais fácil?
PS: Isso também pode salvar sua vida ao colocar algum código PHP em visualizações e obter um WSOD devido a um erro no seu código.
fonte
ALTER TABLE
nãoSELECT TABLE
. Além disso, você pode torná-lo mais limpo como:ALTER TABLE field_data_field_text MODIFY field_text_value
... (MODIFY é como mudar quando você não quiser alterar o nome E você não..)fonte
Isso parece ser uma limitação do módulo de texto atual. text_field_settings_form () tem este comentário: " @todo : Se $ has_data, adicione um manipulador de validação que permita apenas que max_length aumente.".
Como solução temporária, você pode comentar
'#disabled' => $has_data
em modules / field / modules / text / text.module, na linha 77.Não foi possível encontrar um problema existente para este caso específico, mas você pode mencioná-lo no # 372330 .
fonte
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
também precisa comentar o L282modules/field/modules/field_sql_storage/field_sql_storage.module
.core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
que lançam exceções com o texto "O armazenamento SQL não pode alterar o esquema de um campo existente". Sobre as linhas 1312 e 1403.Drupal 7
Fonte: http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
Drupal 8
Aqui está a versão da mesma função proposta por @Christopher :
fonte
drush updb --entity-updates
os campos em que executamos essa função, seria marcado como exigindo uma atualização. Ele tentaria atualizar o esquema do campo novamente no mysql. Para nós, isso falharia, pois já havia dados de campo. Isso impedia a execução de outras tarefas de atualização.Tente isso ... isso atualizará o tipo de dados do campo de TEXT para LONG_TEXT e atualizará
max_length
de 4000 para o tamanho máximo do texto longo ... espero que isso ajude.fonte
D8
core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
que lançam exceções com o texto "O armazenamento SQL não pode alterar o esquema de um campo existente". Sobre as linhas 1312 e 1403./admin/config/development/configuration/single/export
. O tipo de configuração é "Armazenamento em campo" e escolha o campo em questão. Copie a configuração./admin/config/development/configuration/single/import
. . O tipo de configuração é "Armazenamento em campo". Cole a configuração. Mude o comprimento.Observe (como você provavelmente já sabe), se você diminuir o tamanho, os dados existentes serão truncados.
fonte
No Drupal 7, fiz modificações em 2 tabelas no phpmyadmin e atualizei o cache.
fonte