ফিল্ড সেটিংসের দৈর্ঘ্যটি কীভাবে পরিবর্তন করবেন?


46

আমি একবার ওয়েবসাইটে একটি ক্ষেত্রের জন্য একটি দৈর্ঘ্য সীমা সেট করেছি। এবং এখন ক্লায়েন্ট সেই ক্ষেত্রে আরও অক্ষর রাখতে চায় put

আমি দ্রুপাল থেকে সর্বোচ্চ আকার পরিবর্তন করতে পারি না কারণ আমি নিম্নলিখিত ত্রুটি বার্তাটি পাই:

ডাটাবেসে এই ক্ষেত্রটির জন্য ডেটা রয়েছে। ফিল্ড সেটিংস আর পরিবর্তন করা যাবে না।

তবে অবশ্যই একটি সমাধান হতে হবে। আমি কি এটি ডাটাবেসে পরিবর্তন করব (ক্ষেত্রটি ফিল্ড-সংগ্রহের মডিউল দ্বারা কার্যকর করা হয় )?


আপনি কি আমাদের বলতে পারেন দ্রুপাল এবং সিসিকে এর কোন সংস্করণ? এছাড়াও কোন সিসিকে অবদান মডিউল?
প্যাট্রিক

ড্রুপাল সংস্করণটি 7
এক কোসমোস

এবং আপনি বিষয়বস্তু পরিচালনা ক্ষেত্র বিভাগের অধীনে এটিকে সংশোধন করতে পারবেন না? আপনার যে কোনও সময়ে এটি পরিবর্তন করতে সক্ষম হওয়া উচিত। এটি আপনাকে একটি সতর্কতা দিতে পারে, তবে এটি এখনও এটির অনুমতি দেওয়া উচিত। ক্ষেত্র সংগ্রহের মডিউলটিতে এটি বাগ / সীমাবদ্ধতা হতে পারে।
প্যাট্রিক 14 ই

আপনি কি ফিল্ড গ্রুপ ব্যবহার করার চেষ্টা করেছেন? আপনি এখন গ্রুপ নকলের মতো কাজ করতে পারেন যা আপনি আগে করতে পারেন নি।
প্যাট্রিক 14 ই

আমি বিষয়বস্তু টাইপ পরিচালনা ক্ষেত্রের অধীনে এটিকে সংশোধন করতে পারি না! এই বিষয়টি। দ্রুপাল আমাকে করতে দেয় না
এক কোসমোস

উত্তর:


89

ডিলান ট্যাক সলিউশনটি সবচেয়ে সহজ, তবে ব্যক্তিগতভাবে আমি কীভাবে সেখানে জিনিস পরিচালনা করা হয় তা দেখার জন্য দ্রুপালের ডাটাবেসের অভ্যন্তরীণ ওয়ার্ডগুলি অন্বেষণ করতে উপভোগ করি।

সুতরাং, ধরে নিলাম আপনার কাছে এমন একটি পাঠ্য ক্ষেত্র রয়েছে যা মেশিনের নাম ক্ষেত্র_আপনি 10 টি অক্ষরের ক্ষেত্রের পাঠ্য 25 যা আপনি বাড়তে চান:

  • ডেটা দুটি সারণীতে সংরক্ষণ করা হবে: ফিল্ড_ডাটা_ফিল্ড_টেক্সট এবং ক্ষেত্র_দর্শন_ফিল্ড_টেক্সট
  • সংজ্ঞা স্টোরেজ ডেটার জন্য ফিল্ড_কনফিগ এবং এই ক্ষেত্রের প্রতিটি ক্ষেত্রে (লেবেলের মতো স্টাফ) ফিল্ডকনফিগ_ইনস্ট্যান্সে সংরক্ষণ করা হয়।

