प्रोग्राम प्रकार से किसी सामग्री प्रकार को कैसे हटाएं?


12

मैंने प्रोग्रामेटिक रूप से एक मॉड्यूल इंस्टॉलेशन (फ़ील्ड स्टोरेज कॉन्फ़िगरेशन का उपयोग करके) के दौरान एक सामग्री प्रकार बनाया ।

मैं मॉड्यूल की स्थापना रद्द करते समय उस सामग्री प्रकार को हटाना चाहता हूं ।

क्या Drupal 8 के साथ ऐसा करने का कोई तरीका है?

जवाबों:


15

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

एक उदाहरण के लिए किताब मॉड्यूल में नोड। टाइप.बुक.लाइम देखें, यह प्रासंगिक हिस्सा है:

dependencies:
  enforced:
    module:
      - book

ध्यान दें कि उपयोगकर्ताओं को मॉड्यूल को अनइंस्टॉल करने से पहले उस प्रकार की सभी सामग्री को हटाना होगा।


9

यह मेरे लिए ऐसा लगता है।

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();

इसका एक सीएलआई एक-लाइनर जो उचित बचने के साथ Drupal Console का उपयोग करता है वह है:drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
komlenic

5

टिप्पणी करने के लिए पर्याप्त क्रेडिट नहीं है, मैं इसे यहां डालूंगा:

@Berdir, यह मुझे लगता है कि नोड में मॉड्यूल को लागू करना।

ध्यान दें कि उपयोगकर्ताओं को मॉड्यूल को अनइंस्टॉल करने से पहले उस प्रकार की सभी सामग्री को हटाना होगा

मेरे मामले में मॉड्यूल की स्थापना रद्द करते समय सामग्री-प्रकार हटा दिया जाता है। लेकिन कस्टम कंटेंट (नोड्स) को हटाना लागू नहीं है। इसे प्राप्त करने के लिए कस्टम मॉड्यूल को लागू करना चाहिए ModuleUninstallValidatorInterface

लागू होने पर कस्टम नोड्स को हटाए जाने से पहले कस्टम मॉड्यूल की स्थापना रद्द नहीं की जा सकती। सेलेक्ट बॉक्स डी-एक्टिवेट हो जाएगा।

मैं इंटरफ़ेस को लागू करने के बजाय नोड्स को हटाकर इसे गंदा कर रहा हूं hook_uninstall():

function MYMODULE_uninstall() {

  // Delete custom_type nodes when uninstalling.
  $query = \Drupal::entityQuery('node')
    ->condition('type', 'custom_type');
  $nids = $query->execute();
  // debug($nids);
  foreach ($nids as $nid) {
    \Drupal\node\Entity\Node::load($nid)->delete();
  }
}

3

एक मॉड्यूल की स्थापना पर कुछ कार्रवाई को ट्रिगर करने के लिए आपको hook_uninstallअपने मॉड्यूल की *.installफ़ाइल में लागू करना होगा । सामग्री प्रकार को हटाने से पहले आप यह सुनिश्चित करना चाहते हैं कि सामग्री प्रकार के सभी नोड्स को हटा दिया गया हो। अंत में, मॉड्यूल को अनइंस्टॉल करने के बाद और हटाए गए सामग्री प्रकार को अपडेट किए गए कॉन्फ़िगरेशन को निर्यात करना न भूलें।

/**
 * Place a short description here. 
 */
function MYMODULE_uninstall() {

  // Delete all nodes of given content type.
  $storage_handler = \Drupal::entityTypeManager()
    ->getStorage('node');
  $nodes = $storage_handler->loadByProperties(['type' => 'MACHINE_NAME_OF_TYPE']);
  $storage_handler->delete($nodes);

  // Delete content type.
  $content_type = \Drupal::entityTypeManager()
    ->getStorage('node_type')
    ->load('MACHINE_NAME_OF_TYPE');
  $content_type->delete();
}

क्या यह नोड-आईडी क्वेरी आधारित उत्तर करता है या नहीं , जैसे किसी bundleको भी हटा देगा ? मेरा मतलब है, कि यह कुछ महंगा लगता है (यदि बहुत सारे एनआईडी हैं) और मैं इस समाधान का उपयोग करना चाहूंगा जब संभव हो। MACHINE_NAME_OF_TYPE
टॉप-मास्टर

1
@ टॉप-मास्टर - मैंने अपना उत्तर अपडेट किया। पहले सभी नोड्स को हटाने के लिए इसे एक अतिरिक्त चरण की आवश्यकता है।
लेमनक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.