web-gelistirme-sc.com

Saha ayarlarının uzunluğu nasıl değiştirilir?

Bir kez bir web sitesine bir alan için bir uzunluk sınırı belirledim. Ve şimdi müşteri bu alana daha fazla karakter koymak istiyor.

Aşağıdaki hata iletisini aldığım için maksimum boyutu değiştiremiyorum Drupal):

Veritabanında bu alan için veriler var. Saha ayarları artık değiştirilemez.

Ancak bir çözüm olmalı. Veritabanında değiştireyim mi (alan Alan koleksiyonları modülü tarafından uygulanır)?

47
Ek Kosmos

Dylan Tack çözümü en kolay olanıdır, ancak kişisel olarak Drupal'ın veritabanının iç servislerini keşfetmekten hoşlanıyorum.

Bu nedenle, makine adının 25'e kadar büyümesini istediğiniz 10 karakterin field_text olduğu bir metin alanınız olduğunu varsayarsak:

  • veriler iki tabloda saklanacaktır: field_data_field_text ve field_revision_field_text
  • depolama alanı verileri için field_config dosyasında ve bu alanın her örneği için field_config_instance içinde tanımlanır (etiket gibi şeyler).

Şimdi biraz kalp ameliyatı yapalım.

  1. Veri tabloları sütun tanımlarını değiştirin:

    ALTER TABLE `field_data_field_text` 
    CHANGE `field_text_value` `field_text_value` VARCHAR( 25 ) 
    CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
    
    ALTER TABLE `field_revision_field_text` 
    CHANGE `field_text_value` `field_text_value` VARCHAR( 25 ) 
    CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
    
  2. Tanım sütununu değiştirin, bu çok zor çünkü bir [~ # ~] blob [~ # ~], ancak bu, bunu yaptığınız için sizi durduracak bir şey değil.

    • Bu [~ # ~] damla [~ # ~] şeyin cesaretlerini inceleyin:
    SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) 
    FROM `field_config` WHERE field_name = 'field_text';
    
    • Bu size şöyle bir şey verecektir:
    a:7:{s:12:"translatable";s:1:"1";s:12:"entity_types";a:0:{}s:8:"settings";a:2:
        {s:10:"max_length";s:2:"10";s:17:"field_permissions";a:5:
        //a lot more stuff...
    
    • Bu bir PHP serileştirilmiş dizisidir, ilginç kısım s:10:"max_length";s:2:"10";, bu dizinin max_length (bu ad 10 karakterlik bir dizedir - dolayısıyla "s"), bu değer 10'dur (2 karakter uzunluğunda bir dizedir). Oldukça kolay, değil mi?

    • Değerini değiştirmek s:2:"10" parça _ s:2:"25". Dikkatli olun: yeni değeriniz daha uzunsa "s" bölümünü uyarlamanız gerekir, örneğin 100 koymak s:3:"100" olarak 100 uzunluk 3'tür.

    • Bu yeni değeri DB'ye geri koyalım, tüm dizeyi saklamayı unutmayın.

    UPDATE `field_config` 
    SET data = 'a:7:{...a:2:{s:10:"max_length";s:2:"25";...}'
    WHERE `field_name` = 'field_text'
    
    • Önbelleklerinizi yıkayın.
  3. ???

  4. KAR!

Bu arada, PhpMyAdmin BLOB sütunlarının doğrudan değiştirilmesine izin vermek için bazı ayarlara sahip, ama neden kolay yoldan gidelim?

Not: Bu aynı zamanda bazı PHP kodları görünümlere koyarken ve kodunuzdaki bir hata nedeniyle WSOD alırken hayatınızı kurtarabilir.

89
tostinni
function mymodule_update_7100() {
  $items = array();
  _field_maxlength_fix('field_name');
  return $items;
}

function _field_maxlength_fix($field_name, $maxlength = 255) {
  _alter_field_table($field_name, $maxlength);
  $data = _get_field_data($field_name);
  $data = _fix_field_data($data, $maxlength);
  _update_field_config($data, $field_name);
}

function _alter_field_table($field_name, $maxlength) {
  db_query("ALTER TABLE field_data_".$field_name." CHANGE ".$field_name."_value ".$field_name."_value VARCHAR( ".$maxlength." ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
  db_query("ALTER TABLE field_revision_".$field_name." CHANGE ".$field_name."_value ".$field_name."_value VARCHAR( ".$maxlength." ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
}

function _get_field_data($field_name) {
  $qry = "SELECT data FROM field_config WHERE field_name = :field_name";
  $result = db_query($qry, array(':field_name' => $field_name))->fetchObject();
  return unserialize($result->data);
}

function _fix_field_data($data, $maxlength) {
  $data['settings']['max_length'] = (string)$maxlength;
  return serialize($data);
}

function _update_field_config($data, $field_name) {
  $qry = "UPDATE field_config SET data = :data WHERE field_name = :field_name";
  db_query($qry, array(':data' => $data, ':field_name' => $field_name));
}
20
Kevin Thompson

Bu, geçerli metin modülünün bir sınırlaması gibi görünüyor. text_field_settings_form () bu yorumu yaptı: " @ todo : $ has_data ise, yalnızca max_length değerinin artmasına izin veren bir doğrulama işleyicisi ekleyin . ".

Geçici bir çözüm olarak, '#disabled' => $has_data modüller/alan/modüller/metin/metin modülünde, satır 77 civarında.

Bu özel durum için mevcut bir sorun bulamadım, ancak # 3723 adresinden bahsedebilirsiniz.

9
Dylan Tack

Drupal 7

Drupal 7 içinde bir metin alanı oluştururken, verileriniz için bir maksimum uzunluk seçmelisiniz. Bu alan için herhangi bir veri oluşturduğunuzda, maksimum uzunluk Drupal alan ayarları.

Bunun, maksimum uzunluğu azaltmak için devre dışı bırakılması anlaşılabilir, çünkü veri kaybına neden olabilir, ancak herhangi bir alan için maksimum uzunluğu artırmak mümkün olmalıdır. Drupal 7 Metin modülü kodundaki bir yapılacaklar, bunun amaçlandığını ancak asla gerçekleştirilmediğini gösterir.

Gerçekleşmesi Gereken 3 Şey:

  1. Field_data_ {fieldname} tablosundaki değer sütununun VARCHAR uzunluğunu değiştirin
  2. Field_revision_ {fieldname} tablosundaki değer sütununun VARCHAR uzunluğunu değiştirin
  3. Alanın yapılandırmasını yeni maksimum uzunluk ayarını yansıtacak şekilde güncelleyin Aşağıdaki işlev bu adımların 3ünü de gerçekleştirir ve alanın adı ve yeni maksimum uzunluk dahil 2 kolay parametre alır.
/**
 * 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();
}

Özel yükleme dosyanızda bu işlev kullanılabilir olduğunda, gerekli değişiklikleri yapmak için bu yeni işlevi kullanan yeni bir veritabanı güncelleme işlevi oluşturabilirsiniz.

/**
 * Change max_length of Name field
 */
function mymodule_update_7002() {
  MYMODULE_change_text_field_max_length('field_name', 50);
}

Kaynak: http://nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length


Drupal 8

@ Christopher tarafından önerilen aynı fonksiyonun sürümü:

/**
 * 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
    );
  }
}
7
kenorb

Bunu deneyin ... bu, alan veri türünü TEXT'den LONG_TEXT'e güncelleyecek ve max_length 4000'den maksimum uzun metin uzunluğuna ... umarım bu yardımcı olur.

function my_module_update_1001(&$sandbox) {
  // Check if our field is already created.
  if (field_info_field('sample_text_field')) {
    db_query('ALTER TABLE field_data_sample_text_field CHANGE sample_text_field_value sample_text_field_value LONGTEXT');
    db_query('ALTER TABLE field_revision_sample_text_field CHANGE sample_text_field_value sample_text_field_value LONGTEXT');
    db_query("UPDATE field_config SET type = 'text_long' WHERE field_name = 'sample_text_field' ");

    $field = array(
      'field_name' => 'sample_text_field',
      'type' => 'text_long',
      'cardinality' => 1,
      'settings' => array(
         'max_length' => 0,
      ),
    );
    field_update_field($field);    
  }
}
3
Harold

D8

  1. core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchem‌​a.php "SQL depolama alanı varolan bir alanın şemasını değiştiremez" metniyle özel durumlar oluşturur. 1312 ve 1403 hatları hakkında.
  2. Tarayıcınızda /admin/config/development/configuration/single/export. Yapılandırma türü "Alan Depolama Alanı" dır ve söz konusu alanı seçin. Yapılandırmayı kopyalayın.
  3. Şu yöne rotayı ayarla /admin/config/development/configuration/single/import. . Konfigürasyon tipi "Sahada Depolama" dır. Yapılandırmayı yapıştırın. Uzunluğu değiştirin.
  4. Formu gönderin.

Not (muhtemelen bildiğiniz gibi), uzunluğu kısaltırsanız, mevcut veriler kesilir.

3
Dalin

Drupal 7, phpmyadmin 2 tablolarda değişiklikler yaptım ve önbelleği yeniledim.

  1. "field_data_field_lorem": "field_lorem_value" ifadesini "uzun metin" olarak değiştirdi
  2. "field_config": "tür" kelimesini "text_long" olarak değiştirdi
1
Jill