फ़ील्ड सेटिंग्स की लंबाई कैसे बदलें?


46

मैं एक बार एक वेबसाइट के लिए एक क्षेत्र के लिए एक सीमा निर्धारित किया है। और अब ग्राहक उस क्षेत्र में अधिक वर्ण रखना चाहता है।

मैं ड्रुपल से अधिकतम आकार नहीं बदल सकता क्योंकि मुझे निम्न त्रुटि संदेश मिलता है:

डेटाबेस में इस फ़ील्ड का डेटा है। फ़ील्ड सेटिंग्स को अब बदला नहीं जा सकता है।

हालांकि एक समाधान होना चाहिए। क्या मैं इसे डेटाबेस में बदल दूंगा ( फील्ड-फील्ड मॉड्यूल द्वारा क्षेत्र को लागू किया गया है )?


क्या आप हमें बता सकते हैं कि Drupal और CCK का कौन सा संस्करण है? इसके अलावा किसी भी CCK contrib मॉड्यूल?
पैट्रिक

Drupal संस्करण 7. है
एक कोस्मोस

और आप इसे सामग्री प्रकार प्रबंधित फ़ील्ड अनुभाग के तहत संशोधित नहीं कर सकते हैं? आपको इसे किसी भी बिंदु पर संशोधित करने में सक्षम होना चाहिए। यह आपको चेतावनी दे सकता है, लेकिन फिर भी इसे अनुमति देनी चाहिए। यह फ़ील्ड संग्रह मॉड्यूल में बग / सीमा हो सकती है।
पैट्रिक

क्या आपने फ़ील्ड समूहों का उपयोग करने की कोशिश की है? अब आप समूह दोहराव जैसी चीजें कर सकते हैं जो आप पहले नहीं कर सकते थे।
पैट्रिक

मैं इसे सामग्री प्रकार प्रबंधित फ़ील्ड अनुभाग के तहत संशोधित नहीं कर सकता! यह सही बात है। द्रुपाल मुझे ऐसा करने नहीं देता।
एक कोसमोस

जवाबों:


89

डायलन टैक समाधान सबसे आसान है, लेकिन व्यक्तिगत रूप से मुझे ड्रुपल के डेटाबेस के आंतरिक वार्डों को देखने में मजा आता है यह देखने के लिए कि चीजों को कैसे प्रबंधित किया जाता है।

इसलिए, यह मानते हुए कि आपके पास एक टेक्स्ट फ़ील्ड है, जो मशीन का नाम फ़ील्ड है। 10 अक्षरों का फ़ील्ड जिसे आप 25 तक बढ़ाना चाहते हैं:

  • डेटा दो तालिकाओं में संग्रहीत किया जाएगा: field_data_field_text और field_revision_field_text
  • स्टोरेज डेटा के लिए फील्ड_कॉन्फिग में डेफिनिशन स्टोर किया गया है, और इस फील्ड के प्रत्येक इंस्टेंस (लेबल जैसे सामान) के लिए 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. परिभाषा कॉलम बदलें , यह एक बहुत मुश्किल है क्योंकि यह एक BLOB में संग्रहीत है , लेकिन यह ऐसा कुछ नहीं है जो आपको ऐसा करने के लिए रोक देगा।

    • इस 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...
    • यह एक PHP क्रमांकित सरणी है, दिलचस्प हिस्सा यह है s:10:"max_length";s:2:"10";, इसका मतलब है कि इस सरणी में एक संपत्ति है max_length(जिसका नाम 10 वर्ण स्ट्रिंग है - इसलिए "s") जिसका मान 10 है (जो कि 2 वर्ण लंबा स्ट्रिंग है)। यह बहुत आसान है, है ना?

    • इसके मूल्य को बदलना उतना ही आसान है जितना कि s:2:"10"भाग को बदलना s:2:"25"सावधान रहें: यदि आपका नया मूल्य लंबा है, तो आपको "एस" भाग को अनुकूलित करना होगा, उदाहरण के लिए 100 को रखना s:3:"100"100 की लंबाई के रूप में 3 होगा।

    • आइए इस नए मान को DB में वापस रखते हैं, पूरे स्ट्रिंग को रखना न भूलें।

    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 प्राप्त किया जा सके।