এবার একটু হার্ট সার্জারি করা যাক।

  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. সংজ্ঞা কলামটি পরিবর্তন করুন , এটি একটি অত্যন্ত জটিল কারণ এটি একটি বিএলওবিতে সঞ্চিত রয়েছে , তবে এটি এমন কিছু নয় যা আপনাকে এই কাজটি করতে আটকাবে

    • এই BLOB জিনিসটির সাহসগুলি ছড়িয়ে দিন :

    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...
    • এটি একটি পিএইচপি সিরিয়ালযুক্ত অ্যারে, আকর্ষণীয় অংশটি s:10:"max_length";s:2:"10";, এর অর্থ এই অ্যারেটির একটি সম্পত্তি রয়েছে max_length(যা নামটি 10 ​​টি অক্ষরের স্ট্রিং - সুতরাং "গুলি") যার মান 10 (যা একটি 2 অক্ষরের দীর্ঘ স্ট্রিং)। এটা বেশ সহজ, তাই না?

    • এর মান পরিবর্তন করা s:2:"10"অংশটি প্রতিস্থাপনের মতোই সহজ s:2:"25"সতর্কতা অবলম্বন করুন: আপনার নতুন মানটি যদি দীর্ঘ হয় তবে আপনাকে "গুলি" অংশটি মানিয়ে নিতে হবে, উদাহরণস্বরূপ 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. লাভ!

যাইহোক , পিএইচপিএমআইএডমিনের বিএলওবি কলামগুলিকে সরাসরি পরিবর্তন করার অনুমতি দেওয়ার জন্য কিছু সেটিংস রয়েছে , তবে কেন সরল পথে চলবেন ?

পিএস: আপনার কোডটিতে একটি ত্রুটির কারণে কিছু পিএইচপি কোড দেখায় এবং ডাব্লুএসওডি পাওয়ার সময় এটি আপনার জীবন বাঁচাতে পারে।


এই প্রথম এসকিউএল বিবৃতিতে বলা উচিত ALTER TABLEনয় SELECT TABLE। এছাড়াও, আপনি এটিকে আরও ক্লিনার হিসাবে তৈরি করতে পারেন: ALTER TABLE field_data_field_text MODIFY field_text_value... (আপনি নাম পরিবর্তন করতে চান না যখন মোডিফাই পরিবর্তন মত হয় । এবং আপনি না))
আর্টফ্রববট

4
এর জন্য ধন্যবাদ. আমি চাই আমি দিতে একাধিক upvote ছিল।
বিসি 01

1
এই পোষ্টটি একই পন্থাটি অর্জন করতে দ্রুপালের
Juampy NR

2
আপনি যদি আপনার সিরিয়ালযুক্ত তথ্য ইন্টারনেটগুলিতে প্রেরণে আপত্তি করেন না তবে আমি এই সরঞ্জামটি পেয়েছি, সম্পাদনার জন্য দুর্দান্ত: pines.sourceforge.net/phpserialeditor.php
পিট

আপনি যদি 'CHARACTER SET utf8 COLLATE utf8_general_ci নাল ডিফল্ট নাল' সম্পর্কে ত্রুটি পান তবে আপনি PhpMyAdmin ব্যবহার করতে পারেন।
tog22

19
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));
}

এই ফিক্সটি সবচেয়ে বেশি পছন্দ করুন যেহেতু এটি ম্যানুয়াল ডিবি হ্যাকারির উপর নির্ভর করে না ... একটি হুক_আপডেট_এন এর মাধ্যমে প্রতিরূপযোগ্য সমাধান করা জরুরী!
areynolds

9

এটি বর্তমান পাঠ্য মডিউলটির সীমাবদ্ধতা বলে মনে হচ্ছে। টেক্সট_ফিল্ড_সেটিংস_ফর্ম () -এর এই মন্তব্যটি রয়েছে: " @ টোডো : যদি $ has_data হয় তবে একটি বৈধতা হ্যান্ডলার যুক্ত করুন যা কেবলমাত্র ম্যাক্স_লেন্থ বাড়াতে দেয়" "

অস্থায়ী '#disabled' => $has_dataকর্মক্ষেত্র হিসাবে, আপনি মডিউল / ক্ষেত্র / মডিউল / পাঠ্য / পাঠ্য.মডিউল, 77 77 লাইনের আশেপাশে মন্তব্য করতে পারেন ।

এই নির্দিষ্ট ক্ষেত্রে আমি কোনও বিদ্যমান সমস্যা খুঁজে পাইনি, তবে আপনি এটি # 372330 এ উল্লেখ করতে পারেন ।


2
আপনার উত্তরের জন্য ধন্যবাদ. আমি লাইনে মন্তব্য করেছি এবং এখন আমি ক্ষেত্রের মানটি ফর্মটি সংশোধন করতে পারি, তবে আমি সাবমিটের পরে নিম্নলিখিত ত্রুটিটি পেয়েছি:Attempt to update field Serial No failed: field_sql_storage cannot change the schema for an existing field with data..
এক কোসমোস

