Drupal 7
Quando crei un campo di testo in Drupal 7, devi scegliere una lunghezza massima per i tuoi dati. Non appena si creano dati per questo campo, la lunghezza massima diventa immutabile nelle impostazioni del campo Drupal.
È comprensibile che questo sia disabilitato per ridurre la lunghezza massima perché potrebbe comportare una perdita di dati, tuttavia, dovrebbe essere possibile aumentare la lunghezza massima per qualsiasi campo. Un todo nel codice del modulo di testo di Drupal 7 mostra che questo era previsto ma mai realizzato.
Le 3 cose che devono accadere:
- Modificare la lunghezza VARCHAR della colonna del valore nella tabella field_data_ {fieldname}
- Modificare la lunghezza VARCHAR della colonna del valore nella tabella field_revision_ {fieldname}
- Aggiorna la configurazione del campo in modo che rifletta la nuova impostazione della lunghezza massima La seguente funzione esegue tutti e 3 questi passaggi e accetta 2 semplici parametri tra cui il nome del campo e la nuova lunghezza massima.
/**
* 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();
}
Quando questa funzione è disponibile nel file di installazione personalizzato, è possibile creare una nuova funzione di aggiornamento del database che utilizza questa nuova funzione per apportare le modifiche richieste.
/**
* Change max_length of Name field
*/
function mymodule_update_7002() {
MYMODULE_change_text_field_max_length('field_name', 50);
}
Fonte: http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-ma maximum -
length
Drupal 8
Ecco la versione della stessa funzione proposta da @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
);
}
}