Друпал не позволяет менять длину текстового поля после создания. Функция field_update_field также нам не поможет — будет сгенерирована соответствующая ошибка, что поле уже содержит данные и изменить его длину нельзя.
Это можно проделать вручную, зная архитектуру drupal.
- Изменяем длину поля в таблице-хранилище конечного поля field_data_{field_name};
- Изменяем длину поля в таблице ревизий поля;
- Меняем длину в конфигурации полей.
Если длина текстового поля в результате изменения должна уменьшиться, то предварительно нужно выполнить UPDATE, укорачивающий значения до конечной длины. Но обычно размер поля изменяют в большую сторону.
Оптимальное решение — создать специальный скрипт, который бы выполнял все эти рутинные операции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
function update_textfield_maxlength ($field_name, $len) { // предварительные вычисления имен полей и таблиц $field_table = 'field_data_' . $field_name; $field_revision_table = 'field_revision_' . $field_name; $field_column = $field_name . '_value'; // обновляем значения и длину поля в хранилище db_query("UPDATE `{$field_table}` SET `{$field_column}` = SUBSTR(`{$field_column}`, 1, {$len})"); db_query("ALTER TABLE `{$field_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$len} )"); // обновляем значения и длину поля в ревизиях db_query("UPDATE `{$field_revision_table}` SET `{$field_column}` = SUBSTR(`{$field_column}`, 1, {$len})"); db_query("ALTER TABLE `{$field_revision_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$len} )"); // обновляем информацию в конфигурации полей $result = db_query("SELECT CAST(`data` AS CHAR(20000) CHARACTER SET utf8) FROM `field_config` WHERE field_name = '{$field_name}'"); $config = $result->fetchField(); $config_array = unserialize($config); $config_array['settings']['max_length'] = $len; $config = serialize($config_array); db_update('field_config') ->fields(array('data' => $config)) ->condition('field_name', $field_name) ->execute(); } |