Однажды я установил для веб-сайта ограничение на длину поля. И теперь клиент хочет добавить больше символов в это поле.
Я не могу изменить максимальный размер с Drupal, потому что я получаю следующее сообщение об ошибке:
В базе данных есть данные для этого поля. Настройки поля больше не могут быть изменены.
Однако должно быть решение. Должен ли я изменить его в базе данных (поле реализовано модулем Field-collection )?
Ответы:
Решение Dylan Tack - самое простое, но лично мне нравится изучать внутреннюю защиту базы данных Drupal, чтобы увидеть, как там все управляется.
Итак, если у вас есть текстовое поле с именем машины field_text из 10 символов, которое вы хотите увеличить до 25:
Теперь давайте сделаем небольшую операцию на сердце.
Измените определения столбцов таблиц данных:
Измените определение столбца, это очень сложно, потому что он хранится в BLOB , но это не остановит вас в этом.
Это сериализованный массив PHP , интересная часть в том
s:10:"max_length";s:2:"10";
, что этот массив имеет свойство с именемmax_length
(имя которого представляет собой строку из 10 символов - отсюда и "s"), значение которого равно 10 (это строка длиной в 2 символа). Это довольно легко, не правда ли?Изменить его так же просто, как заменить
s:2:"10"
деталь наs:2:"25"
. Будьте осторожны: если ваше новое значение длиннее, вы должны адаптировать часть "s", например, если положить 100, то будет 100,s:3:"100"
а длина - 3.Давайте поместим это новое значение обратно в БД, не забудьте сохранить всю строку.
???
PROFIT!
Кстати, в PhpMyAdmin есть некоторые настройки, позволяющие напрямую изменять столбцы BLOB , но зачем идти простым путем?
PS: Это также может спасти вам жизнь, когда вы помещаете некоторый PHP-код в представления и получаете WSOD из-за ошибки в вашем коде.
источник
ALTER TABLE
нетSELECT TABLE
. Кроме того, вы можете сделать его чище, например:ALTER TABLE field_data_field_text MODIFY field_text_value
... (MODIFY - это как CHANGE, когда вы не хотите менять имя . И вы этого не делаете.)источник
Похоже, что это ограничение текущего текстового модуля. text_field_settings_form () содержит следующий комментарий: « @todo : Если $ has_data, добавьте обработчик проверки, который позволяет увеличивать только max_length.».
В качестве временного решения вы можете закомментировать
'#disabled' => $has_data
в файле modules / field / modules / text / text.module в строке 77.Я не смог найти существующую проблему для этого конкретного случая, но вы могли бы упомянуть об этом на # 372330 .
источник
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
вам также нужно прокомментировать L282modules/field/modules/field_sql_storage/field_sql_storage.module
.core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
этом исключении с текстом «Хранилище SQL не может изменить схему для существующего поля». О строках 1312 и 1403.Drupal 7
Источник: http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
Drupal 8
Вот версия той же функции, предложенной @Christopher :
источник
drush updb --entity-updates
полей, которые мы выполняли с помощью этой функции, была помечена как требующая обновления. Затем он попытается обновить схему поля снова в MySQL. Для нас это потерпит неудачу, поскольку там уже есть полевые данные. Это препятствовало запуску других задач обновления.Попробуйте это ... это обновит тип данных поля с TEXT до LONG_TEXT и обновит
max_length
текст с 4000 до максимальной длины текста ... надеюсь, это поможет.источник
D8
core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
этом исключении с текстом «Хранилище SQL не может изменить схему для существующего поля». О строках 1312 и 1403./admin/config/development/configuration/single/export
. Тип конфигурации - «Хранение полей», и выберите соответствующее поле. Скопируйте конфигурацию./admin/config/development/configuration/single/import
. , Тип конфигурации - «Полевое хранилище». Вставьте конфигурацию. Измените длину.Обратите внимание (как вы, вероятно, уже знаете), если вы укоротите длину, то существующие данные будут усечены.
источник
В Drupal 7 я внес изменения в 2 таблицы в phpmyadmin и обновил кеш.
источник