Drupal 7
Khi tạo trường văn bản trong Drupal 7, bạn phải chọn độ dài tối đa cho dữ liệu của mình. Ngay khi bạn tạo bất kỳ dữ liệu nào cho trường này, độ dài tối đa sẽ trở thành bất biến trong cài đặt trường Drupal.
Có thể hiểu rằng điều này sẽ bị vô hiệu hóa khi giảm độ dài tối đa vì nó có thể dẫn đến mất dữ liệu, tuy nhiên, có thể tăng độ dài tối đa cho bất kỳ trường nào. Một việc cần làm trong mã mô-đun Drupal 7 cho thấy điều này đã được dự định nhưng không bao giờ được thực hiện.
3 điều cần phải xảy ra:
- Thay đổi độ dài VARCHAR của cột giá trị trong bảng field_data_ {fieldname}
- Thay đổi độ dài VARCHAR của cột giá trị trong bảng field_Vvision_ {fieldname}
- Cập nhật cấu hình của trường để phản ánh cài đặt độ dài tối đa mới Chức năng sau đây thực hiện cả 3 bước này và có 2 tham số dễ dàng bao gồm tên của trường và độ dài tối đa mới.
/**
* Helper function to change the max length of a text field.
*/
function MYMODULE_change_text_field_max_length($field_name, $new_length) {
$field_table = 'field_data_' . $field_name;
$field_revision_table = 'field_revision_' . $field_name;
$field_column = $field_name . '_value';
// Alter value field length in fields table.
db_query("UPDATE `{$field_table}` SET `{$field_column}`=SUBSTR(`{$field_column}`, 0, {$new_length})");
db_query("ALTER TABLE `{$field_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");
// Alter value field length in fields revision table.
db_query("UPDATE `{$field_revision_table}` SET `{$field_column}`=SUBSTR(`{$field_column}`, 0, {$new_length})");
db_query("ALTER TABLE `{$field_revision_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");
// Update field config with new max length.
$result = db_query("SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) FROM `field_config` WHERE field_name = '{$field_name}'");
$config = $result->fetchField();
$config_array = unserialize($config);
$config_array['settings']['max_length'] = $new_length;
$config = serialize($config_array);
db_update('field_config')
->fields(array('data' => $config))
->condition('field_name', $field_name)
->execute();
}
Khi chức năng này có sẵn trong tệp cài đặt tùy chỉnh của bạn, bạn có thể tạo một chức năng cập nhật cơ sở dữ liệu mới sử dụng chức năng mới này để thực hiện các thay đổi cần thiết của bạn.
/**
* Change max_length of Name field
*/
function mymodule_update_7002() {
MYMODULE_change_text_field_max_length('field_name', 50);
}
Nguồn:
http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
Drupal 8
Đây là phiên bản của chức năng tương tự được đề xuất bởi @Christopher :
/**
* Utility to change the max length of a text field.
*
* @param string $field_name
* Field name.
* @param int $new_length
* Field length in characters.
*
* @throws \DrupalUpdateException
*/
function MYMODULE_change_text_field_max_length($field_name, $new_length) {
// The transaction opens here.
$txn = db_transaction();
try {
// Update field content tables with new max length.
foreach (['field_data_', 'field_revision_'] as $prefix) {
db_query('
ALTER TABLE {' . $prefix . $field_name . '}
MODIFY ' . $field_name . '_value VARCHAR( ' . $new_length . ' )
');
}
// Update field config record with new max length.
$result = db_query("
SELECT CAST(data AS CHAR(10000) CHARACTER SET utf8)
FROM {field_config}
WHERE field_name = :field_name
", [':field_name' => $field_name]
);
$config = $result->fetchField();
if ($config) {
$config_array = unserialize($config);
$config_array['settings']['max_length'] = $new_length;
$new_config = serialize($config_array);
db_update('field_config')
->fields(['data' => $new_config])
->condition('field_name', $field_name)
->execute();
}
}
catch (Exception $e) {
// Something went wrong somewhere, so roll back now.
$txn->rollback();
// Allow update to be re-run when errors are fixed.
throw new \DrupalUpdateException(
"Failed to change $field_name field max length: " . $e->getMessage(),
$e->getCode(), $e
);
}
}