एक बार बनाने के बाद मैं किसी फ़ील्ड के मशीन का नाम कैसे बदल सकता हूँ


18

मैं क्षेत्र का नाम टाइप करते हुए बाहर आया अब मशीन का नाम वह नहीं है जो मैं चाहता था कि यह हो। मुझे पता है कि यह सिर्फ एक झुंझलाहट है। लेकिन मैं सोच रहा हूँ कि क्या किसी तरह से किसी मशीन के नाम को बनाने के बाद उसे बदल दिया जाए।

मुझे लगता है कि यह मुझे मेरे प्रश्न के दूसरे भाग में ले जाता है। अगर मैंने एक फ़ील्ड बनाया है, और इसका उपयोग नहीं किया जा रहा है, तो मैं इसे हटाने के बारे में कैसे जाऊंगा, क्या यह डेटाबेस से किया जाना है, या यह यूआई में कहीं किया जा सकता है।

जवाबों:


15

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

मूल रूप से सभी प्रविष्टियों का नाम बदलना होगा field_configऔर field_config_instance, लेकिन जैसे ही आप फ़ील्ड का उपयोग करना शुरू करते हैं, मशीन के नाम सौ अलग-अलग जगहों पर संग्रहीत हो जाते हैं। व्यू कॉन्फिगर्स, पैनल्स कॉन्फिगर, फीचर्स और बहुत कुछ, और तब तक इसे बदलना मजेदार नहीं है।

हटाने वाले फ़ील्ड पर किया जा सकता है: admin/structure/types/manage/[machine_name_of_content_type]/fieldsजिसे आप किसी भी सामग्री प्रकार पर " फ़ील्ड प्रबंधित करें " टैब के माध्यम से पहुंचा सकते हैं ।


लेकिन अभी भी फ़ील्ड डेटाबेस में नहीं हैं, उदाहरण के लिए, मैंने पॉपर नाम के साथ एक नया फ़ील्ड बनाया है, हालाँकि जब मैं किसी सामग्री प्रकार में एक नया फ़ील्ड जोड़ने के लिए जाता हूं, तो पुराने फ़ील्ड नाम अभी भी एक विकल्प के रूप में प्रकट होता है। । शायद मैं समझ नहीं पा रहा हूँ कि खेतों में कैसे काम होता है।
user379468

1
एक कार्यक्षमता है कि मैंने बहुत जांच नहीं की है, जो समय के साथ खेतों और उनकी सामग्री को हटा देती है। इसका कारण यह है कि हजारों प्रविष्टियों वाली फ़ील्ड को हटाते समय कोई साइट रुक जाती है। यदि क्षेत्र का कहीं भी उपयोग नहीं किया जाता है, तो मैं उम्मीद करूंगा कि यह अगले क्रोन रन पर चले जाए।
लेटेरियन

मैंने साइट कोड और डेटाबेस डंप पर एक sed -i -es / old_field / new_field / करने की कोशिश की। दुर्भाग्य से, कुछ गलत हो गया और डंप बहाली साइट में खराबी थी। किसी भी विचार यह कैसे सही तरीके से करने के लिए?
बजे दिमित्री वायल

1
@ डमित्री व्याल: फ़ील्ड नाम को कुछ स्थानों पर क्रमबद्ध सरणी में संग्रहीत किया जाता है - एक स्ट्रिंग को एक अलग लंबाई के दूसरे स्ट्रिंग के साथ प्रतिस्थापित करने से सरणी का unserialize () टूट जाएगा और संभवतः अगले बूटस्ट्रैप या ड्रुपल को तोड़ देगा।
चार्ली श्लिसेर

@ शर्ली एस: धन्यवाद, भविष्य में इसका ध्यान रखेंगे।
दिमित्री व्याल

16

मेरी प्रक्रिया पहले फ़ील्ड को क्लोन करने के लिए ड्रश का उपयोग करना है, फिर डीबी प्रश्नों के साथ फ़ील्ड डेटा को नए फ़ील्ड टेबल में कॉपी करें। क्लोन किए गए फ़ील्ड की सामग्री को सत्यापित करने के बाद, मैं मूल फ़ील्ड हटा देता हूं।

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

  1. drush field-clone field_my_field field_my_field_clone
  2. field_my_field_cloneजैसे, पंक्तियाँ सम्मिलित करेंINSERT field_my_field_clone SELECT * FROM field_my_field;
  3. की सामग्री की जाँच करें field_my_field_clone
  4. UI का उपयोग करके फ़ील्ड हटाएं, जैसे, admin/structure/types/manage/my-content-type/fields

1
यह भी खूब रही! D7 के लिए: INSERT field_data_field_my_field_clone का चयन करें * फ़ील्ड_data_field_my_field से; INSERT field_revision_field_my_field_clone चुनें * फ़ील्ड_रेविजन_फ़ील्ड_मी_फ़ील्ड से;
joelpittet

मुझे नहीं पता था कि एक "ड्रश फील्ड-क्लोन" कमांड था! विस्मयकारी :)
लोवॉ

विचारों, पैनलों, आदि के बारे में क्या? मैनुअल फिक्स?
3

यदि आप ड्रश का उपयोग कर रहे हैं, तो आप इस क्षेत्र को भयावह रूप से हटा सकते हैं drush field-delete xxxऔर आप भी पसंद कर सकते हैं drush sql-query। @zkent, आपके पास मौजूदा दृश्य, पैनल, आदि में नया क्षेत्र relink होगा
xaa