यह पहला SQL कथन ALTER TABLEनहीं कहना चाहिए SELECT TABLE। इसके अलावा, आप इसे क्लीनर की तरह बना सकते हैं: ALTER TABLE field_data_field_text MODIFY field_text_value... (
मोडिफाई चेंज

4
इसके लिए धन्यवाद। काश मैं देने के लिए एक से अधिक upvote था।
बीसी 01

1
यह पोस्ट समान दृष्टिकोण को प्राप्त करने के लिए Drupal के स्कीमा API का उपयोग करती है: up2technology.com/blog/converting-drupal-fields
Juampy NR

2
यदि आप अपने अनुक्रमित
पीट

यदि आपको 'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL' के बारे में कोई त्रुटि मिलती है, तो आप 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

यह वर्तमान पाठ मॉड्यूल की सीमा प्रतीत होती है। text_field_settings_form () के पास यह टिप्पणी है: " @todo : यदि $ has_data है, तो एक मान्य हैंडलर जोड़ें जो केवल max_length बढ़ाने की अनुमति देता है।"

अस्थायी वर्कअराउंड के रूप में, आप '#disabled' => $has_dataलाइन 77 के आसपास मॉड्यूल / फील्ड / मॉड्यूल / टेक्स्ट / टेक्स्ट.मॉडल में टिप्पणी कर सकते हैं ।

मुझे इस विशिष्ट मामले के लिए कोई मौजूदा समस्या नहीं मिली, लेकिन आप इसका उल्लेख # 372330 पर कर सकते हैं ।


2
आपके उत्तर के लिए धन्यवाद। मेरे पास लाइन है और अब मैं फ़ील्ड के मान को संशोधित कर सकता हूं, हालाँकि मुझे सुमित के बाद निम्न त्रुटि मिलती है:Attempt to update field Serial No failed: field_sql_storage cannot change the schema for an existing field with data..
एक कोसमोस

ड्रुपल मुद्दे को लेकर, कृपया आगे बढ़ें और इसे करें।
एक कोसमोस

1
मुझे यह काम करने के लिए नहीं मिला। उस लाइन पर टिप्पणी करने के बाद, मुझे अभी भी एक MYSQL त्रुटि मिली थी कि ALTER TABLE विफल रही।
jchwebdev

यदि आपको मिलता है, FieldUpdateForbiddenException: cannot change the schema for an existing field with dataतो आपको L282 पर टिप्पणी करने की आवश्यकता है modules/field/modules/field_sql_storage/field_sql_storage.module
मृत्यु 12

@ dieuwe की टिप्पणी गलत है। यह फ़ाइल D8 के हाल के संस्करणों में मौजूद नहीं है (यदि यह कभी हुआ था)। आपको core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.phpपाठ के साथ उस फेंक अपवाद में दो पंक्तियों पर टिप्पणी करने की आवश्यकता है "SQL भंडारण एक मौजूदा क्षेत्र के लिए स्कीमा को बदल नहीं सकता है"। लाइनों के बारे में 1312 और 1403.
Dalin

6

द्रुपाल al

Drupal 7 में एक पाठ क्षेत्र बनाते समय, आपको अपने डेटा के लिए अधिकतम लंबाई का चयन करना होगा। जैसे ही आप इस क्षेत्र के लिए कोई डेटा बनाते हैं, अधिकतम लंबाई Drupal फ़ील्ड सेटिंग्स में अपरिवर्तनीय हो जाती है।

यह समझ में आता है कि यह अधिकतम लंबाई कम करने के लिए अक्षम होगा क्योंकि इससे डेटा की हानि हो सकती है, हालांकि, किसी भी क्षेत्र के लिए अधिकतम लंबाई बढ़ाना संभव है। Drupal 7 टेक्स्ट मॉड्यूल कोड में एक टूडू यह दिखाता है कि यह उद्देश्य था लेकिन कभी पूरा नहीं हुआ।

3 चीजें जो होनी चाहिए:

  1. फ़ील्ड_data_ {फ़ील्डनाम} तालिका में मान स्तंभ की VARCHAR लंबाई बदलें
  2. Field_revision_ {fieldname} तालिका में मान स्तंभ की VARCHAR लंबाई बदलें
  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-length


द्रुपाल al

यहाँ @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
    );
  }
}

