प्रपत्र परिवर्तन में नया और संपादन नोड बनाने के बीच अंतर


24

मेरे पास एक विशेष सामग्री प्रकार के लिए एक परिवर्तन अनुभाग है। फॉर्म में परिवर्तन करके मैं यह कैसे पता लगा सकता हूं कि यह नया फॉर्म है या फॉर्म को संपादित करें ?

परिवर्तन से dsm ($ फॉर्म) के साथ मैं उनके बीच कई अंतरों के साथ परिणाम प्राप्त कर सकता हूं। उन्हें एक दूसरे से अलग करने का सबसे अच्छा तरीका क्या है?

क्या यह एक अच्छा तरीका है?

    if(isset($form['nid']['#value']))
     'means in edit form'
    else 
     'means in create new from'

जवाबों:


61

यदि आप node_object_prepare () के कोड को देखते हैं , जिसे नोड_फॉर्म () (नोड संपादित / बनाने के लिए प्रपत्र बिल्डर ) से कहा जाता है , तो आप देखेंगे कि इसमें निम्न कोड शामिल हैं:

  // If this is a new node, fill in the default values.
  if (!isset($node->nid) || isset($node->is_new)) {
    foreach (array('status', 'promote', 'sticky') as $key) {
      // Multistep node forms might have filled in something already.
      if (!isset($node->$key)) {
        $node->$key = (int) in_array($key, $node_options);
      }
    }
    global $user;
    $node->uid = $user->uid;
    $node->created = REQUEST_TIME;
  }

Hook_form_BASE_FORM_ID_alter () के कार्यान्वयन में , यह निम्नलिखित के समान कोड का उपयोग करने के लिए पर्याप्त है।

function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form_state['node'];

  if (!isset($node->nid) || isset($node->is_new)) {
    // This is a new node.
  }
  else {
    // This is not a new node.
  }
}

यदि नोड नया है, तो प्रपत्र नोड बना रहा है; यदि नोड नया नहीं है, तो फ़ॉर्म मौजूदा नोड को संपादित कर रहा है।

Drupal 8 में, प्रत्येक वर्ग कार्यान्वयन EntityInterface(जिसमें Nodeकक्षा शामिल है ) EntityInterface::isNew()विधि को लागू करता है। यह जांचना कि क्या नोड नया है, कॉलिंग जितना आसान हो जाता है $node->isNew()। चूंकि Drupal 8 में $form_state['node']अब नहीं है, इसलिए कोड निम्नलिखित हो जाता है:

function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form_state->getFormObject()->getEntity();

  if ($node->isNew()) {
    // This is a new node.
  }
  else {
    // This is not a new node.
  }
}

दोनों स्थितियों की आवश्यकता क्यों है?
डिजिटोफर जूल 28'15

क्योंकि नया नोड के लिए नोड आईडी सेट करने वाला एक मॉड्यूल हो सकता है, मुझे लगता है।
kiamlaluno

यदि यह सेट है तो रिटर्न के !empty($node->is_new)रूप में उपयोग करना बेहतर है । isset($node->is_new)TRUEFALSE
ब्लके_जरो

@bloke_zero मैं ड्रुपल लेता हूं यह सेट होने की उम्मीद नहीं कर रहा है FALSE। वास्तव में, अगर कुछ खराब मॉड्यूल हैं जो इसे FALSEपरेशान करने के बजाय इसे सेट करते हैं, तो कोड को बदलने के लिए बेहतर है।
kiamlaluno


4
/**
 * Implementation of hook_form_alter().
 */
function MY_MODULE_form_alter(&$form, $form_state, $form_id) {
  if ($form['#node'] && $form['#node']->type .'_node_form' === $form_id) {
    // Is node form.

    if ($form['#node']->nid) {
      // Is node edit form.
    }
  }
}

1

में Drupal 8 आप की आवश्यकता होगी form_idचर और यह प्रत्येक मामले पर अलग होगा और यह शामिल होंगे _edit_उस में हम एक नोड संपादन कर रहे हैं, तो

function MODULENAME_form_alter(&$form, &$form_state, $form_id) { 
    if($form_id == '"node_article_edit_form"'){
        //edit form
    }
    if($form_id == 'node_article_form') {
        //create form
    }
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.