10

Drupal 7 में, आप फ़ील्ड का नाम बदलें मॉड्यूल का उपयोग कर सकते हैं । Drupal 6 में, आप CCK फ़ील्ड का नाम बदलें मॉड्यूल का उपयोग कर सकते हैं ।



यह काम करता हैं। केवल नाम की लंबाई को अधिकतम रखने के लिए याद रखें।
फ्रांसिस्को कॉर्लेस मोरेल्स

6

मैंने एक अद्यतन स्क्रिप्ट लिखी है, जो वास्तव में नए मशीन नाम के साथ एक नया क्षेत्र और उदाहरण बनाता है, पुराने क्षेत्र के सभी डेटा को नए पर कॉपी करता है और पुराने उदाहरण को अंतिम रूप से हटाता है।

// Set variables
$old_name = 'field_old_name';
$new_name = 'field_new_name';
$entity_type = 'node';
$bundle = 'page';

// Get old field info
$old_field = field_info_field($old_name);

// Create new field
$new_field = $old_field;
$new_field['field_name'] = $new_name;

if (!field_info_field($new_name)) {
  field_create_field($new_field);
}
else {
  field_update_field($new_field);
}

// Get old field instance
$old_instance = field_info_instance($entity_type, $old_name, $bundle);
$new_instance = $old_instance;
$new_instance['field_name'] = $new_name;

if (!field_info_instance($entity_type, $new_name, $bundle)) {
  field_create_instance($new_instance);
}
else {
  field_update_instance($new_instance);
}

// Migrate old fields' data to the new ones
$field_data = db_select('field_data_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($data = $field_data->fetchAssoc()) {
  $data_new = array();
  foreach ($data as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $data_new[$column] = $value;
  }
  db_insert('field_data_' . $new_name)
    ->fields($data_new)
    ->execute();
}

// Migrate old fields' revision data to the new ones
$field_revision = db_select('field_revision_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($revision = $field_revision->fetchAssoc()) {
  $revision_new = array();
  foreach ($revision as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $revision_new[$column] = $value;
  }
  db_insert('field_revision_' . $new_name)
    ->fields($revision_new)
    ->execute();
}

// Delete old instance
field_delete_instance($old_instance);

// Purge fields
field_purge_batch(1000);

2

मुझे बस यही करना था, और पाया कि यह बहुत मुश्किल नहीं है, लेकिन मेरी साइट काफी सरल है।

इसे इस्तेमाल करे:

  1. उचित नाम के साथ एक नया फ़ील्ड बनाएं।
  2. इन प्रश्नों को MySQL में चलाएं:
INSERT INTO field_data_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_data_[OLD MACHINE NAME]` cf
INSERT INTO field_revision_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_revision_[OLD MACHINE NAME]` cf

([NEW MACHNIE NAME] और [OLD MACHINE NAME] के साथ स्वैप करें field_your_field_names)

  1. नए फ़ील्ड का उपयोग करने के लिए शामिल किसी भी दृश्य को अपडेट करें, और कोई भी अन्य मॉड्यूल जो उस विशिष्ट फ़ील्ड को इंगित करता है (यह वह जगह है जहां चीजें बदसूरत हो सकती हैं यदि आपकी साइट जटिल है)। आप अपने पुराने क्षेत्र का उपयोग करने वाले कोई भी दृश्य यहां देख सकते हैं:/admin/reports/fields/views-fields
  2. स्पष्ट साइट कैश

2

// फ़ील्ड स्टोरेज टेबल के नाम बदलें। यहां हम पुराने तालिका के नाम को नए नाम के साथ बदल रहे हैं।

db_rename_table($data_table_name, 'field_data_' . $new_field_name);
db_rename_table($revision_table_name, 'field_revision_' . $new_field_name);

// फ़ील्ड_ फ़ील्ड में फ़ील्ड नाम बदलें और फ़ील्ड_स्टेंस_कॉन्फ़िग टेबल।

db_update('field_config')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();

db_update('field_config_instance')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();

1

उपरोक्त फ़ील्ड-क्लोन उत्तर के साथ आप Drush के साथ अंतिम MySQL स्टेप भी कर सकते हैं (D7 उदाहरण):

drush sql-query "INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field"

drush sql-query "INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field"

0

यदि आप mysql में इधर-उधर नहीं फटकना चाहते हैं, तो आप एक ड्र्यू स्क्रिप्ट की कोशिश कर सकते हैं, जिसे मैंने फील्ड वैल्यू कॉपी कहा है।

आपको पहले अपना नया फ़ील्ड सेटअप करना होगा और फिर कॉल करना होगा

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

पुराने फ़ील्ड को हटाने के बाद यह मौजूदा डेटा को नए फ़ील्ड में ले जाएगा।



-3

अपने डेटाबेस की SQL फ़ाइल को निर्यात करें, sedशब्द की सभी घटनाओं को बदलने के लिए कमांड लाइन का उपयोग करें , और अपने डेटाबेस को फिर से आयात करें।


1
अपनी टिप्पणी को अस्वीकार कर दिया क्योंकि यह दृष्टिकोण आपके Drupal स्थापना पर कहर बरपाएगा क्योंकि डेटाबेस में कुछ स्थान हैं जहां क्षेत्र के नाम PHP क्रमबद्ध हैं। इसके बारे में अधिक जानकारी के लिए, उपरोक्त उत्तर के तहत @CharlieS (और अन्य) की टिप्पणियों को देखें।
hargobind
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.