1
हमने एक परियोजना पर इस ड्रुपल 8 पद्धति का उपयोग किया और उन मुद्दों में भाग लिया जब आप drush updb --entity-updatesइस फ़ंक्शन के माध्यम से चलने वाले फ़ील्ड्स को एक अद्यतन की आवश्यकता के रूप में चिह्नित करेंगे। फिर यह mysql में फ़ील्ड स्कीमा को फिर से अपडेट करने का प्रयास करेगा। हमारे लिए यह तब विफल हो जाएगा क्योंकि वहां पहले से ही फ़ील्ड डेटा मौजूद था। यह अन्य अपडेट कार्यों को चलने से रोक रहा था।
leon.nk

लंबी कहानी छोटी, यह शायद नए क्षेत्र बनाने और डेटा को स्थानांतरित करने के लिए सुरक्षित है।
leon.nk

3

यह प्रयास करें ... यह TEXT से LONG_TEXT तक के फ़ील्ड डेटा प्रकार को अपडेट करेगा और max_length4000 से अधिकतम लंबी पाठ लंबाई तक अपडेट करेगा ... आशा है कि यह मदद करता है।

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पाठ के साथ उस फेंक अपवाद में दो पंक्तियों पर टिप्पणी करें "SQL भंडारण किसी मौजूदा क्षेत्र के लिए स्कीमा को बदल नहीं सकता है"। 1312 और 1403 लाइनों के बारे में।
  2. अपने ब्राउज़र में, पर नेविगेट करें /admin/config/development/configuration/single/export। कॉन्फ़िगरेशन प्रकार "फ़ील्ड संग्रहण" है, और प्रश्न में फ़ील्ड चुनें। कॉन्फ़िगरेशन की प्रतिलिपि बनाएँ।
  3. पर नेविगेट करें /admin/config/development/configuration/single/import। । कॉन्फ़िगरेशन प्रकार "फ़ील्ड संग्रहण" है। कॉन्फ़िगरेशन पेस्ट करें। लंबाई बदलें।
  4. फॉर्म जमा करें।

नोट (जैसा कि आप शायद पहले से ही जानते हैं), यदि आप लंबाई को छोटा करते हैं, तो मौजूदा डेटा को छोटा कर दिया जाएगा।


इसने एकदम जादू की तरह काम किया। Drupal 8.5.3 के रूप में लाइनें सुरक्षित फ़ंक्शन अपडेट में 1505-1507 हैं और संरक्षित फ़ंक्शन अपडेटेडेडसमेबलटेबलशेमा में 1596-1598। जब यह हो जाए तब वापस बदलना सुनिश्चित करें! धन्यवाद।
21

मैंने पहली बार इस दृष्टिकोण की कोशिश की। मैं एक पैराग्राफ फ़ील्ड को संशोधित करने की कोशिश कर रहा हूं। यह काम करता है, लेकिन वैसे भी संबंधित तालिकाओं के लिए अनिवार्य है।
यज़कल १६'१ at को ३:२०

@ ययाजकल हम्म, यह मेरा अनुभव नहीं था। क्या आप क्षेत्र को लंबा करने या छोटा करने की कोशिश कर रहे हैं?
दलीन

@ डैलिन की लंबाई 255 से 510 तक। डी का उपयोग 8.5.5 और पैराग्राफ 1.3
याज़ाकाल

1

Drupal 7 में, मैंने phpmyadmin में 2 तालिकाओं में संशोधन किया, और कैश को रीफ्रेश किया।

  1. "field_data_field_lorem": "field_lorem_value" को "longtext" में बदल दिया
  2. "field_config": "text_long" में "प्रकार" बदल दिया

क्या आपने इसे D7 के पैच के रूप में सबमिट किया था? यदि यह वास्तव में मुद्दा है तो आपको कोर कोड में इस मुद्दे को हल करने के लिए वास्तव में उन्हें एक पैच जारी करना चाहिए।
पैट्रिक

मैंने अपना फ़ील्ड आकार मान phpmyadmin (10 से 25 प्रकार के VARCHAR से) में बदल दिया है, और कैश को ताज़ा किया है, हालांकि काम नहीं कर रहा है। डेटाबेस में VARCHAR (25) घुसा दिया गया, लेकिन द्रुपाल में, फ़ील्ड पहले के समान अधिकतम आकार के मूल्य पर है। 10. शायद कुछ छिपी हुई फ़ील्ड सेटिंग है?
एक कोसमोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.