ড্রুপাল ইস্যু করার বিষয়ে, দয়া করে এগিয়ে যান এবং এটি করুন।
এক Kosmos

1
আমি এই কাজ করতে পারেন না। এই লাইনটি মন্তব্য করার পরে, আমি এখনও একটি এমওয়াইএসকিউএল ত্রুটি পেয়েছি যা অলটার টেবিলে ব্যর্থ হয়েছে।
jchwebdev

আপনি যদি একটি পান তবে আপনার FieldUpdateForbiddenException: cannot change the schema for an existing field with dataউপর L282 মন্তব্যও করতে হবে modules/field/modules/field_sql_storage/field_sql_storage.module
dieuwe

@ dieuwe এর মন্তব্য ভুল। D8 এর সাম্প্রতিক সংস্করণগুলিতে এই ফাইলটির অস্তিত্ব নেই (যদি এটি কখনও হয়)। core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php"এসকিউএল স্টোরেজটি কোনও বিদ্যমান ক্ষেত্রের জন্য স্কিমা পরিবর্তন করতে পারে না" এই পাঠ্যটিতে ব্যতিক্রম ছড়িয়ে দেওয়ার জন্য আপনাকে দুটি লাইনের মন্তব্য করতে হবে । 1312 এবং 1403 লাইন সম্পর্কে
ডালিন

6

দ্রুপাল 7

ড্রুপাল 7 এ একটি পাঠ্য ক্ষেত্র তৈরি করার সময় আপনার অবশ্যই আপনার ডেটার জন্য সর্বাধিক দৈর্ঘ্য বেছে নিতে হবে। এই ক্ষেত্রের জন্য আপনি যে কোনও ডেটা তৈরি করার সাথে সাথে সর্বাধিক দৈর্ঘ্য দ্রুপাল ক্ষেত্র সেটিংসে অপরিবর্তনীয় হয়ে যায়।

এটি বোধগম্য যে এটি সর্বোচ্চ দৈর্ঘ্য হ্রাস করার জন্য অক্ষম হবে কারণ এর ফলে ডেটা হারাতে পারে তবে কোনও ক্ষেত্রের সর্বোচ্চ দৈর্ঘ্য বাড়ানো সম্ভব। ড্রুপাল 7 পাঠ্য মডিউল কোডটিতে একটি টুডো দেখায় যে এটি উদ্দেশ্যযুক্ত কিন্তু কখনই সম্পন্ন হয়নি।

3 টি জিনিস যা হওয়া দরকার:

  1. ক্ষেত্র_ডেটা_ {ক্ষেত্রের নাম} সারণীতে মান কলামের VARCHAR দৈর্ঘ্য পরিবর্তন করুন
  2. ক্ষেত্র_দর্শন_ {ক্ষেত্রের নাম} সারণীতে মান কলামের VARCHAR দৈর্ঘ্য পরিবর্তন করুন
  3. নতুন সর্বোচ্চ দৈর্ঘ্যের সেটিংটি প্রতিফলিত করতে ক্ষেত্রটির কনফিগারেশন আপডেট করুন নিম্নলিখিত ফাংশনটি এই সমস্ত 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-leth


দ্রুপাল ৮

@ ক্রিসটফার প্রস্তাবিত একই ফাংশনের সংস্করণটি এখানে :

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

1
আমরা একটি প্রজেক্টে এই ড্রুপাল 8 পদ্ধতিটি ব্যবহার করেছি এবং সেই সমস্যাগুলিতে ছড়িয়ে পড়েছি যার মাধ্যমে আপনি যখন drush updb --entity-updatesএই ক্ষেত্রগুলি চালিয়েছিলেন তখন আমরা কোনও আপডেটের প্রয়োজন হিসাবে চিহ্নিত করা হত। এরপরে এটি আবার ফিল্ড স্কিমাটি মাইএসকিএলে আপডেট করার চেষ্টা করবে। আমাদের জন্য এটি তখন ব্যর্থ হবে কারণ সেখানে ইতিমধ্যে ক্ষেত্রের ডেটা ছিল। এটি অন্যান্য আপডেট টাস্কগুলি চালানো থেকে আটকাচ্ছিল।
leon.nk

