Drupal 7
เมื่อสร้างฟิลด์ข้อความใน Drupal 7 คุณต้องเลือกความยาวสูงสุดสำหรับข้อมูลของคุณ ทันทีที่คุณสร้างข้อมูลใด ๆ สำหรับฟิลด์นี้ความยาวสูงสุดจะไม่เปลี่ยนรูปในการตั้งค่าฟิลด์ Drupal
เป็นที่เข้าใจได้ว่าสิ่งนี้จะถูกปิดการใช้งานเพื่อลดความยาวสูงสุดเนื่องจากอาจทำให้ข้อมูลสูญหายได้อย่างไรก็ตามควรเพิ่มความยาวสูงสุดสำหรับฟิลด์ใดก็ได้ สิ่งที่ต้องทำในรหัสโมดูลข้อความ Drupal 7 แสดงให้เห็นว่าสิ่งนี้มีจุดมุ่งหมาย แต่ไม่เคยประสบความสำเร็จ
3 สิ่งที่ต้องเกิดขึ้น:
- เปลี่ยนความยาว VARCHAR ของคอลัมน์ค่าในตาราง field_data_ {fieldname}
- เปลี่ยนความยาว VARCHAR ของคอลัมน์ค่าในตาราง field_revision_ {fieldname}
- อัพเดตการกำหนดค่าของเขตข้อมูลเพื่อให้สะท้อนถึงการตั้งค่าความยาวสูงสุดใหม่ฟังก์ชันต่อไปนี้ทำตามขั้นตอนทั้ง 3 ขั้นตอนเหล่านี้และใช้พารามิเตอร์ง่าย ๆ 2 ตัวรวมถึงชื่อของเขตข้อมูลและความยาวสูงสุดใหม่
/**
* 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();
}
เมื่อฟังก์ชั่นนี้มีอยู่ในไฟล์ติดตั้งแบบกำหนดเองของคุณคุณสามารถสร้างฟังก์ชั่นอัพเดทฐานข้อมูลใหม่ที่ใช้ฟังก์ชั่นใหม่นี้เพื่อทำการเปลี่ยนแปลงที่คุณต้องการ
/**
* Change max_length of Name field
*/
function mymodule_update_7002() {
MYMODULE_change_text_field_max_length('field_name', 50);
}
ที่มา:
http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
Drupal 8
นี่คือเวอร์ชั่นของฟังก์ชั่นเดียวกันที่เสนอโดย@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
);
}
}