Drupal 7
Wenn Sie ein Textfeld in Drupal 7 erstellen, müssen Sie eine maximale Länge für Ihre Daten festlegen. Sobald Sie Daten für dieses Feld erstellen, wird die maximale Länge in den Drupal-Feldeinstellungen unveränderlich.
Es ist verständlich, dass dies deaktiviert ist, um die maximale Länge zu verringern, da dies zu einem Datenverlust führen kann. Es sollte jedoch möglich sein, die maximale Länge für jedes Feld zu erhöhen. Eine Aufgabe im Code des Drupal 7-Textmoduls zeigt, dass dies beabsichtigt, aber nie erreicht wurde.
Die 3 Dinge, die passieren müssen:
- Ändern Sie die VARCHAR-Länge der Wertspalte in der Tabelle field_data_ {fieldname}
- Ändern Sie die VARCHAR-Länge der Wertspalte in der Tabelle field_revision_ {fieldname}
- Aktualisieren Sie die Konfiguration des Felds, um die neue Einstellung für die maximale Länge widerzuspiegeln. Die folgende Funktion führt alle drei dieser Schritte aus und verwendet zwei einfache Parameter, einschließlich des Feldnamens und der neuen maximalen Länge.
/**
* 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();
}
Sobald diese Funktion in Ihrer benutzerdefinierten Installationsdatei verfügbar ist, können Sie eine neue Datenbankaktualisierungsfunktion erstellen, die diese neue Funktion verwendet, um die erforderlichen Änderungen vorzunehmen.
/**
* Change max_length of Name field
*/
function mymodule_update_7002() {
MYMODULE_change_text_field_max_length('field_name', 50);
}
Quelle:
http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
Drupal 8
Hier ist die von @Christopher vorgeschlagene Version derselben Funktion :
/**
* 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
);
}
}