দীর্ঘ গল্প সংক্ষিপ্ত, সম্ভবত নতুন ক্ষেত্র তৈরি করা এবং জুড়ে ডেটা মাইগ্রেট করা নিরাপদ।
leon.nk

3

এটি ব্যবহার করে দেখুন ... এটি ক্ষেত্রের ডেটা টাইপটি 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

D8

  1. core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchem‌​a.php"এসকিউএল স্টোরেজটি কোনও বিদ্যমান ক্ষেত্রের জন্য স্কিমা পরিবর্তন করতে পারে না" এই পাঠ্যটিতে ব্যতিক্রম দুটি লেখার জন্য মন্তব্য করুন। 1312 এবং 1403 লাইন সম্পর্কে।
  2. আপনার ব্রাউজারে নেভিগেট করুন /admin/config/development/configuration/single/export। কনফিগারেশন ধরণটি "ফিল্ড স্টোরেজ" এবং প্রশ্নে ক্ষেত্রটি চয়ন করুন। কনফিগারেশন অনুলিপি করুন।
  3. নেভিগেট করুন /admin/config/development/configuration/single/import। । কনফিগারেশন ধরণটি "ফিল্ড স্টোরেজ"। কনফিগারেশন আটকান। দৈর্ঘ্য পরিবর্তন করুন।
  4. ফর্ম জমা দিন।

দ্রষ্টব্য (আপনি সম্ভবত ইতিমধ্যে জানেন), আপনি যদি দৈর্ঘ্যটি সংক্ষিপ্ত করে রাখেন তবে বিদ্যমান ডেটা কেটে যাবে।


এটা চমত্কার ভাবে কাজ করেছে. ড্রুপাল ৮.৫.৩ হিসাবে লাইনগুলি সুরক্ষিত ফাংশন আপডেটডেডিকেটেটেবলসচেমাতে 1505-1507 এবং সুরক্ষিত ফাংশন আপডেটশারেড টেবিলশ্মিমাতে 1596-1598 এ রয়েছে। এটি শেষ হয়ে গেলে অবশ্যই ফিরে আসবেন! ধন্যবাদ.
হংকপং

আমি প্রথম এই পদ্ধতির চেষ্টা করেছি। আমি অনুচ্ছেদের ক্ষেত্রটি সংশোধন করার চেষ্টা করছি। এটি কাজ করে তবে যাইহোক সম্পর্কিত টেবিলগুলি পরিবর্তন করা বাধ্যতামূলক।
ইয়াজকাল

@ ইয়াজকাল হুঁ, এটি আমার অভিজ্ঞতা ছিল না। আপনি কি ক্ষেত্রটি দৈর্ঘ্য বা ছোট করার চেষ্টা করছেন?
ডালিন

@ ডালিন দৈর্ঘ্য 255 থেকে 510 অবধি। ডি 8.5.5 এবং অনুচ্ছেদ 1.3 ব্যবহার করে
ইয়াজকাল

1

ড্রুপাল 7-এ, আমি phpmyadmin এ 2 টেবিলগুলিতে পরিবর্তন করেছি এবং ক্যাশে রিফ্রেশ করেছি।

  1. "ফিল্ড_ডাটা_ফিল্ড_ফ্লোরিম": "ফিল্ড_কেন্দ্র_মূল্য" পরিবর্তন করে "লম্বা পাঠ্য"
  2. "ফিল্ড_কনফিগ": "প্রকার" পরিবর্তন করে "পাঠ্য_লং" করা হয়েছে

আপনি কি এটি ডি 7 তে প্যাচ হিসাবে জমা দিয়েছেন? যদি এটি সত্যই সমস্যা হয় তবে মূল কোডটিতে এই সমস্যাটি সমাধান করার জন্য আপনার তাদের সত্যিই একটি প্যাচ দেওয়া উচিত।
প্যাট্রিক

আমি আমার ফিল্ড সাইজের মান পিএইচপিএমইডমিন থেকে (ভিউচারআর টাইপের 10 থেকে 25 পর্যন্ত) পরিবর্তন করেছি এবং ক্যাশে রিফ্রেশ করেছি, তবে কাজ করছে না। ডাটাবেসে ভ্রচার (২৫) রেমেড কিন্তু দ্রুপালে, ক্ষেত্রটি আগের মতো একই সর্বাধিক আকারের মানতে পারে 10 সম্ভবত কোনও লুকানো ফিল্ড সেটিং আছে?
এক Kosmos
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.