2012-11-28 43 views
6

मैं अपने मॉड्यूल के भीतर प्रोग्रामेटिक रूप से एक कस्टम सामग्री प्रकार बनाने का तरीका सीखने की कोशिश कर रहा हूं।मॉड्यूल सामग्री प्रकार से संबंधित फ़ील्ड्स के निशान को कैसे निकालें?

हालांकि, मेरे मॉड्यूल को अनइंस्टॉल करने और पुनर्स्थापित करने के बाद मुझे एक त्रुटि हो रही थी जिसमें कहा गया था कि एक या अधिक फ़ील्ड जिन्हें मैं बनाने की कोशिश कर रहा था, इसलिए नहीं बनाया जा सका क्योंकि वे पहले से मौजूद हैं।

तो मैं अपने डेटाबेस के माध्यम से हैकिंग चला गया, सामग्री प्रकार और उससे संबंधित सभी तालिकाओं को हटा रहा था।

वही परिणाम - फ़ील्ड पहले से मौजूद है।

अगला मैं Drupal एपीआई वेबसाइट के पास गया क्षेत्रों और क्षेत्र उदाहरणों को नष्ट करने के तरीकों की तलाश है, और

field_delete_field() 

और

field_delete_instance() 

मैं हटाने का प्रयास करने के लिए एक php पेज बनाया भर में आया था फ़ील्ड जो मैंने बनाए थे, केवल एक त्रुटि प्राप्त करने के लिए कि जिस तालिका को मैं हटाने की कोशिश कर रहा था वह मौजूद नहीं है।

तो मैं थोड़ी फंस गया हूं - मैं खेतों को नहीं बना सकता क्योंकि वे पहले से मौजूद हैं, और मैं उन्हें हटा नहीं सकता क्योंकि वे मौजूद नहीं हैं!

बीटीडब्ल्यू कोड जो मैं अपने मॉड्यूल को मॉडलिंग कर रहा था वह ड्रूपल examples module के "node_example" खंड में पाया गया कोड है।

उत्तर

4

आउच, डेटाबेस तालिकाओं मैन्युअल को हटाने में एक अच्छा विचार नहीं है - Drupal कि क्षमा नहीं है :)

बस अपने सक्षम स्थापित/हुक में कोड को संबोधित में क्षेत्र निर्माण रैप करने के लिए:

if (!field_info_field('field_name')) { 
    field_create_field(... 
} 

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

वर्तमान समस्या का समाधान करने के लिए, इस प्रक्रिया का पालन करें:

  • पूरी तरह से स्थापना रद्द (सिर्फ अक्षम नहीं) अपने कस्टम मॉड्यूल। यदि यह एक असंगत स्थिति में है, तो बस system तालिका में अपनी पंक्ति हटाएं।
  • field_config और field_config_instance तालिकाओं से फ़ील्ड के सभी निशान हटाएं।
  • मैन्युअल रूप से सभी कैश तालिकाओं को मिटाएं (cache_ से शुरू होने वाली कोई भी तालिका)।
  • सख्ती से आवश्यक नहीं है, लेकिन किसी भी सुस्त सामग्री स्पष्ट:

    $nids = db_query('SELECT nid FROM {node} WHERE type = :type', array(':type' => 'type'))->fetchCol(); 
    node_delete_multiple($nids); 
    

कि यह करना चाहिए।

किसी भी समय आप यूआई के माध्यम से एक क्षेत्र, हटाने, या प्रोग्राम के लिए आप या तो रन क्रॉन करने की जरूरत है या करने के लिए field_purge_batch() फोन करता हूँ 'कठिन' क्षेत्रों को नष्ट के रूप में वे केवल पहले उदाहरण में हटाने के लिए चिह्नित कर रहे हैं।

+0

बहुत बहुत धन्यवाद! – Tyler