it-swarm.asia

كيفية تغيير طول الإعدادات الميدانية؟

لقد حددت مرة واحدة لموقع ويب حد الطول لحقل. والآن يريد العميل وضع المزيد من الشخصيات في هذا المجال.

لا يمكنني تغيير الحجم الأقصى من Drupal لأنني أتلقى رسالة الخطأ التالية:

توجد بيانات لهذا المجال في قاعدة البيانات. لم يعد من الممكن تغيير إعدادات الحقل.

ولكن يجب أن يكون هناك حل. هل أقوم بتغييره في قاعدة البيانات (الحقل هو المنفذ بواسطة المجموعات الميدانية الوحدة النمطية)؟

47
Ek Kosmos

حل Dylan Tack هو الأسهل ، لكنني شخصيًا أستمتع باستكشاف الأجنحة الداخلية لقاعدة بيانات Drupal لمعرفة كيفية إدارة الأشياء هناك.

لذا ، بافتراض أن لديك حقل نص هو اسم الجهاز هو field_text من 10 أحرف تريد زيادتها إلى 25:

  • سيتم تخزين البيانات في جدولين: field_data_field_text و field_revision_field_text
  • يتم تخزين التعريف في field_config لبيانات التخزين ، و field_config_instance لكل مثيل من هذا الحقل (أشياء مثل التسمية).

الآن دعونا نجري القليل من جراحة القلب.

  1. تعديل تعريفات أعمدة جداول البيانات:

    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. قم بتغيير عمود التعريف ، هذا العمود صعب للغاية لأنه مخزن في [~ # ~] النقطة [~ # ~ ] ، لكن هذا ليس شيئًا يمنعك من القيام بذلك.

    • تشريح أحشاء هذا الشيء [~ # ~] النقطة [~ # ~] الشيء:
    SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) 
    FROM `field_config` WHERE field_name = 'field_text';
    
    • سيعطيك هذا شيئًا مثل:
    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...
    
    • هذا هو صفيف PHP متسلسل ، الجزء المثير للاهتمام هو s:10:"max_length";s:2:"10"; ، وهذا يعني أن هذا الصفيف لديه خاصية تسمى max_length (أي اسم هو سلسلة مكونة من 10 أحرف - ومن ثم "s") التي تبلغ قيمتها 10 (وهي سلسلة مكونة من حرفين). الأمر سهل للغاية ، أليس كذلك؟

    • إن تغيير قيمته أمر سهل مثل استبدال الجزء s:2:"10" بـ s:2:"25". كن حذرًا: إذا كانت قيمتك الجديدة أطول ، فعليك تكييف جزء "s" ، على سبيل المثال وضع 100 سيكون s:3:"100" طول 100 هو 3.

    • دعونا نعيد هذه القيمة الجديدة إلى قاعدة البيانات ، لا تنسى الاحتفاظ بالسلسلة بأكملها.

    UPDATE `field_config` 
    SET data = 'a:7:{...a:2:{s:10:"max_length";s:2:"25";...}'
    WHERE `field_name` = 'field_text'
    
    • امسح مخابئك.
  3. ؟؟؟

  4. ربح!

بالمناسبة ، لدى PhpMyAdmin بعض الإعدادات للسماح تعديل مباشر لأعمدة BLOB ، ولكن لماذا تسير بالطريقة السهلة؟

ملاحظة: هذا يمكن أن ينقذ حياتك أيضًا عند وضع بعض كود PHP في طرق العرض والحصول على WSOD بسبب خطأ في التعليمات البرمجية الخاصة بك.

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

يبدو أن هذا يمثل قيودًا على وحدة النص الحالية. text_field_settings_form () له هذا التعليق: " @ todo : إذا كان $ has_data ، أضف معالج التحقق الذي يسمح فقط بزيادة الحد الأقصى للطول ".

كحل مؤقت ، يمكنك التعليق '#disabled' => $has_data في الوحدات/المجال/الوحدات/النص/النص ، حول السطر 77.

لم أتمكن من العثور على مشكلة حالية لهذه الحالة المحددة ، ولكن يمكنك ذكرها على # 3723 .

9
Dylan Tack

دروبال 7

عند إنشاء حقل نص في Drupal 7 ، يجب عليك اختيار الحد الأقصى لطول بياناتك. بمجرد إنشاء أي بيانات لهذا الحقل ، يصبح الحد الأقصى للطول غير قابل للتغيير في Drupal.

من المفهوم أن هذا سيتم تعطيله لتقليل الطول الأقصى لأنه قد يؤدي إلى فقدان البيانات ، ومع ذلك ، يجب أن يكون من الممكن زيادة الحد الأقصى للطول لأي حقل. A todo في Drupal 7 رمز وحدة النص يظهر أن هذا كان مقصودًا ولكن لم يتم تحقيقه أبدًا.

الأشياء الثلاثة التي يجب أن تحدث:

  1. قم بتغيير طول VARCHAR لعمود القيمة في جدول field_data_ {fieldname}
  2. قم بتغيير طول VARCHAR لعمود القيمة في جدول field_revision_ {fieldname}
  3. قم بتحديث تكوين الحقل ليعكس إعداد الحد الأقصى الجديد للطول تعمل الوظيفة التالية على تنفيذ جميع هذه الخطوات الثلاث وتأخذ معلمتين سهلتين بما في ذلك اسم الحقل والحد الأقصى للطول الجديد.
/**
 * 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


دروبال 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
    );
  }
}
7
kenorb

جرب هذا ... سيؤدي هذا إلى تحديث نوع البيانات الميدانية من TEXT إلى LONG_TEXT وتحديث max_length من 4000 إلى الحد الأقصى لطول النص ... آمل أن يساعد ذلك.

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 تغيير مخطط حقل موجود". حول الخطوط 1312 و 1403.
  2. في متصفحك ، انتقل إلى /admin/config/development/configuration/single/export. نوع التكوين هو "التخزين الميداني" ، واختر الحقل المعني. انسخ التكوين.
  3. انتقل إلى /admin/config/development/configuration/single/import. . نوع التكوين هو "التخزين الميداني". قم بلصق التكوين. قم بتغيير الطول.
  4. أرسل النموذج.

ملاحظة (كما تعلم على الأرجح بالفعل) ، إذا قمت بتقصير الطول ، فسيتم اقتطاع البيانات الموجودة.

3
Dalin

في Drupal 7 ، أجريت تعديلات على جدولين في phpmyadmin ، وقمت بتحديث ذاكرة التخزين المؤقت.

  1. "field_data_field_lorem": تم تغيير "field_lorem_value" إلى "longtext"
  2. "field_config": تم تغيير "type" إلى "text_long"
1
Jill